该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
TicTacToe.h 部分代码:
#define USER1
#define COMPUTER2
class position//二维坐标
{
public:
intx;
inty;
position(){ x = 0; y = 0; }
position(intx,inty)
{
this->x= x; this->y= y;
}
inttoNum()//将坐标转化为一个数
{
return3 * x + y;
}
boolequal(position p)
{
returnx == p.x&&y == p.y;
}
boolequal(int x,inty)
{
returnthis->x== x&&this->y== y;
}
};
class solution//方案:记录三步棋的位置 以及 权值(反映方案可行性的指标)
{
public:
position positions[3];//三步棋的位置
intweight = 0;//权值(反映方案可行性的指标)
solution()
{
positions[0]=positions[1] = positions[2] =*newposition();
}
solution(position a, position b, position c)
{
positions[0]=a;
positions[1]=b;
positions[2]=c;
}
};
position num2pos(intn)//数字转坐标
{
return*newposition(n / 3, n% 3);
}
std::stringnum2str(int a,intb,intc)
{
std::string s = "000";
s[0]+= a; s[1]+= b; s[2]+= c;
returns;
}
std::stringpos2str(position p1,position p2, position p3)
{
std::string s = num2str(p1.toNum(),p2.toNum(),p3.toNum());
returns;
}
int* getBoardPos(int*board,position p)//根据坐标返回棋盘格(指针)
{
returnboard+(p.x*3+p.y);
}
int* getBoardPos(int*board,intx,inty)
{
returnboard+ x * 3 + y;
}
solution* getSolution(solution *experience,intnum)//相当于返回experience[num]的内存地址
{
returnexperience+ num;
}
void experienceSort(solution *experience) //给经验数组按照可行性由大到小排序
{
for(inti = 0; i <83; i++)
{
for(intj = i + 1; j < 84; j++)
{
solution *exp_i = experience + i;
solution *exp_j = experience + j;
if(exp_i->weight < exp_j->weight)
{
solution t = *exp_j;
*exp_j=*exp_i;
*exp_i=t;
}
}
}
}
//下面这个函数用于根据三步棋的位置,找出对应的方案
solution* getSolution(position a, position b, position c,solution *experience)
{
for(inti = 0; i < 84; i++)
{
solution *CurrentSolution = experience+ i;
if(CurrentSolution->positions[0].equal(a)&& CurrentSolution->positions[1].equal(b)
&&CurrentSolution->positions[2].equal(c))
returnCurrentSolution;
}
return0;
}
bool isWin(int*board,intplayer)//判断用户或电脑是否取得胜利
{
for(inti = 0; i <= 2; i++)
{
if(*getBoardPos(board,i,0)== player&&*getBoardPos(board, i, 1) == player&&*getBoardPos(board, i, 2) == player)
returntrue;//连成一行
if(*getBoardPos(board, 0, i) == player&&*getBoardPos(board, 1, i) == player&&*getBoardPos(board, 2, i) == player)
returntrue;//连成一列
}
if(*getBoardPos(board, 0, 0) == player&&*getBoardPos(board, 1, 1) == player&&*getBoardPos(board, 2, 2) == player)
returntrue;//对角线
if(*getBoardPos(board, 2, 0) == player&&*getBoardPos(board, 1, 1) == player&&*getBoardPos(board, 0, 2) == player)
returntrue;//对角线
returnfalse;
}
bool isDraw(int*board)//平局
{
if(isWin(board,USER)== false && isWin(board,COMPUTER) == false) returntrue;
elsereturnfalse;
}
bool isTrue(int*board,solution *sol,intoccupier)//判断当前棋盘状态是否是方案sol描述的一样
{
//方案sol里面的三个棋盘格都被occupier(电脑或用户)给占领了,就返回true
for(inti = 0; i <= 2; i++)
{
if(*getBoardPos(board, sol->positions[i])!=occupier)//三步棋
returnfalse;
}
returntrue;
}
void record(position*history,intx,inty)//记录电脑/用户当前下棋的位置
{
*history=*newposition(x, y);
}