<html>

<head><script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
<!-- MyFirstUnitAd -->
<ins class="adsbygoogle"
     style="display:inline-block;width:970px;height:250px"
     data-ad-client="ca-pub-5778386704669218"
     data-ad-slot="1503492166"></ins>
<script>
(adsbygoogle = window.adsbygoogle || []).push({});
</script>

<meta http-equiv="Content-Language" content="zh-cn">
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<meta name="GENERATOR" content="Microsoft FrontPage 5.0">
<meta name="ProgId" content="FrontPage.Editor.Document">
<title>CFGReader</title>
</head>

<body>



<p align="left"><font size="6" color="#FF0000"><span lang="en-ca"><b>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </b></span>
<b>Console display <span lang="en-ca">board</span>(improved)</b></font></p>

<div align="left">
  <pre><b><font color="#ff0000" size="5">A. Nth Edition</font></b></pre>
</div>
<div align="left">
  <pre><b>These classes are all base classes for console displays<span lang="en-ca"> and on this edition I finished a board class</span>.</b></pre>
</div>
<div align="left">
  <pre><b><font color="#ff0000" size="5"><span lang="en-ca">B</span>.<span lang="en-ca"><a name="problem"></a>The problem</span></font></b></pre>
</div>
<div align="left">
  <pre><b>How to display in console without using iostream class?</b></pre>
</div>
<div align="left">
  <b><font color="#ff0000" size="5"><span lang="en-ca"><a name="explain"></a>C</span>.<span lang="en-ca">The
  </span></font></b><span lang="en-ca"><font size="5" color="#FF0000"><b>idea of 
  program</b></font></span></div>
<div align="left">
  　</div>
<div align="left">
  <pre><b>These classes are for our comp354 project which is going to make a little game like cross word.</b></pre>
</div>
<div align="left">
  <pre><b><font color="#ff0000" size="5">D.<span lang="en-ca"><a name="Method"></a>The </span>major functions</font></b></pre>
</div>
<div align="left">
  <pre><b><font color="#ff0000" size="5"><span lang="en-ca">E</span>.</font></b><span lang="en-ca"><font size="5" color="#FF0000"><b>Further improvement</b></font></span></pre>
</div>
<div align="left">
  <pre><b><font color="#ff0000" size="5"><span lang="en-ca">F</span>.</font></b><span lang="en-ca"><font size="5" color="#FF0000"><b>File listing</b></font></span></pre>
</div>
<div align="left">
  <pre><font size="3"><b>1<span lang="en-ca">. </span>tile<span lang="en-ca">.</span>h</b></font></pre>
</div>
<div align="left">
  <pre><font size="3"><b>2<span lang="en-ca">. </span>tile.cpp</b></font></pre>
</div>
<div align="left">
  <pre><font size="3"><b>3<span lang="en-ca">. </span>tiles.h</b></font></pre>
</div>
<div align="left">
  <pre><font size="3"><b>4. tiles.cpp</b></font></pre>
</div>
<div align="left">
  <pre><font size="3"><b>5. token.h</b></font></pre>
</div>
<div align="left">
  <pre><font size="3"><b>6. token.cpp</b></font></pre>
</div>
<div align="left">
  <pre><font size="3"><b>7. tokens.h</b></font></pre>
</div>
<div align="left">
  <pre><font size="3"><b>8. tokens.cpp</b></font></pre>
</div>
<div align="left">
  <pre><font size="3"><b>9. RoverType.h</b></font></pre>
</div>
<div align="left">
  <pre><span lang="en-ca"><font size="3"><b>10. board.h</b></font></span></pre>
</div>
<div align="left">
  <pre><span lang="en-ca"><font size="3"><b>11. board.cpp</b></font></span></pre>
</div>
<div align="left">
  <pre><span lang="en-ca"><font size="3"><b>12. cell.h</b></font></span></pre>
</div>
<div align="left">
  <pre><span lang="en-ca"><font size="3"><b>13. cell.cpp</b></font></span></pre>
</div>
<div align="left">
  <pre><span lang="en-ca"><font size="3"><b>14. block.h</b></font></span></pre>
</div>
<div align="left">
  <pre><span lang="en-ca"><font size="3"><b>15. block.cpp</b></font></span></pre>
</div>
<div align="left">
  <pre><font size="3"><b>16. bag.h</b></font></pre>
</div>
<div align="left">
  <pre><font size="3"><b>17. bag.cpp</b></font></pre>
</div>
<div align="left">
  <pre><font size="3"><b>18. deck.h</b></font></pre>
</div>
<div align="left">
  <pre><font size="3"><b>19. deck.cpp</b></font></pre>
</div>
<div align="left">
  <pre><font size="3"><b>20. rack.h</b></font></pre>
</div>
<div align="left">
  <pre><font size="3"><b>21. rack.cpp</b></font></pre>
</div>
<div align="left">
  <pre><font size="3"><b>22. background.h</b></font></pre>
</div>
<div align="left">
  <pre><font size="3"><b>23. background.cpp</b></font></pre>
</div>
<div align="left">
  <pre><font size="3"><b>24. dictionary.h</b></font></pre>
</div>
<div align="left">
  <pre><font size="3"><b>25. dictionary.cpp</b></font></pre>
</div>
<div align="left">
  <pre><font size="3"><b>26. frame.h</b></font></pre>
</div>
<div align="left">
  <pre><font size="3"><b>27. frame.cpp</b></font></pre>
</div>
<div align="left">
  <pre><font size="3"><b>28. message.h</b></font></pre>
</div>
<div align="left">
  <pre><font size="3"><b>29. message.cpp</b></font></pre>
</div>
<div align="left">
  <pre><font size="3"><b>30. menu.h</b></font></pre>
</div>
<div align="left">
  <pre><font size="3"><b>31. menu.cpp</b></font></pre>
</div>
<div align="left">
  <pre><font size="3"><b>32. listener.h</b></font></pre>
</div>
<div align="left">
  <pre><font size="3"><b>33. listener.cpp</b></font></pre>
</div>
<div align="left">
  <pre><font size="3"><b>34. control.h</b></font></pre>
</div>
<div align="left">
  <pre><font size="3"><b>35. control.cpp</b></font></pre>
</div>
<div align="left">
  <pre><font size="3"><b>36. rummy.h</b></font></pre>
</div>
<div align="left">
  <pre><font size="3"><b>37. rummy.cpp</b></font></pre>
</div>
<div align="left">
  <pre><font size="3"><b>38. player.h</b></font></pre>
</div>
<div align="left">
  <pre><font size="3"><b>39. player.cpp</b></font></pre>
</div>
<div align="left">
  <pre><font size="3"><b>40. logo.h</b></font></pre>
</div>
<div align="left">
  <pre><font size="3"><b>41. logo.cpp</b></font></pre>
</div>
<div align="left">
  <pre><font size="3"><b>42. scoreboard.h</b></font></pre>
</div>
<div align="left">
  <pre><font size="3"><b>43. scoreboard.cpp</b></font></pre>
</div>
<div align="left">
  <pre><font size="3"><b>44. <span lang="en-ca">main.cpp (main)</span></b></font></pre>
</div>
<p>　</p>
<p><span lang="en-ca"><font size="3" color="#FF0000"><b>file name: </span>tile<span lang="en-ca">.h</span></b></font></p>
<pre>#ifndef TILE_H
#define TILE_H

#include &quot;RoverType.h&quot;

class CTile
{
protected:
	char ch;
	WORD ftColor;
	WORD bkColor;
public:
	void display(int x, int y);
	void setFontColor(WORD theColor){ftColor=theColor;}
	void setBKGroundColor(WORD theColor){ bkColor=theColor;}
	void setValue(char myCh) { ch=myCh;}
	char getValue(){ return ch;}
	CTile(char myCh=DefaultCharacter);
};

#endif</pre>
<p><font size="3" color="#FF0000"><b><span lang="en-ca">file name: </span>tile<span lang="en-ca">.</span></b></font><font color="#FF0000"><b>cpp</b></font></p>
<pre>#include &quot;Tile.h&quot;

HANDLE hOutPut=0;

CTile::CTile(char myCh)
{
	ftColor=DefaultFontColor;
	bkColor=DefaultBKGroundColor;
	setValue(myCh);
	if (hOutPut==0)
	{
		hOutPut=GetStdHandle(STD_OUTPUT_HANDLE);
	}
}

void CTile::display(int x, int y)
{
	COORD coord;
	coord.X=x;
	coord.Y=y;
	FillConsoleOutputAttribute(hOutPut, ftColor|bkColor, 1, coord, NULL);
	FillConsoleOutputCharacter(hOutPut, ch, 1, coord, NULL);
}

</pre>
<pre>
</pre>
<pre><font size="3" color="#FF0000"><b><span lang="en-ca">file name: </span>tiles.h</b></font></pre>
<pre>#ifndef TILES_H
#define TILES_H

#include &quot;tile.h&quot;

class CTiles
{
private:
	CTile* tiles;
	int len;
	WORD ftColor;
	WORD bkColor;
	bool isVertical;
	void initialize();	
public:
	CTiles(const char* str);
	CTiles();
	virtual	~CTiles();
	void setDirection(bool beVertical){ isVertical=beVertical;}
	CTile&amp; operator[](int index){return tiles[index];}
	void setFontColor(WORD theColor){ftColor=theColor;}
	void setBKGroundColor(WORD theColor){bkColor=theColor;}
	int getLength(){return len;}
	void display(int x, int y);
	void setValue(const char* str);
	void setLength(int size);
	void setNumber(int num);
	int getNumber();
};

#endif</pre>
<pre>　</pre>
<pre>　</pre>
<pre><font size="3" color="#FF0000"><b><span lang="en-ca">file name: </span>tiles.cpp</b></font></pre>
<pre>#include &quot;tiles.h&quot;


int CTiles::getNumber()
{
	int total=0;
	int index=0, temp;
	while (index&lt;len)
	{
		temp=tiles[index].getValue();
		if (temp&gt;'9'||temp&lt;'0')
		{
			break;
		}
		total=total*10+temp-'0';
		index++;
	}
	return total;
}



CTiles::CTiles()
{
	initialize();
}

void CTiles::initialize()
{
	len=0;
	tiles=NULL;
	isVertical=false;
	ftColor=DefaultFontColor;
	bkColor=DefaultBKGroundColor;
}

void CTiles::setNumber(int num)
{
	char buffer[10];
	itoa(num, buffer, 10);
	setValue(buffer);
}


CTiles::~CTiles()
{
	delete[]tiles;
}

void CTiles::setValue(const char* str)
{	
	//len=;
	setLength(strlen(str));
	for (int i=0; i&lt;len; i++)
	{
		tiles[i].setValue(str[i]);
	}
}

CTiles::CTiles(const char* str)
{
	initialize();
	setValue(str);
}


void CTiles::display(int x, int y)
{
	for (int i=0; i&lt;len; i++)
	{
		tiles[i].setFontColor(ftColor);
		tiles[i].setBKGroundColor(bkColor);
		if (!isVertical)
		{
			tiles[i].display(x+i, y);
		}
		else
		{
			tiles[i].display(x, y+i);
		}
	}
}

void CTiles::setLength(int size)
{
	if (len!=size)
	{
		len=size;
		delete[]tiles;
		tiles=new CTile[len] ;
	}
}</pre>
<pre>　</pre>
<pre><font size="3" color="#FF0000"><b><span lang="en-ca">file name: </span>token.</b></font><span lang="en-ca"><font size="3" color="#FF0000"><b>h</b></font></span></pre>
<pre>#ifndef TOKEN_H
#define TOKEN_H

#include &quot;block.h&quot;


class CToken : public CBlock
{
protected:

public:	
	CToken(int num);
	CToken(char ch=DefaultCharacter);
	CToken&amp; operator=(const CToken&amp; theToken);
	int getNumber();
	void setNumber(int num);	
	void setSuit(int theSuit);
	int getSuit();
};

class CCardBack: public CToken
{
public:
	CCardBack();
};

#endif</pre>
<pre>　</pre>
<pre>　</pre>
<pre><font size="3" color="#FF0000"><b><span lang="en-ca">file name: </span>token.cpp</b></font></pre>
<pre>#include &quot;token.h&quot;
#include &quot;tile.h&quot;

CToken&amp; CToken::operator =(const CToken&amp; theToken)
{	
	for (int i=0; i&lt;3; i++)
	{
		for (int j=0; j&lt;3; j++)
		{
			block[i][j].setValue(theToken.block[i][j].getValue());
		}
	}
	return *this;
}

void CToken::setSuit(int theSuit)
{
	block[0][0].setValue(theSuit);
	block[2][2].setValue(theSuit);
}

CToken::CToken(char ch):CBlock(3)
{
	block[1][1].setValue(ch);	
}

int CToken::getNumber()
{
	if (block[1][0].getValue()!=0)
	{
		return (block[1][0].getValue()-'0')*10+block[1][1].getValue()-'0';
	}
	if (block[1][1].getValue()&gt;'9')
	{
		switch(block[1][1].getValue())
		{
			case 'J': return 11;
			case 'Q': return 12;
			case 'K': return 13;
			case 'A': return 14;
		}
	}
	return block[1][1].getValue()-'0';
}

void CToken::setNumber(int num)
{
	//in no condition, this would happen
	block[1][0].setValue(0);
	block[1][1].setValue(0);
	block[1][2].setValue(0);
	if (num&gt;999)
	{
		return ;
	}
	if (num&gt;99)
	{
		block[1][0].setValue(num/100+'0');
		block[1][1].setValue((num%100)/10+'0');
		block[1][2].setValue((num%100)%10 + '0');
	}
	else
	{
		if (num&gt;9)
		{
			block[1][0].setValue(num/10+'0');
			block[1][1].setValue(num%10+'0');
		}
		else
		{
			block[1][1].setValue(num+'0');
		}
	}
}

