java实现井字棋 人工智能_【图片】反射算法井字棋程序【人工智能吧】_百度贴吧...

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

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);

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值