CToken::CToken(int num)
{
	initialize();
	setNumber(num);
}

int CToken::getSuit()
{
	return block[0][0].getValue();
}

CCardBack::CCardBack()
{
	block[0][0].setValue(Club);
	block[0][2].setValue(Diamond);
	block[2][0].setValue(Heart);
	block[2][2].setValue(Spade);
	for (int i=0; i&lt;3; i++)
	{
		for (int j=0; j&lt;3; j++)
		{
			block[i][j].setBKGroundColor(DefaultCardBackBKGroundColor);
			block[i][j].setFontColor(DefaultCardBackFontColor);
		}
	}
}
</pre>
<pre>　</pre>
<pre><font size="3" color="#FF0000"><b><span lang="en-ca">file name: </span>tokens.h</b></font></pre>
<pre>#ifndef TOKENS_H
#define TOKENS_H

#include &quot;token.h&quot;


class CTokens
{
protected:
	CToken* tokens;
	int len;
	int pos;
	WORD ftColor;
	WORD bkColor;
	WORD frColor;
	bool isVertical;//default is false
	void initialize();	
	bool pushToken(const CToken&amp; token);
	bool popToken(CToken&amp; token);
public:
	CTokens(int theLen=DefaultTokenLength);
	CTokens(const char* str);
	CToken&amp; operator[](unsigned short index){ return tokens[index];}
	void setDirection(bool beVertical){isVertical=beVertical;}
	void setLength(int size);
	void setValue(const char* str);
	void setFontColor(WORD theColor);
	void setBKGroundColor(WORD theColor);
	void setFrameColor(WORD theColor);
	virtual ~CTokens();
	void display(int x, int y);
	//initialize the position of starting stack pos
	void setStackPos(int startPos=0){ pos=startPos;}
	void shuffle();
};

#endif</pre>
<pre>　</pre>
<pre><font size="3" color="#FF0000"><b><span lang="en-ca">file name: </span>tokens.cpp</b></font></pre>
<pre>#include &quot;tokens.h&quot;


void CTokens::shuffle()
{
	for (int num=0; num&lt;6; num++)//shuffle number
	{
		for (int i=0; i&lt;len-1; i++)
		{
			int j=0;
			while (j&lt;=i)
			{
				j=rand()%len;
			}
			CToken temp;
			temp=tokens[i];
			tokens[i]=tokens[j];
			tokens[j]=temp;
		}
	}
}

CTokens::CTokens(int theLen)
{
	initialize();
	setLength(theLen);
}

CTokens::CTokens(const char* str)
{
	initialize();
	setValue(str);
}

bool CTokens::popToken(CToken&amp; token)
{
	if (pos!=0)
	{
		token= tokens[--pos];
		return true;
	}
	else
	{
		return false;
	}
}

bool CTokens::pushToken(const CToken&amp; token)
{
	if (pos+1&lt;len)
	{
		tokens[pos++]=token;
		return true;
	}
	else
	{
		return false;
	}
}

void CTokens::initialize()
{
	len=0;
	tokens=NULL;
	isVertical=false;
	ftColor=DefaultFontColor;
	bkColor=DefaultBKGroundColor;
	frColor=DefaultFrameColor;
	pos=0;
}

void CTokens::setBKGroundColor(WORD theColor)
{
	for (int i=0; i&lt;len; i++)
	{
		tokens[i].setBKGroundColor(theColor);
	}
}

void CTokens::setFontColor(WORD theColor)
{
	for (int i=0; i&lt;len; i++)
	{
		tokens[i].setFontColor(theColor);
	}
}

void CTokens::setFrameColor(WORD theColor)
{
	for (int i=0; i&lt;len; i++)
	{
		tokens[i].setFrameColor(theColor);
	}
}

void CTokens::setLength(int size)
{
	if (len!=size)
	{
		delete []tokens;
		len=size;
		tokens=new CToken[len];
	}
}


void CTokens::setValue(const char* str)
{
	setLength(strlen(str));
	for (int i=0; i&lt;len; i++)
	{
		tokens[i].setValue(str[i]);
	}
}

void CTokens::display(int x, int y)
{
	for (int i=0; i&lt;len; i++)
	{
		if (!isVertical)
		{
			if (x&gt;DefaultScreenWidth-5)
			{
				y+=4;
				x=0;
			}
			tokens[i].display(x, y);
			x+=4;
		}
		else
		{
			if (y&gt;DefaultScreenHeight-5)
			{
				x+=4;
				y=0;
			}
			tokens[i].display(x, y);
			y+=4;
		}
	}
}

CTokens::~CTokens()
{
	delete [] tokens;	
}</pre>
<pre>　</pre>
<pre><font size="3" color="#FF0000"><b><span lang="en-ca">file name: </span>RoverType.h</b></font></pre>
<pre>#include &lt;windows.h&gt;

/*****************************nick****************************/

extern HANDLE hOutPut;


//the font color
#define  FTBLUE        FOREGROUND_BLUE 
#define	 FTGREEN       FOREGROUND_GREEN 
#define	 FTRED         FOREGROUND_RED 
#define	 FTPURPLE      FOREGROUND_BLUE|FOREGROUND_RED
#define	 FTGREY        FOREGROUND_BLUE|FOREGROUND_GREEN
#define	 FTBROWN	   FOREGROUND_RED|FOREGROUND_GREEN
#define	 FTWHITE       FOREGROUND_BLUE|FOREGROUND_GREEN|FOREGROUND_RED
#define	 FTINTENSITY   FOREGROUND_INTENSITY

//the background color
#define	 BKBLUE        BACKGROUND_BLUE 
#define  BKGREEN       BACKGROUND_GREEN 
#define	 BKRED         BACKGROUND_RED 
#define	 BKPURPLE      BACKGROUND_BLUE|BACKGROUND_RED
#define	 BKGREY        BACKGROUND_BLUE|BACKGROUND_GREEN
#define	 BKBROWN	   BACKGROUND_RED|BACKGROUND_GREEN
#define	 BKWHITE       BACKGROUND_BLUE|BACKGROUND_GREEN|BACKGROUND_RED
#define	 BKINTENSITY   BACKGROUND_INTENSITY

#define DefaultFontColor           FTRED
#define DefaultBKGroundColor       BKWHITE
#define DefaultFrameColor          BKGREY
#define DefaultIndexFontColor      FTWHITE
#define DefaultIndexBKGroundColor  BKBLUE
#define DefaultIndexFrameColor     BKBLUE
#define DefaultHighLightFont	   FTINTENSITY

//board
#define DefaultBoardSize		   15
#define MaxBoardSize			   20
#define DefaultBoard_x             2
#define DefaultBoard_y             2

#define DefaultCharacter           0
#define DefaultTokenLength         7
#define MinimumLengthOfWord		   2
#define MaxInputBufferLength	   20

//background
#define DefaultScreenBKColor    BKGREEN
#define DefaultScreenFTColor    FTWHITE

#define DefaultScreenWidth        120
#define DefaultScreenHeight       60

//inputArea
#define DefaultInputArea_x        60
#define DefaultInputArea_y        30
#define DefaultInputAreaHeight    5
#define DefaultInputAreaWidth     10
#define DefaultInputAreaBKColor   BKBLUE 
#define DefaultInputAreaFTColor   FTWHITE


#define LetterCount               26
#define MaxLengthOfWord			  20
#define DefaultInputPositionRow   30
#define DefaultInputPositionCol   30

//rack
#define DefaultSelectedBKGColor   BKINTENSITY
#define DefaultSelectedFontColor  FTBROWN

#define DefaultLetterRack_x             45
#define DefaultLetterRack_y             15
#define DefaultCardRack_x               45
#define DefaultCardRack_y               20


//card back color
#define DefaultCardBackBKGroundColor BKBROWN
#define DefaultCardBackFontColor     FTBLUE

//bag
#define BagTokenNumber    0
#define BagTokenPoints    1
#define DefaultNumberOfToken   100
#define DefaultBlankTokenValue  255
#define DefaultBlandTokenIndex  26

//coord of bag
#define DefaultBag_x      50
#define DefaultBag_y      35

//deck
#define DefaultPlayedDeck_x   50
#define DefaultPlayedDeck_y   25
#define DefaultPlayingDeck_x  55
#define DefaultPlayingDeck_y  30

/*
enum Suit
{Club=5, Diamond=4, Heart=3, Spade=6};
*/
#define Club           5
#define Diamond        4
#define Heart          3
#define Spade          6

//menu index
//Menu starts from 1 	
#define  WAITINGMENUCHOICE  0						
#define 	PICKCARD        1 
#define 	SELECTCARD     2
#define		SELECTLETTER   3 
#define 	TRADE		    4     
#define 	DISCARD         5  
#define 	FORMWORD	    6  
#define 	CANCEL		    7   
#define 	ENDROUND	   8 
#define 	QUIT		    9     

//message						
#define   INPUTPLACEWORDINFO  10
#define   INVALIDCARDSTRADING 11
#define   INPUTEXCHANGELETTER 12
#define  CANNOTEXCHANGELETTER 13
#define  INPUTDIRECTION       14
#define  INPUTROW             15
#define  INPUTCOL	           16
#define  INVALIDINDEXENTERED   17
#define  INVALIDWORDFORMED     18
#define  UNABLEPLACEWORD       19
#define  PLAYERALREADYPICKED   20
#define  PLAYERALREADYFORMED   21
#define  PLAYERALREADYTRADED   22
#define  INVALIDDICTIONARYFILENAME  23
#define  TRYUSEDEFAULTFILENAME  24
#define  INVALIDROWCOLNUMBER    25
#define  INPUTPLAYERNAME        26
#define  PRESSANYKEYTOSTART     27
//logo 
#define DefaultLogo_x   10
#define DefaultLogo_y   10


//menu
#define  DefaultMenu_x  0
#define  DefaultMenu_y  MaxHeightScreen-2
#define DefaultMenuFontColor       FTGREY
#define DefaultMenuBKGroundColor   BKWHITE
#define DefaultMenuSelectedBKGroundColor BKRED

//frame
#define DefaultFrameBKColor    BKBLUE
#define DefaultFrameFTColor     FTPURPLE
#define DefaultFrameChar       '*'


/****************************nick*****************************/

//***********************David Start***********************
#define MaxLengthScreen  80//160
#define MaxHeightScreen  40//81

#define CountOfButtons   18
#define MenuSpace         4


//***********************David End*************************

//***********************Charles Start*********************
#define DefaultScoreBoard_X   40
#define DefaultScoreBoard_Y    5
#define DefaultScoreBoardWidth 10
#define DefaultSelectedPlayerBKColor BKPURPLE

//#define PlayerMaxWidth 10
//#define PlayerMaxLength 6
//#define BackgroundArea &quot;          &quot;
//#define FrameArea &quot;                       &quot;

//***********************Charles End***********************</pre>
<pre></pre>
<pre><font size="3" color="#FF0000"><b><span lang="en-ca">file name: board.h</span></b></font></pre>
<pre>#ifndef BOARD_H
#define BOARD_H

#include &quot;cell.h&quot;

class CBoard
{
private:
	int curRow, curCol;
	int headRow, headCol;
	int exchRow, exchCol;
	bool isVer;
	bool isFirst;
	char buffer[MaxBoardSize];
	bool doFindStr(int&amp; exchangedIndex);
	void setStartPoint();
	void getFirstStr(int&amp; exchangedIndex);

	int findHead(int startRow, int startCol, bool isVertical);
	int score;
protected:
	CCell** board;
	int boardWidth;
	void initialize(int size);
public:
	CBoard(int size=DefaultBoardSize);
	void setSize(int size);
	void display(int x, int y);
	char getValue(int r, int c);
	void setValue(int r, int c, char ch);
	void setValue(char** matrix);
	bool placeWord(int r, int c, const char* str, bool isVertical, int index);
	void update(bool rollBack=false);
	void show();
	char* getNextStr(int&amp; exchangedIndex);
	char* verifyStr(int&amp; exchangedIndex);
};

#endif</pre>
<pre>　</pre>
<pre><font size="3" color="#FF0000"><b><span lang="en-ca">file name: board.cpp</span></b></font></pre>
<pre>#include &quot;board.h&quot;

void CBoard::initialize(int size)
{
	boardWidth=0;
	board=NULL;
	isFirst=true;
	setSize(size);
	for (int i=0; i&lt;=size; i++)
	{
		for (int j=0; j&lt;=size; j++)
		{
			if (i==0||j==0)
			{
				board[i][j].setBKGAll(DefaultIndexFontColor, DefaultIndexBKGroundColor);
								
				if (i!=0)
				{
					board[i][j].setNumber(i-1, false);
				}
				if (j!=0)
				{
					board[i][j].setNumber(j-1, true);
				}
			}
		}
	}
}

void CBoard::setValue(char** matrix)
{
	for (int i=1; i&lt;=boardWidth; i++)
	{
		for (int j=1; j&lt;=boardWidth; j++)
		{
			board[i][j].setValue(matrix[i-1][j-1]);
		}
	}
}

void CBoard::setSize(int size)
{
	if (boardWidth!=size)
	{
		if (board!=NULL)
		{
			for (int i=0; i&lt;=boardWidth; i++)
			{
				delete []board[i];			
			}
		}
		delete[] board;
		boardWidth=size;
		board=new CCell*[size+1];
		for (int i=0; i&lt;=size; i++)
		{			
			board[i]=new CCell[size+1];
		}		
	}
}
		
void CBoard::show()
{
	display(DefaultBoard_x, DefaultBoard_y);
}

CBoard::CBoard(int size)
{
	initialize(size);	
}

void CBoard::setValue(int r, int c, char ch)
{
	board[r+1][c+1].setValue(ch);
}

char CBoard::getValue(int r, int c)
{
	return board[r+1][c+1].getValue();
}

void CBoard::display(int x, int y)
{	
	for (int i=0; i&lt;=boardWidth; i++)
	{
		for (int j=0; j&lt;=boardWidth; j++)
		{
			board[i][j].display(x+2*j, y+i*2);
		}

	}
}

void CBoard::update(bool rollBack)
{
	int row=curRow, col=curCol;
	while (board[row][col].getValue()!=0)
	{
		if (rollBack)
		{
			if (!board[row][col].getStatus())
			{				
				board[row][col].setValue(DefaultCharacter);
			}
		}	
		board[row][col].setFontColor(DefaultFontColor);
		board[row][col].setStatus(true);
		if (isVer)
		{
			row++;
		}
		else
		{
			col++;
		}
		if (row&gt;boardWidth||col&gt;boardWidth)
		{
			break;
		}
	}
}

void CBoard::setStartPoint()
{
	headRow=curRow;
	headCol=curCol;
	if (isVer)
	{
		headRow=findHead(headRow, headCol, isVer);
	}
	else
	{
		headCol=findHead(headRow, headCol, isVer);
	}	
}

char* CBoard::verifyStr(int&amp; exchangedIndex)
{
	setStartPoint();
	getFirstStr(exchangedIndex);
	isFirst=true;//set back!!!
	return buffer;
}


void CBoard::getFirstStr(int&amp; exchangedIndex)
{
	int row=headRow, col=headCol, pos=0;
	while (board[row][col].getValue()!=0) 
	{
		buffer[pos]=board[row][col].getValue();
		if (exchRow==row&amp;&amp;exchCol==col)
		{
			exchangedIndex=pos;
		}
		pos++;
		if (isVer)
		{
			row++;
		}
		else
		{
			col++;
		}
		if (row==boardWidth||col==boardWidth)
		{
			break;
		}
	}
	buffer[pos]='\0';
}

char* CBoard::getNextStr(int&amp; exchangedIndex)
{	
	if (isFirst)
	{
		setStartPoint();
		isFirst=false;
		getFirstStr(exchangedIndex);
		return buffer;//the original one will always return
	}
	if (doFindStr(exchangedIndex))
	{
		return buffer;
	}
	else
	{
		return NULL;
	}
}

bool CBoard::doFindStr(int&amp; exchangedIndex)
{
	int row=headRow, col=headCol, pos=0;
	if (headRow&gt;boardWidth||headCol&gt;boardWidth)
	{
		return false;
	}
	if (board[row][col].getValue()==0)
	{
		return false;
	}
	if (isVer)
	{
		//skip the old word placed by others
		if (board[row][col].getStatus())
		{
			headRow++;
			return doFindStr(exchangedIndex);
		}
		col=findHead(row, col, !isVer);//the crossing direction
		do//the boardWidth is one more than the real size 
		{
			buffer[pos]=board[row][col].getValue();
			if (row==exchRow&amp;&amp;col==exchCol)
			{
				exchangedIndex=pos;
			}
			col++;
			pos++;
			if (col&gt;boardWidth)
			{
				break;
			}
		} while (board[row][col].getValue()!=0);
		buffer[pos]='\0';
		headRow++;
		if (pos&gt;MinimumLengthOfWord)
		{
			return true;
		}
		else
		{			
			return doFindStr(exchangedIndex);
		}
	}
	else
	{
		if (board[row][col].getStatus())
		{
			headCol++;
			return doFindStr(exchangedIndex);
		}
		row=findHead(row, col, !isVer);
		do
		{
			buffer[pos]=board[row][col].getValue();
			if (row==exchRow&amp;&amp;col==exchCol)
			{
				//find the index of exchanged letter
				exchangedIndex=pos;
			}
			row++;
			pos++;
			if (row&gt;boardWidth)
			{
				break;
			}
		}while (board[row][col].getValue()!=0);
		buffer[pos]='\0';
		headCol++;
		if (pos&gt;MinimumLengthOfWord)
		{
			return true;
		}
		else
		{			
			return doFindStr(exchangedIndex);
		}
	}
}

//to do
int CBoard::findHead(int startRow, int startCol, bool isVertical)
{
	if (isVertical)
	{
		while (startRow&gt;0) //because the coord is starting from 1
		{
			if (board[startRow][startCol].getValue()==0)
			{
				break;
			}
			startRow--;
		}
		return startRow+1;
	}
	else
	{
		while (startCol&gt;0)
		{
			if (board[startRow][startCol].getValue()==0)
			{
				break;
			}
			startCol--;
		}
		return startCol+1;
	} 
}



bool CBoard::placeWord(int r, int c, const char* str, bool isVertical, int index)
{
	int row=r+1, col=c+1, pos=0;
	curRow=row;
	curCol=col;
	isVer=isVertical;
	if (index!=-1)//do have a special exchanged letter!
	{
		exchRow=curRow;
		exchCol=curCol;
		isVertical?exchRow+=index:exchCol+=index;//the coord of exchanged letter
	}
	else
	{
		exchRow=exchCol=-1;//this ensures no coord will match
	}
	while (str[pos]!='\0')
	{
		if (board[row][col].getValue()==0)
		{
			board[row][col].setValue(str[pos]);
			board[row][col].setFontColor(DefaultHighLightFont);
			board[row][col].setStatus(false);
			pos++;
		}
		else
		{
			//the starting position cannot be occupied
			if (pos==0)
			{
				return false;
			}
			if (pos&lt;=index)//if index==-1 never execute here
			{
				//update new exchanged letter coord
				isVertical?exchRow++:exchCol++;
			}
		}
		if (isVertical)
		{
			row++;
		}
		else
		{
			col++;
		}
		if (row&gt;boardWidth||col&gt;boardWidth)//the bound is boardWidth
		{			
			return str[pos]=='\0';
		}
	}
	return true;
}


		

</pre>
<pre><font size="3" color="#FF0000"><b><span lang="en-ca">file name: cell.h</span></b></font></pre>
<pre>#ifndef CELL_H
#define CELL_H

#include &quot;block.h&quot;

//this class is specially used by CBoard
class CCell: public CBlock
{
protected:
	bool isOld;
public:
	CCell();
	void setStatus(bool beOld);
	bool getStatus();
	void setNumber(int num, bool atBottom);//special for index bar
	void setBKGAll(WORD theFont, WORD theBKG);
};

#endif</pre>
<pre><font size="3" color="#FF0000"><b><span lang="en-ca">file name: cell.cpp</span></b></font></pre>
<pre>#include &quot;cell.h&quot;

CCell::CCell():CBlock(1)
{
	isOld=true;
}

void CCell::setStatus(bool beOld)
{
	isOld=beOld;
}

bool CCell::getStatus()
{
	return isOld;
}

void CCell::setNumber(int num, bool atBottom)
{
	int row=0;
	if (atBottom)
	{
		row=1;
	}
	if (num&gt;9)
	{
		block[row][0].setValue(num/10+'0');
		block[row][1].setValue(num%10+'0');
	}
	else
	{
		block[row][1].setValue(num+'0');
	}
}

void CCell::setBKGAll(WORD theFont, WORD theBKG)
{
	for (int i=0; i&lt;2; i++)
	{
		for (int j=0; j&lt;2; j++)
		{
			block[i][j].setBKGroundColor(theBKG);
			block[i][j].setFontColor(theFont);
		}
	}
}</pre>
<pre>　</pre>
<pre><font size="3" color="#FF0000"><b><span lang="en-ca">file name: block.h</span></b></font></pre>
<pre>#ifndef BLOCK_H
#define BLOCK_H

#include &quot;tile.h&quot;

class CBlock
{
protected:
	CTile** block;
	int width;
	void initialize();
public:
	CBlock(int size=1);
	void setLength(int size);
	void setValue(char myCh);
	char getValue();
	void setFrameColor(WORD theColor);
	void setFontColor(WORD theColor);
	void setBKGroundColor(WORD theColor);
	void display(int x, int y);
};

#endif</pre>
<pre>　</pre>
<pre>　</pre>
<pre>　</pre>
<pre><font size="3" color="#FF0000"><b><span lang="en-ca">file name: block.cpp</span></b></font></pre>
<pre>#include &quot;block.h&quot;

CBlock::CBlock(int size)
{
	initialize();
	setLength(size);
}

void CBlock::initialize()
{
	block=NULL;
	width=0;
}

void CBlock::setLength(int size)
{
	width=size;
	block=new CTile*[size+1];
	for (int i=0; i&lt;=size; i++)
	{
		block[i]=new CTile[size+1];
		for (int j=0; j&lt;=size; j++)
		{
			if (i==size||j==size)
			{
				block[i][j].setBKGroundColor(DefaultFrameColor);
			}
		}
	}
}

void CBlock::setValue(char myCh)
{
	block[(width-1)/2][(width-1)/2].setValue(myCh);
}

void CBlock::setBKGroundColor(WORD theColor)
{
	for (int i=0; i&lt;width; i++)
	{
		for (int j=0; j&lt;width; j++)
		{
			block[i][j].setBKGroundColor(theColor);
		}
	}
}

void CBlock::setFontColor(WORD theColor)
{
	for (int i=0; i&lt;width; i++)
	{
		for (int j=0; j&lt;width; j++)
		{
			block[i][j].setFontColor(theColor);
		}
	}
}

void CBlock::setFrameColor(WORD theColor)
{
	for (int i=0; i&lt;=width; i++)
	{
		for (int j=0; j&lt;=width; j++)
		{
			if (i==width||j==width)
			{
				block[i][j].setBKGroundColor(theColor);
			}
		}
	}
}

char CBlock::getValue()
{
	return block[(width-1)/2][(width-1)/2].getValue();
}

void CBlock::display(int x, int y)
{
	for (int i=0; i&lt;=width; i++)
	{
		for (int j=0; j&lt;=width; j++)
		{
			block[i][j].display(x+j, y+i);
		}
	}
}</pre>
<pre>　</pre>
<pre><font size="3" color="#FF0000"><b><span lang="en-ca">file name: b</span>ag.h</b></font></pre>
<pre>#ifndef BAG_H
#define BAG_H

#include &quot;RoverType.h&quot;
#include &quot;tokens.h&quot;

class CBag: public CTokens
{
private:
	static int tokenData[27][2];
	int tokenLeft;
	CToken bag;
public:
	CBag();
	int getTokenPoint(char ch);
	int getBlankNumber();
	void setBlankNumber(int newNum);	
	int getTokenNumber(char ch);
	void setTokenPoint(char ch, int newPoint);
	void setTokenNumber(char ch, int newNumber);	
	void show();//only show the number of left tokens
	bool removeLetter(CToken&amp; result);
	bool removeLetter(char ch, CToken&amp; result);
	bool addLetter(const CToken&amp; target);
};

#endif
</pre>
<pre>　</pre>
<pre><font size="3" color="#FF0000"><b><span lang="en-ca">file name: </span>bag<span lang="en-ca">.cpp</span></b></font></pre>
<pre>#include &quot;bag.h&quot;

/*
 2 &quot;blank&quot; tiles (scoring 0 points), 9 As (1 point), 2 Bs (3), 2 Cs (3), 4 Ds (2), 
 12 Es (1), 2 Fs (4), 3 Gs (2), 2 Hs (4), 9 Is (1), 1 J (8), 1 K (5), 4 Ls (1), 
 2 Ms (3), 6 Ns (1), 8 Os (1), 2 Ps (3), 1 Q (10), 6 Rs (1), 4 Ss (1), 6 Ts (1),
 4 Us (1), 2 Vs (4), 2 Ws (4), 1 X (8), 2 Ys (4), and 1 Z (10).

  */

int CBag::tokenData[27][2]=
{
	{9,  1}, // As (1 point),
	{2,  3},// Bs (3),
	{2,  3},// Cs (3), 
	{4,  2},// Ds (2), 
	{12, 1},//Es (1),
	{2,  4},// Fs (4),
	{3,  2},//Gs (2), 
	{2,  4},//Hs (4),
	{9,  1},// Is (1), 
	{1,  8},// J (8), 
	{1,  5},// K (5), 
	{4,  1},// Ls (1),
	{2,  3},// Ms (3),
	{6,  1},//Ns (1), 
	{8,  1},// Os (1),
	{2,  3},// Ps (3), 
	{1,  10},// Q (10),
	{6,  1},// Rs (1),
	{4,  1},// Ss (1), 
	{6,  1},// Ts (1),
	{4,  1},// Us (1),
	{2,  4},// Vs (4),
	{2,  4},// Ws (4),
	{1,  8},// X (8),
	{2,  4},// Ys (4), and 
	{1,  10},// Z (10).
	{2,   0}//blank token valued 255
};


bool CBag::removeLetter(char ch, CToken&amp; result)
{
	for (int i=CTokens::pos-1; i&gt;=0; i--)
	{
		if (CTokens::tokens[i].getValue()==ch)
		{
			//swap, this is INEFFICIENT!
			result=CTokens::tokens[i];
			CTokens::tokens[i]=CTokens::tokens[CTokens::pos-1];
			CTokens::tokens[CTokens::pos-1]=result;
			return removeLetter(result);
		}
	}
	return false;
}


bool CBag::removeLetter(CToken&amp; result)
{
	if (tokenLeft==0)
	{
		return false;
	}
	result=tokens[--tokenLeft];
	return true;
}

bool CBag::addLetter(const CToken&amp; target)
{
	if (tokenLeft==DefaultNumberOfToken)
	{
		return false;
	}
	tokens[tokenLeft++]=target;
	return true;
}



CBag::CBag():CTokens(DefaultNumberOfToken)
{
	bag.setNumber(DefaultNumberOfToken);
	tokenLeft=DefaultNumberOfToken;
	int index=0;
	for (int i=0; i&lt;27; i++)
	{
		int j=0;
		while (j&lt;tokenData[i][BagTokenNumber])
		{
			if (i!=26)
			{
				tokens[index].setValue(i+'A');
			}
			else
			{
				tokens[index].setValue((char)DefaultBlankTokenValue);
			}
			j++;//always
			index++;
		}
	}
	shuffle();
	CTokens::pos=DefaultNumberOfToken;
}

void CBag::show()
{
	bag.setNumber(tokenLeft);
	bag.display(DefaultBag_x, DefaultBag_y);
}

int CBag::getTokenNumber(char ch)
{
	return tokenData[ch-'A'][BagTokenNumber];
}

int CBag::getBlankNumber()
{
	return tokenData[DefaultBlandTokenIndex][BagTokenNumber];
}

void CBag::setBlankNumber(int newNum)
{
	tokenLeft+= newNum-tokenData[DefaultBlandTokenIndex][BagTokenNumber];
	//????
	tokenData[DefaultBlandTokenIndex][BagTokenNumber]=newNum;
}

void CBag::setTokenNumber(char ch, int newNum)
{
	tokenLeft+=newNum-tokenData[ch-'A'][BagTokenNumber];
	tokenData[ch-'A'][BagTokenNumber]=newNum;
}

void CBag::setTokenPoint(char ch, int newPoint)
{
	tokenData[ch-'A'][BagTokenPoints]=newPoint;
}

int CBag::getTokenPoint(char ch)
{
	return tokenData[ch-'A'][BagTokenPoints];
}





</pre>
<pre><font size="3" color="#FF0000"><b><span lang="en-ca">file name: </span>deck<span lang="en-ca">.</span>h</b></font></pre>
<pre>#ifndef DECK_H
#define DECK_H	

#include &quot;tokens.h&quot;

class CDeck: public CTokens
{
protected:
	CCardBack deckBack;
	bool faceDown;
	int x, y;
public:
	CDeck(bool isEmpty=false);
	void setCoord(int newX, int newY);
	void showHand();
    int  numOfCards();
	bool addCard(const CToken&amp; card);
	bool removeCard(CToken&amp; token);	
	void setFace(bool faceDown=true);
	void display(int x, int y);
	void show();
};

#endif
</pre>
<pre>　</pre>
<pre>　</pre>
<pre><font size="3" color="#FF0000"><b><span lang="en-ca">file name: </span>deck<span lang="en-ca">.</span>cpp</b></font></pre>
<pre>#include &quot;deck.h&quot;

char cardValue[12]={'2','3','4','5','6','7','8','9','J','Q','K','A'};
int suitValue[4]={Club, Diamond, Heart, Spade};

CDeck::CDeck(bool isEmpty):CTokens(52)
{   
	//do initialize
	faceDown=true;
	for(int i=0;i&lt;4;i++)
	{		
		for(int j=0;j&lt;13; j++)
		{
			if (j==12)
			{
				tokens[i*13+j].setNumber(10);
			}
			else
			{
				tokens[i*13+j].setValue(cardValue[j]);
			}
			tokens[i*13+j].setSuit(suitValue[i]);
		}
	} 
	if (isEmpty)
	{
		pos=0;	
	}
	else
	{
		pos=len;
	}
	deckBack.setNumber(pos);
}

void CDeck::showHand()
{
	for (int i=0; i&lt;4; i++)
	{
		for (int j=0; j&lt;13; j++)
		{
			tokens[i*13+j].display(j*4, i*4);
		}
	}
}

bool CDeck::addCard(const CToken&amp; card)
{
	if (pos&lt;len)
	{
		deckBack.setNumber(pos+1);
	}
	return pushToken(card);
}

bool CDeck::removeCard(CToken&amp; card)
{
	if (pos&gt;0)
	{
		deckBack.setNumber(pos-1);
	}
	return popToken(card);
}

void CDeck::setFace(bool isFaceDown)
{
	faceDown=isFaceDown;
}

void CDeck::display(int x, int y)
{
	if (faceDown||pos==0)
	{
		deckBack.display(x, y);
	}
	else
	{
		tokens[pos-1].display(x, y);
	}
}

void CDeck::setCoord(int newX, int newY)
{
	x=newX;
	y=newY;
}

void CDeck::show()
{
	display(x,y);
}


</pre>
<pre><font size="3" color="#FF0000"><b><span lang="en-ca">file name: </span>rack<span lang="en-ca">.</span>h</b></font></pre>
<pre>#ifndef CRACK_H
#define CRACK_H
#include &quot;tokens.h&quot;
#include &quot;rummy.h&quot;
//#include &quot;control.h&quot;

class CControl;

class CRack: public CTokens
{
	friend class CControl;
protected:
	char buffer[9];
	CToken cardBuf[7];
	char exchanged;	
	static CRummy rummy;
	CToken empty;
    int selected[7];
	int selectedCount;
	int x,y;
	int exchangedIndex;
	int points;
public:
	CRack();
	bool selectToken(int index, bool isLetter=true);//success return true
	void addToken(const CToken&amp; token);
	//void showRack(int x,int y);
	void addExchanged(char exch);
	void updateRack(bool rollBack=false);
	bool canAdd() { return selectedCount&gt;0;}
	char* exportWord();
	bool verifyCards();
	void setCoord(int theX, int theY){ x=theX; y=theY;}
	void removeToken(int index, CToken&amp; result);
	void show();
};

#endif</pre>
<pre>　</pre>
<pre><font size="3" color="#FF0000"><b><span lang="en-ca">file name: </span>rack<span lang="en-ca">.cpp</span></b></font></pre>
<pre>#include &quot;rack.h&quot;


CRummy CRack::rummy;

CRack::CRack():CTokens(7)
{
	selectedCount=7;//means empty at beginning
	for (int i=0; i&lt;7; i++)
	{
		selected[i]=i;
	}
	exchangedIndex=-1;//means no exchanged!!!
	x=y=0;
}


bool CRack::selectToken(int index, bool isLetter)
{
	if (selectedCount==7)
	{
		return false;
	}
	for (int i=0; i&lt;selectedCount; i++)
	{
		if (index==selected[i])
		{
			return false;//means repeat selecting
		}
	}
	selected[selectedCount]=index;
	if (isLetter)
	{
		buffer[selectedCount]=tokens[index].getValue();	
	}
	else
	{
		cardBuf[selectedCount]=tokens[index];
	}
	tokens[index].setBKGroundColor(DefaultSelectedBKGColor);	
	tokens[index].setFontColor(DefaultSelectedFontColor);
	selectedCount++;
	show();
	return true;
}

//this is rackCard method
bool CRack::verifyCards()
{
	if (selectedCount==0)
	{
		return false;
	}
	return rummy.verify(cardBuf, selectedCount, points);
}

void CRack::addToken(const CToken&amp; newToken)
{
	if (selectedCount&gt;0)
	{
		tokens[selected[--selectedCount]]=newToken;
	}
}


void CRack::addExchanged(char ch)
{
	exchanged=ch;
	exchangedIndex=selectedCount;
}


void CRack::show()
{
	display(x,y);
}


void CRack::removeToken(int index, CToken&amp; result)
{
	result=tokens[index];
	tokens[index]=empty;
}

char* CRack::exportWord()
{
	//insert the exchanged letter
	if (exchangedIndex!=-1)
	{
		for (int i=selectedCount; i&gt;exchangedIndex; i--)
		{
			buffer[i]=buffer[i-1];
		}
		buffer[exchangedIndex]=exchanged; //insert the char
		buffer[selectedCount+1]='\0';
	}
	else
	{
		buffer[selectedCount]='\0';
	}
	return buffer;
}

void CRack::updateRack(bool rollBack)
{
	if(rollBack)
	{
		for(int i=0; i&lt;selectedCount;i++)
		{
			tokens[selected[i]].setBKGroundColor(DefaultBKGroundColor);
			tokens[selected[i]].setFontColor(DefaultFontColor);			
		}
		selectedCount=0;
		exchangedIndex=-1;
	}
	else
	{
		for(int i=0; i&lt;selectedCount;i++)
		{
			tokens[selected[i]].setBKGroundColor(DefaultBKGroundColor);
			tokens[selected[i]].setFontColor(DefaultFontColor);	
			tokens[selected[i]]=empty;			
		}        
		exchangedIndex=-1;//should I do at this moment?
	}
	show();
}
</pre>
<pre>　</pre>
<pre><font size="3" color="#FF0000"><b><span lang="en-ca">file name: </span>background<span lang="en-ca">.</span>h</b></font></pre>
<pre>//background
#ifndef BACKGROUND_H
#define BACKGROUND_H

#include &quot;RoverType.h&quot;

class CBackGround
{
protected:
	int width, height;
	int row, col;
	WORD ftColor;
	WORD bkColor;
public:
	CBackGround(int theRow=0, int theCol=0, int
		theHeight=DefaultScreenHeight, int theWidth=DefaultScreenWidth);
	void setFontColor(WORD theFTColor){ ftColor=theFTColor;}
	void setBKGroundColor(WORD theBKColor){bkColor=theBKColor;}
	void show();
};

class CInputArea: public CBackGround
{
public:
	CInputArea();
};

#endif</pre>
<pre>　</pre>
<pre><font size="3" color="#FF0000"><b><span lang="en-ca">file name: </span>background<span lang="en-ca">.cpp</span></b></font></pre>
<pre>#include &quot;background.h&quot;



CBackGround::CBackGround(int theRow, int theCol, int theHeight, int theWidth)
{
	COORD coord;
	bkColor=DefaultScreenBKColor;
	ftColor=DefaultScreenFTColor;
	width=theWidth;
	height=theHeight;
	row=theRow;
	col=theCol;
	if (hOutPut==0)
	{
		hOutPut=GetStdHandle(STD_OUTPUT_HANDLE);
		SetConsoleTitle(&quot;WordRover&quot;);
		CONSOLE_CURSOR_INFO cursorInfo;
		cursorInfo.bVisible=false;
		cursorInfo.dwSize=50;
		SetConsoleCursorInfo(hOutPut, &amp;cursorInfo);
		coord.X = DefaultInputPositionCol;
		coord.Y = DefaultInputPositionRow;
		SetConsoleCursorPosition(hOutPut, coord);
	}
	show();
	//SetConsoleTextAttribute(hOutPut, bkColor|ftColor);
}


void CBackGround::show()
{
	char ch=0;
	COORD coord;
	for (int r=row; r&lt;row+height; r++)
	{
		for (int c=col; c&lt;col+width; c++)
		{	
			coord.X=c;
			coord.Y=r;
			FillConsoleOutputAttribute(hOutPut, ftColor|bkColor, 1, coord, NULL);
			FillConsoleOutputCharacter(hOutPut, ch, 1, coord, NULL);
		}
	}
}

CInputArea::CInputArea():CBackGround(DefaultInputArea_y, DefaultInputArea_x,
		DefaultInputAreaHeight, DefaultInputAreaWidth)
{
	COORD coord;
	coord.X = DefaultInputArea_x;
	coord.Y = DefaultInputArea_y;
	bkColor=DefaultInputAreaBKColor;
	ftColor=DefaultInputAreaFTColor;
	CONSOLE_CURSOR_INFO cursorInfo;
	cursorInfo.bVisible=true;
	cursorInfo.dwSize=50;
	SetConsoleCursorInfo(hOutPut, &amp;cursorInfo);
//	coord.X = DefaultInputPositionCol;
//	coord.Y = DefaultInputPositionRow;
	SetConsoleCursorPosition(hOutPut, coord);
	show();
}</pre>
<pre>　</pre>
<pre>　</pre>
<pre><font size="3" color="#FF0000"><b><span lang="en-ca">file name: </span>dictionary<span lang="en-ca">.</span>h</b></font></pre>
<pre>#ifndef DICTIONARY_H
#define DICTIONARY_H

#include &quot;RoverType.h&quot;


struct Letter
{
	char ch;
	Letter* next;
	Letter* son;
	bool end;
};

class CDictionary
{
private:
	Letter* root[52];
	Letter* current;
	Letter* findBrother(Letter* brother, char ch);
	Letter* createLetter(char ch);
	Letter* addSon(char ch);
	int indexOf(char ch);
	bool caseSensitive;
	void change2Capital(char* target, char* source);
public:
	bool addWord(char* str);
	bool findWord(char* str);
	bool readFile(const char* fileName);
	void setCaseSensitive(bool isCaseSensitive);
	CDictionary(bool isCaseSensitive=true);
};

#endif</pre>
<pre>　</pre>
<pre><font size="3" color="#FF0000"><b><span lang="en-ca">file name: </span>dictionary<span lang="en-ca">.</span>cpp</b></font></pre>
<pre>#include &lt;stdio.h&gt;
#include &quot;dictionary.h&quot;

const int MinimumLengthOfStr=2;

void CDictionary::change2Capital(char* target, char* source)
{
	char* tgt=target, *src=source;
	do
	{
		*tgt=toupper(*src);
		tgt++;
		src++;
	}while (*src!='\0');
	*tgt='\0';
}

bool CDictionary::readFile(const char* fileName)
{
	char buffer[MaxLengthOfWord];
	char*ptr=buffer;
	char ch;
	FILE* stream;
	stream=fopen(fileName, &quot;r&quot;);
	if (stream==NULL)
	{
		return false;
	}
	while (!feof(stream))
	{
		ch=fgetc(stream);
		if (isalpha(ch))
		{
			if (!caseSensitive)
			{
				*ptr=toupper(ch);
			}
			else
			{
				*ptr=ch;
			}
			ptr++;
		}
		else
		{
			*ptr='\0';
			if (ptr!=buffer)
			{
				if (strlen(buffer)&gt;=MinimumLengthOfStr)
				{
					addWord(buffer);					
				}
				ptr=buffer;
			
			}
			//else remain the same ptr.
		}
	}
	fclose(stream);
	return true;
}


bool CDictionary::findWord(char* str)
{
	char* ptr=str;
	char buffer[MaxLengthOfWord];
	if (str==NULL)
	{
		return false;
	}

	if (!caseSensitive)
	{		
		ptr=buffer;
		change2Capital(buffer, str);
	}
	Letter* hold;
	int index;
	//not empty string
	if (ptr!=NULL)
	{
		index = indexOf(*ptr);
		if (index==-1)
		{
			return false;
		}
		current=root[index];		
		ptr++;

		if (current-&gt;son==NULL)
		{
			//if string is a one-letter string
			if (*ptr=='\0')
			{
				//and there is a one-letter word in dictionary
				return current-&gt;end;
			}
			else
			{
				return false;
			}
		}
		hold=current;//
		current=current-&gt;son;
		
		while (*ptr!='\0')
		{				
			current=findBrother(current, *ptr);
			if (current==NULL)
			{
				return false;
			}
			if (current-&gt;ch==*ptr)
			{
				hold=current;
				current=current-&gt;son;
			}
			else
			{
				//not found
				return false;
			}
			ptr++;
		} 
		return hold-&gt;end;
	}
	//in my dictionary there is no empty string word
	return false;
}
	

Letter* CDictionary::createLetter(char ch)
{
	Letter* ptr=new Letter;
	ptr-&gt;ch=ch;
	ptr-&gt;end=false;
	ptr-&gt;next=NULL;
	ptr-&gt;son=NULL;
	return ptr;
}

//ch is not '\0'
Letter* CDictionary::findBrother(Letter* brother, char ch)
{
	Letter* hold=brother;
	if (brother==NULL)
	{
		return NULL;
	}
	while (hold-&gt;next!=NULL)
	{
		if (hold-&gt;ch==ch)
		{
			break;
		}
		hold=hold-&gt;next;
	}
	return hold;
}

Letter* CDictionary::addSon(char ch)
{
	//the word ends
	if (ch=='\0')
	{
		current-&gt;end=true;		
	}
	else
	{
		//need a new son
		if (current-&gt;son==NULL)
		{
			current-&gt;son=createLetter(ch);
			current=current-&gt;son;
		}
		else
		{
			//current-&gt;son is not NULL!!!
			current=findBrother(current-&gt;son, ch);
			//check if the current is the node
			if (current-&gt;ch!=ch)
			{
				current-&gt;next=createLetter(ch);	
				current=current-&gt;next;//add brother
			}	
			//else return current;!!!
		}
	}
	return current;
}


//add word actually add letter by letter till NULL, nonsense!
bool CDictionary::addWord(char* str)
{
	char* ptr=str;
	int index;
	if (*ptr!='\0')
	{
		index=indexOf(*ptr);
		if (index==-1)
		{
			return false;
		}
		current=root[index];		
		do
		{
			ptr++;
			current=addSon(*ptr);			
		} while (*ptr!='\0');
		return true;
	}
	return false;
}

CDictionary::CDictionary(bool isCaseSensitive)
{
	caseSensitive=isCaseSensitive;

	for (int i=0; i&lt;LetterCount; i++)
	{
		root[i]=new Letter;
		root[i]-&gt;ch='A'+i;
		root[i]-&gt;next=NULL;
		root[i]-&gt;son=NULL;
		root[i]-&gt;end=false;
	}
	if (caseSensitive)
	{
		for (i=0; i&lt;LetterCount; i++)
		{
			root[i+LetterCount]=new Letter;
			root[i+LetterCount]-&gt;ch='a'+i;
			root[i+LetterCount]-&gt;next=NULL;
			root[i+LetterCount]-&gt;son=NULL;
		}
	}
}

int CDictionary::indexOf(char ch)
{
	if (ch-'A'&gt;=0&amp;&amp;ch-'Z'&lt;=0)
	{
		return ch-'A';
	}
	if (ch-'a'&gt;=0&amp;&amp;ch-'z'&lt;=0)
	{
		return ch-'a'+LetterCount;
	}
	return -1;
}


</pre>
<pre>　</pre>
<pre><font size="3" color="#FF0000"><b><span lang="en-ca">file name: </span>frame<span lang="en-ca">.</span>h</b></font></pre>
<pre>#ifndef FRAME_H
#define FRAME_H

#include &quot;RoverType.h&quot;
#include &quot;tile.h&quot;

class CFrame
{
private:
	int x,y;
	int width, height;
	CTile pixel;
	char ch;
	WORD ftColor;
	WORD bkColor;
public:
	void setFrame(int x, int y, int height, int width);
	void show();
	void setChar(char chr){ ch=chr;}
	void setFTColor(WORD theColor){ftColor=theColor; }
	void setBKColor(WORD theColor){bkColor=theColor;}
};
#endif</pre>
<pre>　</pre>
<pre>　</pre>
<pre><font size="3" color="#FF0000"><b><span lang="en-ca">file name: </span>frame<span lang="en-ca">.</span>cpp</b></font></pre>
<pre>#include &quot;frame.h&quot;

//the height and width are the one of region, not that of frame
void CFrame::setFrame(int theX, int theY, int theHeight, int theWidth)
{
	ch=DefaultFrameChar;
	//change to that of frame
	////must at least 1!!!
	if (theX*theY==0||theX+theWidth+2&gt;DefaultScreenWidth||theY+theHeight+2&gt;DefaultScreenHeight)
	{
		return;
	}
	x=theX-1;
	y=theY-1;
	height=theHeight+2;
	width=theWidth+2;
	pixel.setValue(ch);
	pixel.setBKGroundColor(DefaultFrameBKColor);
	pixel.setFontColor(DefaultFrameFTColor);
}


void CFrame::show()
{
	for (int i=0; i&lt;height; i++)
	{
		pixel.display(x, y+i);
		pixel.display(x+width-1, y+i);
	}
	for (i=0; i&lt;width; i++)
	{
		pixel.display(x+i, y);
		pixel.display(x+i, y+height-1);
	}
}</pre>
<pre>　</pre>
<pre>　</pre>
<pre><font size="3" color="#FF0000"><b><span lang="en-ca">file name: </span>message<span lang="en-ca">.</span>h</b></font></pre>
<pre>#include &quot;RoverType.h&quot;
#include &quot;tiles.h&quot;

class CMessage: public CTiles
{
private:
	CTiles tiles;
public:
	void showMessage(int msgID);//the id should be define in rovertype.h
	
};
</pre>
<pre>　</pre>
<pre>　</pre>
<pre><font size="3" color="#FF0000"><b><span lang="en-ca">file name: </span>message<span lang="en-ca">.</span>cpp</b></font></pre>
<pre>#include &quot;message.h&quot;
//#include &quot;background.h&quot;

//CInputArea  D;

const int MsgStrCount=28;
char* msgStr[MsgStrCount]=
{
	&quot;WAITINGMENUCHOICE&quot;,
	&quot;PICKCARD      &quot;,
	&quot;SELECTCARD    &quot;,
	&quot;SELECTLETTER  &quot;,
	&quot;TRADE		  &quot;,
	&quot;DISCARD       &quot;,
	&quot;FORMWORD	  &quot;,
	&quot;CANCEL		  &quot;,
	&quot;ENDROUND	  &quot;,
	&quot;QUIT		  &quot;,
	&quot;INPUTPLACEWORDINFO &quot;,
	&quot;INVALIDCARDSTRADING&quot;,
	&quot;INPUTEXCHANGELETTER&quot;,
	&quot;CANNOTEXCHANGELETTER&quot;,
	&quot;INPUTDIRECTION      &quot;,
	&quot;INPUTROW            &quot;,
	&quot;INPUTCOL	         &quot;,
	&quot;INVALIDINDEXENTERED &quot;,
	&quot;INVALIDWORDFORMED   &quot;,
	&quot;UNABLEPLACEWORD     &quot;,
	&quot;PLAYERALREADYPICKED &quot;,
	&quot;PLAYERALREADYFORMED &quot;,
	&quot;PLAYERALREADYTRADED &quot;,
	&quot;INVALIDDICTIONARYFILENAME&quot;,
	&quot;TRYUSEDEFAULTFILENAME&quot;,
	&quot;INVALIDROWCOLNUMBER&quot;,
	&quot;INPUTPLAYERNAME&quot;,
	&quot;PRESSANYKEYTOSTART&quot; 
};

void CMessage::showMessage(int msgID)
{
//	D.show();
	tiles.setValue(msgStr[msgID]);
	tiles.display(DefaultInputArea_x, DefaultInputArea_y);
	//David: this is to show the message at working area with msgID defined in &quot;rovertype.h&quot;
}</pre>
<pre>　</pre>
<pre>　</pre>
<pre><font size="3" color="#FF0000"><b><span lang="en-ca">file name: </span>menu<span lang="en-ca">.</span>h</b></font></pre>
<pre>#ifndef MENU_H
#define MENU_H

#include &quot;tiles.h&quot;

class CMenu
{
private:
	CTiles buttons[CountOfButtons];
	int selected;
public:
	//constructor
	CMenu();
//iButton--the index of button, theColor--the color value
	bool setFontColor(int iButton, WORD theColor);
//iButton--the index of button, theColor--the color value
	bool setBKGroundColor(int iButton, WORD theColor);
	void displayH(int x=0, int y=MaxHeightScreen-2);
	void displayV(int x=MaxLengthScreen-15, int y=MaxHeightScreen-9);
	void setSelected(int index);
	void show();
};

#endif

/*
private:
	CTile* tiles;
	int len;
	WORD ftColor;
	WORD bkColor;
	bool isVertical;
	void initialize();	
public:
	CTiles(const char* str);
	CTiles();
	~CTiles();
	void setDirection(bool beVertical){ isVertical=beVertical;}
	CTile&amp; operator[](int index){return tiles[index];}
	void setFontColor(WORD theColor){ftColor=theColor;}
	void setBKGroundColor(WORD theColor){bkColor=theColor;}
	int getLength(){return len;}
	void display(int x, int y);
	void setValue(const char* str);
//	void setValue(const char* str) const;
	void setLength(int size);
*/
</pre>
<pre>　</pre>
<pre>　</pre>
<pre><font size="3" color="#FF0000"><b><span lang="en-ca">file name: </span>menu<span lang="en-ca">.</span>cpp</b></font></pre>
<pre>#include &quot;Menu.h&quot;

const char * ButtonName[CountOfButtons] = { &quot;1&quot;, &quot;Pick Card    &quot;, 
											&quot;2&quot;, &quot;Select Card  &quot;,
					                        &quot;3&quot;, &quot;Select Letter&quot;,
											&quot;4&quot;, &quot;Trade        &quot;,
											&quot;5&quot;, &quot;Discard      &quot;,
											&quot;6&quot;, &quot;Form Word    &quot;,
											&quot;7&quot;, &quot;Cancel       &quot;,
											&quot;8&quot;, &quot;End  Round   &quot;,
											&quot;9&quot;, &quot;Quit         &quot;};


CMenu::CMenu()
{
	for (int i=0; i&lt;CountOfButtons; i++)
	{
		this-&gt;buttons[i].setValue(ButtonName[i]);
		this-&gt;buttons[i].setBKGroundColor(DefaultMenuBKGroundColor);
		if (i%2 == 0)
		{
			this-&gt;buttons[i].setFontColor(FTRED);
		}
		else
		{
			this-&gt;buttons[i].setFontColor(DefaultMenuFontColor);
		}
	}
	selected=-1;
}

void CMenu::setSelected(int index)
{
	if (selected!=index&amp;&amp;index!=-1)
	{
		//restore first
		if (selected!=-1)
		{
			setBKGroundColor(selected, DefaultMenuBKGroundColor);
		}
		setBKGroundColor(index, DefaultMenuSelectedBKGroundColor);
		selected=index;
		show();
	}
}


void CMenu::show()
{
	displayH(DefaultMenu_x, DefaultMenu_y);
}

//iButton--the index of button, theColor--the color value
bool CMenu::setFontColor(int iButton, WORD theColor)
{
	this-&gt;buttons[iButton*2+1].setFontColor(theColor);
	return true;
}
	
//iButton--the index of button, theColor--the color value
bool CMenu::setBKGroundColor(int iButton, WORD theColor)
{
	this-&gt;buttons[iButton*2+1].setBKGroundColor(theColor);
	return true;
}

void CMenu::displayH(int x, int y)
{
	for (int i=0; i&lt;CountOfButtons; i++)
	{
		this-&gt;buttons[i].display(x, y);

		if ( i==7 )
			y++, x=0;
		
		if (i%2==1 &amp;&amp; i!=0 &amp;&amp; i!=7)
			x += strlen(ButtonName[i]) + MenuSpace;
		else
			x++;
	}
}

void CMenu::displayV(int x, int y)
{
	int xb=x;
	for (int i=0; i&lt;CountOfButtons; i++)
	{
		this-&gt;buttons[i].display(x, y);
		if ( i%2 == 1 )
			y+=2, x=xb;
		else 
			x++;
	}
}</pre>
<pre>　</pre>
<pre>　</pre>
<pre><font size="3" color="#FF0000"><b><span lang="en-ca">file name: </span>listener<span lang="en-ca">.</span>h</b></font></pre>
<pre>#ifndef   LISTENER_H
#define   LISTENER_H

#include &quot;RoverType.h&quot;

class CListener
{
protected:
	static HANDLE hOut;
	static char buffer[MaxInputBufferLength];
	void initialize();
public:
	CListener();
	int listenMenu();
	int listenInt();
	int listenIndex();
	char listenChar();
	char* listenStr();//must ended by entering return
};

#endif
</pre>
<pre>　</pre>
<pre><font size="3" color="#FF0000"><b><span lang="en-ca">file name: </span>listener<span lang="en-ca">.</span>cpp</b></font></pre>
<pre>#include &quot;listener.h&quot;

const int MaxIntLen=3;

HANDLE CListener::hOut=NULL;
char CListener::buffer[MaxInputBufferLength];

CListener::CListener()
{
	initialize();
}

void CListener::initialize()
{
	hOut=GetStdHandle(STD_INPUT_HANDLE);
	
}

int CListener::listenMenu()
{
	DWORD temp;
	SetConsoleMode(hOut, 0);
	ReadConsole(hOut, buffer, 1, &amp;temp, NULL);
	return buffer[0]-'0';
}

char CListener::listenChar()
{
	DWORD temp;
	SetConsoleMode(hOut, 0);
	ReadConsole(hOut, buffer, 1, &amp;temp, NULL);
	if (buffer[0]&gt;='a'&amp;&amp;buffer[0]&lt;='z')
	{
		return buffer[0];
	}
	else
	{
		if (buffer[0]&gt;='A'&amp;&amp;buffer[0]&lt;='Z')
		{
			return buffer[0];
		}
		else
		{
			return '\0';
		}
	}
}

int CListener::listenIndex()
{
	return listenMenu();
}

//better name
int CListener::listenInt()
{	
	DWORD temp;
	int result=0;
	SetConsoleMode(hOut, ENABLE_LINE_INPUT);
	ReadConsole(hOut, buffer, MaxIntLen, &amp;temp, NULL);

	for (int i=0; i&lt;temp; i++)
	{
		if (buffer[i]&gt;'9'||buffer[i]&lt;'0')
		{
			break;//error!!
		}
		result=result*10 + buffer[i]-'0';
	}
	return result;
}

char* CListener::listenStr()
{
	DWORD temp;
	SetConsoleMode(hOut, ENABLE_LINE_INPUT);
	ReadConsole(hOut, buffer, MaxInputBufferLength, &amp;temp, NULL);
	buffer[temp-1]='\0';
	return buffer;
}

</pre>
<pre>　</pre>
<pre>　</pre>
<pre><font size="3" color="#FF0000"><b><span lang="en-ca">file name: </span>control<span lang="en-ca">.</span>h</b></font></pre>
<pre>#ifndef  CONTROL_H
#define  CONTROL_H
#include &quot;roverType.h&quot;
#include &quot;listener.h&quot;
#include &quot;player.h&quot;
#include &quot;message.h&quot;
#include &quot;bag.h&quot;
#include &quot;deck.h&quot;
#include &quot;board.h&quot;
#include &quot;menu.h&quot;
#include &quot;dictionary.h&quot;
#include &quot;scoreboard.h&quot;
#include &quot;logo.h&quot;
#include &quot;background.h&quot;


class CControl
{
private:
	char playerName[2][DefaultScoreBoardWidth+1];
	char* fileName;
	CScoreBoard scoreBoard;
	CBackGround backGround;
	CLogo logo;
	CListener listener;
	CPlayer player[2];
	CMessage message;
	CMenu  menu;
	CBag bag;
	int turn;
	void initPlayGame();
	void initStartGame();
	void initEndGame();
	int doFormWord();
	int doSelectCard();
	int doSelectLetter();
	int doTrade();
	int doPickCard();
	int doDiscard();
	int doEndRound();
	int doCancel();
	void fillUpRack();
	int listenMenu();
	void showMessage(int msgID);
	void nextTurn();
	void calculateScore();
	void getPlayerName(int index);
public:
	void setInputFile(char* inputFileName);
	void startLogo();
	void startGame();
	void playGame();
	void endGame();
	void show();
	CControl();
};


#endif</pre>
<pre>　</pre>
<pre><font size="3" color="#FF0000"><b><span lang="en-ca">file name: </span>control<span lang="en-ca">.</span>cpp</b></font></pre>
<pre>#include &quot;control.h&quot;
#include &quot;scoreboard.h&quot;

CDeck playingDeck, playedDeck(true);
CScoreBoard scoreBoard;
CBoard board;
CDictionary dictionary(false);
char* defaultInputFileName=&quot;c:\\readme.txt&quot;;


void CControl::playGame()
{
	//bool quit=false;
	int choice;
	initPlayGame();
	choice=listenMenu();
	while (true)
	{
		switch (choice)
		{
		case SELECTCARD:
			choice =doSelectCard();			
			break;
		case SELECTLETTER:
			choice=doSelectLetter();
			break;
		case TRADE:
			if (!player[turn].traded&amp;&amp;!player[turn].formed)
			{				
				choice =doTrade();
			}
			else
			{
				showMessage(PLAYERALREADYTRADED);
				choice=CANCEL;
			}
			break;
		case PICKCARD:
			if (!player[turn].picked)
			{
				choice=doPickCard();
			}
			else
			{
				showMessage(PLAYERALREADYPICKED);
				choice=CANCEL;
			}
			break;
		case FORMWORD:
			if (!player[turn].formed)
			{
				choice=doFormWord();
			}
			else
			{
				showMessage(PLAYERALREADYFORMED);
				choice=CANCEL;
			}
			break;
		case QUIT:
			return;
			break;
		case ENDROUND:
			choice=doEndRound();
			break;
		case CANCEL:
			choice =doCancel();
			break;
		case DISCARD:
			choice =doDiscard();
			break;
		default:
			choice=listenMenu();
			break;
		}
	}
}

void CControl::calculateScore()
{
	int points, index, score=0;
	char* ptr;
	int pos=0;
	index=player[turn].rackLetter.exchangedIndex;
	points=player[turn].rackCard.points;
	while ((ptr=board.getNextStr(index))!=NULL)
	{
		while (ptr[pos]!='\0')
		{
			if (pos!=index)
			{
				score+=bag.getTokenPoint(ptr[pos]);
			}
			else
			{
				score+=bag.getTokenPoint(ptr[pos])+points;
			}
			pos++;
		}
	}
	//here to set score to score board
	//this is for debug only
	scoreBoard.setPlayerScore(score);
	scoreBoard.show();
	//this is for debug only
	
}

int CControl::doDiscard()
{
	CToken temp;
	//show prompt message, this is no cancel operation
	if (player[turn].rackCard.selectedCount&gt;0)
	{
		for (int i=0; i&lt;player[turn].rackCard.selectedCount; i++)
		{
			temp=player[turn].rackCard.tokens[player[turn].rackCard.selected[i]];
			playedDeck.addCard(temp);
		}
		player[turn].rackCard.updateRack();
		playedDeck.show();
		player[turn].rackCard.show();
	}
	if (player[turn].rackLetter.selectedCount&gt;0)
	{
		for (int i=0; i&lt;player[turn].rackLetter.selectedCount; i++)
		{
			temp=player[turn].rackLetter.tokens[player[turn].rackLetter.selected[i]];
			bag.addLetter(temp.getValue());
		}
		bag.shuffle();
		bag.show();
		player[turn].rackLetter.updateRack();
		player[turn].rackLetter.show();
	}
	return listenMenu();
}


int CControl::doCancel()
{
	player[turn].rackCard.updateRack(true);
	player[turn].rackLetter.updateRack(true);
	player[turn].traded=false;
	player[turn].formed=false;
	player[turn].show();
	//board.update(true);
	//board.show();
	return listenMenu();
}

int CControl::doEndRound()
{
	showMessage(ENDROUND);
	board.update();

	player[turn].rackLetter.updateRack();
	player[turn].rackCard.updateRack();
	fillUpRack();
	//player[turn].show();
	
	//set scoreboard to show current player
	nextTurn();
	
	//update all view to show
	//fillUpRack();
	player[turn].traded=false;
	player[turn].formed=false;
	player[turn].picked=false;
	scoreBoard.switchCurrentPlayer();
	show();
	return listenMenu();
}

void CControl::nextTurn()
{
	turn=(turn+1)%2;//next player
}


int CControl::doFormWord()
{
	int row=-1, col=-1;
	int index;
	char dir;
	showMessage(FORMWORD);
	char* ptr;
	ptr=player[turn].rackLetter.exportWord();
	//this should be done after the word is placed on the board
	/*
	if (!dictionary.findWord(ptr))
	{
		showMessage(INVALIDWORDFORMED);
		return CANCEL;
	}
	*/

	//showMessage(INPUTPLACEWORDINFO);
	showMessage(INPUTROW);
	row=listener.listenInt();
	if (row&gt;=DefaultBoardSize||row&lt;0)
	{
		showMessage(INVALIDROWCOLNUMBER);
		return CANCEL;		
	}
	
	
	showMessage(INPUTCOL);
	col=listener.listenInt();
	if (col&gt;=DefaultBoardSize||col&lt;0)
	{
		showMessage(INVALIDROWCOLNUMBER);
		return CANCEL;		
	}
	showMessage(INPUTDIRECTION);
	dir=listener.listenChar();

	//points=player[turn].rackCard.points;

	index=player[turn].rackLetter.exchangedIndex;

	//have no verification here now, but need future
	if (board.placeWord(row, col, ptr, dir=='V'||dir=='v', index))
	{
		int temp;
		//char* ptr;
		ptr=board.verifyStr(temp);
		if (!dictionary.findWord(ptr))
		{
			showMessage(INVALIDWORDFORMED);
			return CANCEL;
		}
		board.update();
		board.show();
		player[turn].rackLetter.updateRack();
		player[turn].rackLetter.show();
		calculateScore();
		player[turn].formed=true;
	}
	else
	{
		showMessage(UNABLEPLACEWORD);
	}
	return listenMenu();
}





//I want a simple solution: you can only pick card if your last selected card
//has been discarded
int CControl::doPickCard()
{
	CToken target, source;
	int&amp; count=player[turn].rackCard.selectedCount;
	int index=player[turn].rackCard.selected[count-1];

	if (count&gt;0)
	{
		target=player[turn].rackCard.tokens[index];
		if (target.getValue()==0)//empty space
		{
			if (playedDeck.removeCard(source))
			{
				//remove from selected count and update displaying
				player[turn].rackCard.tokens[index]=source;
				count--;
				/*
				if (player[turn].rackCard.tokens[
					player[turn].rackCard.selected[player[turn].rackCard.selectedCount-1]]
				player[turn].rackCard.tokens[
					player[turn].rackCard.selected[--player[turn].rackCard.selectedCount]]=temp;
					*/

				playedDeck.display(DefaultPlayedDeck_x, DefaultPlayedDeck_y);
				player[turn].rackCard.show();
				player[turn].picked=true;//no cancel
			}
		}
	}
	return listenMenu();	
}

int CControl::doSelectLetter()
{
	int choice;
	showMessage(SELECTLETTER);
	choice=listener.listenIndex();
	if (choice&lt;=7&amp;&amp;choice&gt;=1) 
	{
		player[turn].selectLetter(choice-1);
	}
	else
	{
		showMessage(INVALIDINDEXENTERED);
		return doSelectLetter();
	}
	/*
	newAction=listenMenu();
	switch(newAction)
	{
	case SELECTLETTER:
		return doSelectLetter();
		break;
	case CANCEL:
		player[turn].updateLetters(true);
		break;
	case DISCARD:
		//add some prompted warning message in future.
		for (i=0; i&lt;player[turn].rackLetter.selectedCount; i++)
		{
			CToken temp;
			player[turn].rackLetter.removeToken(player[turn].rackLetter.selected[i], temp);
			bag.addLetter(temp);
		}
		player[turn].rackLetter.updateRack();//no turning back!!!
		bag.show();
		//maybe deck need refresh for displaying
		return ENDROUND;//this is considered to be end of round 
		break;
	default:
		return newAction;
	}
	*/
	return listenMenu();
}

int CControl::doSelectCard()
{	
	int choice;
	showMessage(SELECTCARD);
	choice=listener.listenIndex();
	if (choice&lt;=7&amp;&amp;choice&gt;=1) 
	{
		player[turn].selectCard(choice-1);
	}
	else
	{
		showMessage(INVALIDINDEXENTERED);//prompt user to re-enter choice
		return doSelectCard();
	}
	/*
	newAction = listenMenu();
	switch (newAction)
	{
	case SELECTCARD:
		return doSelectCard();
		break;
	case CANCEL:
		player[turn].updateCards(true);	
		break;
	case DISCARD:
		//add some prompted warning message in future.
		for (i=0; i&lt;player[turn].rackCard.selectedCount; i++)
		{
			CToken temp;
			player[turn].rackCard.removeToken(player[turn].rackCard.selected[i], temp);
			playedDeck.addCard(temp);
		}
		player[turn].rackCard.updateRack();//no turning back!!!
		playedDeck.show();
		//maybe deck need refresh for displaying
		return ENDROUND;
		break;
	default: 
		return newAction;
	}	
	*/
	return listenMenu();
}

int CControl::doTrade()
{
	//int points;
	showMessage(TRADE);

	if (!player[turn].verifyCards())
	{
		showMessage(INVALIDCARDSTRADING);//warn user to reselect cards
		player[turn].updateCards(true);
		return listenMenu();//rollback
	}
	else
	{
		CToken temp;
		char ch;
		showMessage(INPUTEXCHANGELETTER);
		ch=listener.listenChar();
		ch=toupper(ch);
		if (!isalpha(ch))
		{
			player[turn].updateCards(true);
			return listenMenu();
		}
		//need some verifications here!!!!
		if (bag.removeLetter(ch, temp))
		{
			player[turn].addExchanged(ch);	
			player[turn].traded=true;
		}
		else
		{
			showMessage(CANNOTEXCHANGELETTER);//warn user to reselect cards
			player[turn].updateCards(true);				
		}			
	}
	return listenMenu();
}


void CControl::showMessage(int msgID)
{
	message.showMessage(msgID);
}

int CControl::listenMenu()
{
	int result=-1;
	while (result&lt;1||result&gt;9)
	{
		showMessage(WAITINGMENUCHOICE);
		result= listener.listenMenu();
	}
	menu.setSelected(result-1);
	return result;
}

void CControl::show()
{
	player[turn].show();
	playingDeck.show();
	playedDeck.show();
	board.show();
	bag.show();
	menu.show();
	scoreBoard.show();
	//scoreboard.show(); //this is for Charles
}

void CControl::fillUpRack()
{
	CToken temp;
	for (int i=0; i&lt;player[turn].rackCard.selectedCount; i++)
	{
		temp=player[turn].rackCard.tokens[player[turn].rackCard.selected[i]];
		if (temp.getValue()!=0)
		{
			playedDeck.addCard(temp);
		}
		if (playingDeck.removeCard(temp))
		{
			player[turn].rackCard.tokens[player[turn].rackCard.selected[i]]=temp;
		}
	}
	//player[turn].rackCard.updateRack();
	player[turn].rackCard.selectedCount=0;
	player[turn].rackCard.show();
	playingDeck.show();
	playedDeck.show();
	for (i=0; i&lt;player[turn].rackLetter.selectedCount; i++)
	{
		temp=player[turn].rackLetter.tokens[player[turn].rackLetter.selected[i]];
		//for the initialization
		if (temp.getValue()!=0)
		{
			bag.addLetter(temp);		
		}
	}
	bag.shuffle();
	for (i=0; i&lt;player[turn].rackLetter.selectedCount; i++)
	{
		if (bag.removeLetter(temp))
		{
			player[turn].rackLetter.tokens[player[turn].rackLetter.selected[i]]=temp;
		}
	}

	//player[turn].rackLetter.updateRack();
	player[turn].rackLetter.selectedCount=0;
	bag.show();
	player[turn].rackLetter.show();
}

void CControl::initPlayGame()
{
	backGround.show();
	if (!dictionary.readFile(fileName))
	{
		showMessage(INVALIDDICTIONARYFILENAME);
		showMessage(TRYUSEDEFAULTFILENAME);
		fileName=defaultInputFileName;
		if (!dictionary.readFile(fileName))
		{
			showMessage(INVALIDDICTIONARYFILENAME);
			exit(INVALIDDICTIONARYFILENAME);
		}
	}
	
	//dictionary.readFile(defaultInputFileName);
	turn=0;
	playingDeck.setFace(true);
	playingDeck.setCoord(DefaultPlayingDeck_x, DefaultPlayingDeck_y);
	playedDeck.setFace(false);
	playedDeck.setCoord(DefaultPlayedDeck_x, DefaultPlayedDeck_y);
	fillUpRack();
	player[turn].traded=false;
	player[turn].formed=false;
	player[turn].picked=false;
	nextTurn();
	fillUpRack();
	player[turn].traded=false;
	player[turn].formed=false;
	player[turn].picked=false;
	nextTurn();
	menu.setSelected(-1);
	show();
}

void CControl::setInputFile(char* inputFileName)
{
	if (inputFileName!=NULL)
	{
		fileName=inputFileName;
	}
}

CControl::CControl()
{
	fileName=defaultInputFileName;
	backGround.show();
}

void CControl::getPlayerName(int index)
{
	char* ptr;
	showMessage(INPUTPLAYERNAME);
	ptr=listener.listenStr();
	if (strlen(ptr)&gt;DefaultScoreBoardWidth)
	{
		ptr[DefaultScoreBoardWidth]='\0';
	}
	strcpy(playerName[index], ptr);
	
}

void CControl::startGame()
{
	backGround.show();
	getPlayerName(0);
	getPlayerName(1);
	scoreBoard.setPlayerName(playerName[0], playerName[1]);
	//debug
	//scoreBoard.show();
	showMessage(PRESSANYKEYTOSTART);
	listener.listenMenu();
}


void CControl::startLogo()
{
	backGround.show();
	logo.show();
	Sleep(3000);
}
</pre>
<pre>　</pre>
<pre>　</pre>
<pre>　</pre>
<pre><font size="3" color="#FF0000"><b><span lang="en-ca">file name: </span>rummy<span lang="en-ca">.</span>h</b></font></pre>
<pre>#ifndef RUMMY_H
#define RUMMY_H

#include &quot;token.h&quot;

class CRummy
{
private:
	int array[7];
	int pos;
	bool sameSuit, isSequence, isGroup;
	void addOne(CToken* tokens, int index);
public:
	bool verify(CToken* tokens, int len, int&amp; points);
	CRummy();
};

#endif</pre>
<pre>　</pre>
<pre><font size="3" color="#FF0000"><b><span lang="en-ca">file name: </span>rummy<span lang="en-ca">.</span>cpp</b></font></pre>
<pre>#include &quot;rummy.h&quot;

bool CRummy::verify(CToken* tokens, int len, int&amp; points)
{
	sameSuit=isSequence=isGroup=true;
	points=0;

	int theSuit, theBase, theNext;
	for (int i=0; i&lt;len; i++)
	{
		addOne(tokens, i);
	}
	theSuit=tokens[array[0]].getSuit();
	theBase=tokens[array[0]].getNumber();
	points=theBase;//sum points
	for (i=1; i&lt;len; i++)
	{
		if (tokens[array[i]].getSuit()!=theSuit)
		{
			sameSuit=false;
		}
		theNext=tokens[array[i]].getNumber();
		points+=theNext;//sum points
		if (theNext-theBase!=0)
		{
			isGroup=false;
		}
		if (theNext-theBase!=-1)
		{
			isSequence=false;
		}
		theBase=theNext;
	}
	return sameSuit||isSequence||isGroup;
}
	

CRummy::CRummy()
{
	pos=0;
}

void CRummy::addOne(CToken* tokens, int index)
{
	int i=0;
	if (pos==0)
	{
		array[0]=index;
		pos++;
		return;
	}
	//insertion sorting	
	while (i&lt;pos)
	{
		if (tokens[index].getNumber()&gt;tokens[array[i]].getNumber())
		{
			break;
		}
		i++;	
	}
	
	for (int j=pos; j&gt;i; j--)
	{
		array[j]=array[j-1];
	}
	array[i]=index;
	pos++;
}</pre>
<pre>　</pre>
<pre>　</pre>
<pre><font size="3" color="#FF0000"><b><span lang="en-ca">file name: </span>player<span lang="en-ca">.</span>h</b></font></pre>
<pre>#ifndef CPLAYER_H
#define CPLAYER_H

#include &quot;rovertype.h&quot;
#include &quot;rack.h&quot;
//#include &quot;control.h&quot;

//to do:
//I need charles's CScoreBoard to put an instance inside Player
//so that all set, get method is implemented by CScoreBoard

class CControl;

class CPlayer
{
	friend class CControl;
private:
	char* name;
	CRack rackLetter;
	CRack rackCard;
	int currentScore;
	int totalScore;
	int index;
	bool traded;
	bool formed;
	bool picked;
public:
	CPlayer();
	~CPlayer();
	void setName(const char* theName);
	const char* getName();
	int getCurrentScore();
	void setCurrentScore(int score);
	int getTotalScore();
	void setTotalScore(int score);
	int getIndex(void);
	void setIndex(int theIndex);
	bool selectCard(int index);
	bool selectLetter(int index);
	void addCard(const CToken &amp; newCard );
	void addLetter(const CToken&amp; newLetter);
	char* exportWord();
	bool verifyCards();
	void show();
	void discardCard(int index, CToken&amp; result);
	void discardLetter(int index, CToken&amp; result);
	bool canAddCard();
	bool canAddLetter();
	void updateCards(bool rollBack=false);
	void updateLetters(bool rollBack=false);
	void addExchanged(char ch);
};

#endif</pre>
<pre>　</pre>
<pre><font size="3" color="#FF0000"><b><span lang="en-ca">file name: </span>player<span lang="en-ca">.</span>cpp</b></font></pre>
<pre>#include &quot;player.h&quot;


CPlayer::CPlayer()
{
	name=NULL;
	index=-1;
	rackLetter.setCoord(DefaultLetterRack_x, DefaultLetterRack_y);
	rackCard.setCoord(DefaultCardRack_x, DefaultCardRack_y);
	show();
}

void CPlayer::show()
{
	rackLetter.show();
	rackCard.show();
	//to do:
	//here to call scoreboard set current player method
}

void CPlayer::discardCard(int index, CToken&amp; result)
{
	rackCard.removeToken(index, result);
}

void CPlayer::discardLetter(int index, CToken&amp; result)
{
	rackLetter.removeToken(index, result);
}


CPlayer::~CPlayer()
{
	if (name!=NULL)
	{
		delete[]name;
	}
}

void CPlayer::setName(const char* theName)
{
	if (name!=NULL)
	{
		delete[]name;
	}
	name=new char[strlen(theName)+1];
	strcpy(name, theName);
}


const char* CPlayer::getName()
{
	return name;
}

void CPlayer::setCurrentScore(int score)
{
	currentScore=score;
}

int CPlayer::getCurrentScore()
{
	return currentScore;
}

void CPlayer::setTotalScore(int score)
{
	totalScore=score;
}

int CPlayer::getTotalScore()
{
	return totalScore;
}

int CPlayer::getIndex()
{
	return index;
}

bool CPlayer::selectCard(int index)
{
	return rackCard.selectToken(index, false);
}

bool CPlayer::selectLetter(int index)
{
	return rackLetter.selectToken(index);
}

void CPlayer::addCard(const CToken&amp; newToken)
{
	rackCard.addToken(newToken);
	rackCard.show();
}
  
void CPlayer::addLetter(const CToken&amp; newToken)
{
	rackLetter.addToken(newToken);
	rackLetter.show();
}

char* CPlayer::exportWord()
{
	return rackLetter.exportWord();
}
  
bool CPlayer::verifyCards()
{
	return rackCard.verifyCards();
}

bool CPlayer::canAddCard()
{
	return rackCard.canAdd();
}

bool CPlayer::canAddLetter()
{
	return rackLetter.canAdd();
}


void CPlayer::updateCards(bool rollBack)
{
	rackCard.updateRack(rollBack);
}

void CPlayer::updateLetters(bool rollBack)
{
	rackLetter.updateRack(rollBack);
}

void CPlayer::addExchanged(char ch)
{
	rackLetter.addExchanged(ch);
}


</pre>
<pre><font size="3" color="#FF0000"><b>f<span lang="en-ca">ile name: </span>logo.h</b></font></pre>
<pre>#ifndef LOGO_H
#define LOGO_H

#include &quot;rovertype.h&quot;
#include &quot;tiles.h&quot;

const int PatternSize=10;
const int RoverWordCount=9;

class CLogo
{
private:
	CTiles rover[RoverWordCount][PatternSize];
	void initialize();
	void showWord(int index, int x, int y);
public:
	CLogo();
	void show();
};

#endif</pre>
<pre>　</pre>
<pre>　</pre>
<pre><font size="3" color="#FF0000"><b>f<span lang="en-ca">ile name: </span>logo.cpp</b></font></pre>
<pre>#include &quot;logo.h&quot;


char roverLetters[RoverWordCount]={'W','O','R','D','R','O','V','E','R'};


char patterns[RoverWordCount][PatternSize][PatternSize]=
{
	{		
		{0,0,0,0,0,0,0,0,0,0},
		{1,0,0,0,0,0,0,0,0,1},
		{1,1,0,0,0,0,0,0,1,1},
		{1,1,0,0,0,0,0,0,1,1},
		{1,1,0,0,0,0,0,0,1,1},
		{1,1,0,0,1,1,0,0,1,1},
		{0,1,0,0,1,1,0,0,1,0},
		{0,1,0,1,0,0,1,0,1,0},  //W
		{0,1,1,1,0,0,1,1,1,0},
		{0,0,1,0,0,0,0,1,0,0}
	},
	{
		{0,0,0,0,1,1,0,0,0,0},
		{0,0,1,1,1,1,1,1,0,0},
		{0,1,1,0,0,0,0,1,1,0},
		{0,1,0,0,0,0,0,0,1,0},
		{1,1,0,0,0,0,0,0,1,1},
		{1,1,0,0,0,0,0,0,1,1},
		{0,1,0,0,0,0,0,0,1,0},   //O
		{0,0,1,0,0,0,0,1,1,0},
		{0,0,1,1,1,1,1,1,0,0},
		{0,0,0,0,1,1,0,0,0,0}
	},
	{
		{0,0,1,1,1,1,1,1,0,0},
		{0,1,1,1,1,1,1,1,1,0},
		{0,1,1,0,0,0,0,0,1,0},
		{0,1,1,0,0,0,0,1,1,0},
		{0,1,1,0,1,1,1,0,0,0},
		{0,1,1,0,1,1,0,0,0,0},
		{0,1,1,0,0,0,1,0,0,0},
		{0,1,1,0,0,0,0,1,0,0},    //R
		{0,1,1,0,0,0,0,0,1,0},
		{0,1,1,0,0,0,0,0,0,1}
	},
	{
		{0,1,1,1,1,1,1,0,0,0},
		{0,1,1,1,1,1,1,1,0,0},
		{0,1,1,0,0,0,0,1,1,0},
		{0,1,1,0,0,0,0,0,1,0},
		{0,1,1,0,0,0,0,0,1,1},   //D
		{0,1,1,0,0,0,0,0,1,1},
		{0,1,1,0,0,0,0,0,1,1},
		{0,1,1,0,0,0,0,1,1,0},
		{0,1,1,1,1,1,1,1,1,0},
		{0,1,1,1,1,1,1,0,0,0},
	},
	{
		{0,0,1,1,1,1,1,1,0,0},
		{0,1,1,1,1,1,1,1,1,0},
		{0,1,1,0,0,0,0,0,1,0},
		{0,1,1,0,0,0,0,1,1,0},
		{0,1,1,0,1,1,1,0,0,0},
		{0,1,1,0,1,1,0,0,0,0},
		{0,1,1,0,0,0,1,0,0,0},
		{0,1,1,0,0,0,0,1,0,0},    //R
		{0,1,1,0,0,0,0,0,1,0},
		{0,1,1,0,0,0,0,0,0,1}
	},
	{
		{0,0,0,0,1,1,0,0,0,0},
		{0,0,1,1,1,1,1,1,0,0},
		{0,1,1,0,0,0,0,1,1,0},
		{0,1,0,0,0,0,0,0,1,0},
		{1,1,0,0,0,0,0,0,1,1},
		{1,1,0,0,0,0,0,0,1,1},
		{0,1,0,0,0,0,0,0,1,0},   //O
		{0,0,1,0,0,0,0,1,1,0},
		{0,0,1,1,1,1,1,1,0,0},
		{0,0,0,0,1,1,0,0,0,0}
	},
	
	{
		{1,0,0,0,0,0,0,0,0,1},
		{1,0,0,0,0,0,0,0,0,1},
		{1,0,0,0,0,0,0,0,0,1},
		{1,1,0,0,0,0,0,0,1,1},
		{1,1,0,0,0,0,0,0,1,1},
		{1,1,0,0,0,0,0,0,1,1},
		{0,1,1,0,0,0,0,1,1,0}, //V
		{0,0,1,1,0,0,1,1,0,0},
		{0,0,0,1,1,1,1,0,0,0},
		{0,0,0,0,1,1,0,0,0,0}
	},
	{
		{1,1,1,1,1,1,1,1,1,0},
		{1,1,1,1,1,1,1,1,1,0},
		{1,1,0,0,0,0,0,0,0,0},
		{1,1,0,0,0,0,0,0,0,0},
		{1,1,1,1,1,1,1,1,0,0},   //E
		{1,1,1,1,1,1,1,1,0,0},
		{1,1,0,0,0,0,0,0,0,0},
		{1,1,0,0,0,0,0,0,0,0},
		{1,1,1,1,1,1,1,1,1,0},
		{1,1,1,1,1,1,1,1,1,0}
	},
	{
		{0,0,1,1,1,1,1,1,0,0},
		{0,1,1,1,1,1,1,1,1,0},
		{0,1,1,0,0,0,0,0,1,0},
		{0,1,1,0,0,0,0,1,1,0},
		{0,1,1,0,1,1,1,0,0,0},
		{0,1,1,0,1,1,0,0,0,0},
		{0,1,1,0,0,0,1,0,0,0},
		{0,1,1,0,0,0,0,1,0,0},    //R
		{0,1,1,0,0,0,0,0,1,0},
		{0,1,1,0,0,0,0,0,0,1}
	}
};


void CLogo::initialize()
{
	for (int i=0; i&lt;RoverWordCount; i++)
	{
		for (int r=0; r&lt;PatternSize; r++)
		{
			rover[i][r].setLength(PatternSize);
			for (int c=0; c&lt;PatternSize; c++)
			{
				rover[i][r][c].setValue(patterns[i][r][c]==1?roverLetters[i]:0);
			}
		}
	}
}

CLogo::CLogo()
{
	initialize();
}
				
void CLogo::show()
{
	for (int i=0; i&lt;RoverWordCount; i++)
	{
		if (i&lt;4)
		{
			showWord(i, DefaultLogo_x+ i*(PatternSize+2), DefaultLogo_y);
		}
		else
		{
			showWord(i, DefaultLogo_x+(i-4)*(PatternSize+2), DefaultLogo_y+PatternSize+1);
		}		
	}
}

void CLogo::showWord(int index, int x, int y)
{
	for (int i=0; i&lt;PatternSize; i++)
	{
		rover[index][i].display(x, y+i);
	}
}





</pre>
<pre>　</pre>
<pre>　</pre>
<pre><font size="3" color="#FF0000"><b>f<span lang="en-ca">ile name: </span>scoreboard.h</b></font></pre>
<pre>#ifndef SCOREBOARD_H
#define SCOREBOARD_H
#include &quot;RoverType.h&quot;
#include &quot;tiles.h&quot;
#include &quot;frame.h&quot;

class CScoreBoard
{
private:
	CTiles scores[2][3];
	//CFrame frame(DefaultScoreBoard_X-1, DefaultScoreBoard_Y-1, 3+2,	DefaultScoreBoardWidth*2+2);
	CFrame frame;
	void initialize();
	int turn;
	/*
	CTile* tiles;
	int len;
	WORD ftColor;
	WORD bkColor;
	bool isVertical;
	
	*/
	void doSetName(int index, char* theName);
public:
	CScoreBoard();
	void setPlayerName(char *first, char*second);
	void setPlayerScore(int theScore);
	void switchCurrentPlayer();
	void show();
};

#endif</pre>
<pre>　</pre>
<pre>　</pre>
<pre><font size="3" color="#FF0000"><b>f<span lang="en-ca">ile name: </span>scoreboard.cpp</b></font></pre>
<pre>#include &quot;ScoreBoard.h&quot;

CScoreBoard::CScoreBoard()
{
	initialize();
}

void CScoreBoard::initialize()
{
	turn=0;
	frame.setFrame(DefaultScoreBoard_X, DefaultScoreBoard_Y, 3,
		DefaultScoreBoardWidth*2);
	frame.show();
	for (int c=0; c&lt;2; c++)
	{
		for (int r=1; r&lt;3; r++)
		{
			scores[c][r].setNumber(0);
		}
	}
}

void CScoreBoard::doSetName(int index, char* theName)
{
	scores[index][0].setValue(theName);
}

void CScoreBoard::setPlayerName(char* first, char* second)
{
	doSetName(0, first);
	doSetName(1, second);
}
	
void CScoreBoard::show()
{
	scores[turn][0].setBKGroundColor(DefaultSelectedPlayerBKColor);
	for (int c=0; c&lt;2; c++)
	{
		for (int r=0; r&lt;3; r++)
		{
			scores[c][r].display(DefaultScoreBoard_X+c*DefaultScoreBoardWidth, 
				DefaultScoreBoard_Y+r);
		}
	}
	frame.show();
}

void CScoreBoard::switchCurrentPlayer()
{
	scores[turn][0].setBKGroundColor(DefaultBKGroundColor);
	turn=(turn+1)%2;
	scores[turn][0].setBKGroundColor(DefaultSelectedPlayerBKColor);
}

void CScoreBoard::setPlayerScore(int theScore)
{
	int total;
	total=scores[turn][2].getNumber();
	scores[turn][1].setNumber(theScore);
	scores[turn][2].setNumber(theScore+total);
}


/*
CScoreBoard::CScoreBoard(const char* str)
{
}
*/
/*
void CScoreBoard::setPlayerName(CTiles player[], char *playerName)
{
}
void CScoreBoard::setPlayerScore(CTiles player[], char *score[])
{
}

void CScoreBoard::showScoreBoard(CTiles player1[], CTiles player2[], bool player1_playing)
{
}

void CScoreBoard::paintFrame(CTiles frame)
{
}

void CScoreBoard::paintBackground(CTiles background)
{
}

void CScoreBoard::paintFrame(CTiles frame)
{
}

void CScoreBoard::paintBackground(CTiles background)
{
}

void CScoreBoard::switchCurrentPlayer(bool &amp;player1_playing)
{
}
*/
</pre>
<pre>　</pre>
<pre></pre>
<div align="left">
  <pre><font size="3" color="#FF0000"><b>f<span lang="en-ca">ile name: </span></b></font><font size="3" color="#FF0000"><b><span lang="en-ca">main</span></b></font><font size="3" color="#FF0000"><span lang="en-ca"><b>.</b></span><b>cpp(main)</b></font></pre>
</div>
<pre>#include &quot;tokens.h&quot;
#include &quot;tiles.h&quot;
#include &quot;board.h&quot;
#include &quot;block.h&quot;
#include &quot;listener.h&quot;
#include &quot;rummy.h&quot;
#include &quot;dictionary.h&quot;
#include &quot;background.h&quot;
#include &quot;deck.h&quot;
#include &quot;rack.h&quot;
#include &quot;bag.h&quot;
#include &quot;player.h&quot;
#include &quot;control.h&quot;
#include &quot;logo.h&quot;
#include &quot;scoreBoard.h&quot;


//#include &lt;iostream&gt;
//using namespace std;



int  main()
{

	
//	const int Size=14;
	
/*
	char** matrix;
	
	matrix=new char*[Size];
	for (int i=0; i&lt;Size; i++)
	{
		matrix[i]=new char[Size];
		for (int j=0; j&lt;Size; j++)
		{
			matrix[i][j]='A'+i+j;
		}
	}
	
	CBoard C(Size);
	//normally display a string
	C.placeWord(5, 4, &quot;first&quot;);
	C.update();//with updates, change color to normal
	//C.display(1,1);
	//try to place a string which will exceed bounds
	C.placeWord(6, 5, &quot;invisable&quot;);
	C.update();
	//update with &quot;roll back&quot; and erase it
	//C.update(true);
	//so you see nothing of this new string
	//C.display(1,1);
	//place a third string for comparison and vertically
	C.placeWord(2, 7, &quot;vertical&quot;, true);
	C.update();
	//C.update();
	C.placeWord(7, 5, &quot;newstring&quot;);
	C.update();
	C.placeWord(8, 3, &quot;third&quot;);
	C.update();
	C.placeWord(9, 6, &quot;fourth&quot;);
	//so you will see 1st, 3rd string
	C.display(1,1);

	CTiles D;
	char* ptr;
	int i=0;
	while ((ptr=C.getNextStr())!=NULL)
	{
		D.setValue(ptr);
		D.display(18, 37+i);
		i++;
	}
*/
	//CListener C;
	//CToken T;
	//T.setNumber(C.listenMenu());
	//T.display(10, 10);

	//CTokens tokens;//(C.listenStr());
	//tokens.setValue(C.listenStr());
	//tokens.display(1, 15);
	/*
	const int len=3;
	CTiles ok(&quot;ok&quot;);
	CToken tokens[len];
	/*
	for (int i=0; i&lt;len; i++)
	{
		tokens[i].setNumber((i+1)*2);
		tokens[i].setSuit(
	}

	tokens[0].setNumber(7);
	tokens[0].setSuit(Spade);
	tokens[1].setNumber(7);
	tokens[1].setSuit(Heart);
	tokens[2].setNumber(7);
	tokens[2].setSuit(Diamond);
	CRummy R;
	if (R.verify(tokens, 3))
	{
		ok.display(1,1);
	}

	for (int i=0; i&lt;len; i++)
	{
		tokens[i].display(i*4+3, 5);
	}
		*/
	//char buffer[15]={'a','B', 'c', 'g','x', 'u','o','\0'};
	//CTiles C(&quot;ok&quot;);
	//Dictionary D(false);
	//D.readFile(&quot;wordsource.txt&quot;);
	//CDeck deck;
	//deck.setFace();
	//deck.display(5, 5);
	/*
	for (int i=0; i&lt;4; i++)
	{
		CToken token;
		token.setValue(buffer[i]);
		deck.addCard(token);
	}
	//deck.setFace(false);
	
	//deck.
	
	//deck.display(15,15);
	CToken card;
	card.setValue('B');
	//card.display(23, 23);
	deck.shuffle();
	deck.showHand();
	*/
	/*
	CRack C;
	CToken token;
	int i=0;
	while (C.canAdd())
	{
		token.setValue(buffer[i]);

		C.AddToken(token);
		i++;
	}
	C.showRack();

	C.SelectToken(3);
	C.SelectToken(5);
	C.addExchanged('A');
	C.SelectToken(0);
	C.SelectToken(5);
	CTiles t(C.exportSelected());
	t.display(10,10);
	//C.updateRack();
	C.showRack();

	t.setNumber(C.exchangedIndex);
	t.display(5,5);
	*/
	//CBag C;
	//CToken hold;
	
	//C.display(0,0);
	//C.showBag();
	/*
	int x=0, y=0;
	CToken token;

	while (C.getToken(token))
	{
		x+=6;
		if (x&gt;100)
		{
			x=0;
			y+=6;
		}
		//hold.setValue(token.setValue())
		//hold.display(2,2);
		token.display(x,y);
		if (x&gt;15)
			break;
		
	}
	C.showBag();

	CPlayer P;
	CListener C;
	P.display();
	CToken t;
	int i=Heart;
	while (P.canAddCard())
	{
		t.setSuit(i%4+Heart);
		t.setNumber(i+1);
		P.addCard(t);
		i=C.listenMenu();
	}
	while (P.canAddLetter())
	{
		t.setValue(i+'B');
		P.addLetter(t);
		i=C.listenMenu();
	}
*/

	CControl C;
	C.setInputFile(&quot;c:\\readme.txt&quot;);
	C.startLogo();
	C.startGame();
	C.playGame();
	//C.startLogo();
/*
	int test[2][3][3]=
	{
		{ {1,2,3},{4,5,6}, {7,8,9}},
		{ {1,2,3},{4,5,6},{7,8,9}}
	};
	*/
	return 0;


}

</pre>
<pre>

</pre>
<pre></pre>
<pre></pre>
<pre></pre>
<pre></pre>
<pre><font color="#0000FF"><b><span lang="en-ca">The input is something like following:</span></b></font></pre>
<pre><font color="#0000FF"><b>Here is the <a name="result"></a><a name="result" href="picture/Console.JPG">result:</a></b></font></pre>

<p>　</p>

<pre></pre>

<pre></pre>

<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;                                   
&nbsp;&nbsp;&nbsp; <a href="WhoAmI.htm">                  







                       <img src="picture/back.gif" style="border: medium none" alt="back.gif (341 bytes)" width="32" height="35"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
<a href="index.htm">
<img src="picture/up.gif" style="border: medium none" alt="up.gif (335 bytes)" width="35" height="32"></a>       &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;                         
<img src="picture/next.gif" style="border: medium none" alt="next.gif (337 bytes)" width="32" height="35">          


</p>

</body>

</html>