人工智能井字棋的实现Word格式.docx
- 文档编号:20308361
- 上传时间:2023-01-21
- 格式:DOCX
- 页数:19
- 大小:50.39KB
人工智能井字棋的实现Word格式.docx
《人工智能井字棋的实现Word格式.docx》由会员分享,可在线阅读,更多相关《人工智能井字棋的实现Word格式.docx(19页珍藏版)》请在冰豆网上搜索。
显然,中国应当参与到这种战略布局当中,这种布局不仅是国家和民族的需要,而且也是赢得未来的利器。
再厉害的程序员,也是从“helloworld”程序开始写起。
再“聪明”的机器,也是从零样本开始“训练”出来的。
所以今天就来写一个最简单棋类游戏:
TicTacToe,又叫井字棋,大陆、台湾又称为井字游戏、圈圈叉叉;
另外也有打井游戏、OX棋的称呼,香港多称井字过三关、过三关,是种纸笔游戏。
大致说下井字棋的规则:
1.棋盘为3*3共9格,类似汉字“井”;
2.一方为o,一方为x,轮流落子;
3.任一方先有连成一条线的3个棋子(横、竖、斜皆可)则为胜利;
4.棋盘摆满仍没有一方胜利,则为平局。
这种游戏实际上是由第一位玩家所控制,第一位玩家是攻,第二位玩家是守。
第一位玩家在角位行第一子的话赢面最大(见图一),第二位玩家若是在边,角位下子,第一位玩家就可以以两粒连线牵制着第二位玩家,然后制造“两头蛇”。
图一
运行
开始的时候,会让你输入你的名字,我则输入我名字的缩写wsh;
接下来,由我们来选择是先下还是后下,1是先下,2是后下;
我们的符号是X,电脑的是O,由于我们选择了先下,我们在3*3的棋盘上先下在第2行第2列;
电脑则下在了第1行第1列,再次由我们决定,如果我们下在了已经有棋子的位置上则会提示你已经下过了;
我们决定下在第1行第3列,电脑则下在第3行第1列,我们需要注意到如果电脑再下到第2行第1列就获得胜利,所以我们需要防守
我们为了防守下在了第2行第1列,电脑又下在了第2行第3列,这时候其实我们可以注意到如果想要胜利只有将第2列连成直线一种方法了;
我们下在了第1行第2列,电脑下在了第3行第2列,这时候已经可以看出是个平局了;
我们把最后一个位置填上,电脑告诉我们这是一个平局,是否还想要再玩;
输入y,电脑让我们再次选择先后手,大家就可以根据自己的想法来试着战胜电脑了。
如果失败了,也会询问你是否再次挑战,如果输入n则会直接跳出;
代码实现
棋盘本身的数据,用inta[3][3]来表示,棋盘中0表示空,1表示我们下的,其余的则是电脑下的;
voidprint()
{
inti,j;
cout<
<
"
\n"
;
for(i=0;
i<
3;
i++)
{
for(j=0;
j<
j++)
if(a[i][j]==0)
.\t"
elseif(a[i][j]==1)
X\t"
else
O\t"
}
endl;
}
检查是否有人获胜,分别是三行,三列,对角线的8种情况
intcheck()
for(inti=0;
if((a[i][0]!
=0&
&
a[i][0]==a[i][1]&
a[i][1]==a[i][2])||(a[0][i]!
a[0][i]==a[1][i]&
a[1][i]==a[2][i]))
return1;
if(a[0][0]!
a[0][0]==a[1][1]&
a[1][1]==a[2][2])
elseif(a[0][2]!
a[0][2]==a[1][1]&
a[1][1]==a[2][0])
return0;
我们下棋的时候,下第几行第几列,如果输入大于2或者小于0提示输入正确的数字,如果下的位置已经被下过了提示这里已经被下过了;
voidpin()
intr=0,c=0;
Enterrow:
"
cin>
>
r;
Entercolumn:
c;
r--;
c--;
if(r>
2||c>
2||r<
0||c<
0)
strcpy(str,"
Entercorrectvalue"
);
strcat(str,name);
strcat(str,"
.\n"
puts(str);
pin();
elseif(a[r][c]!
=0)
Itisalreadyfilled.\n"
a[r][c]=t;
电脑的防守策略,即我们选择先手时电脑的应对策略
intdefend(intc,intp,intb)
if(b<
3)
elseif(a[0][0]+a[1][1]+a[2][2]==2*c&
a[0][0]!
=p&
a[1][1]!
a[2][2]!
=p)
if(a[i][i]==0)
a[i][i]=y;
Computerturn:
i+1<
elseif(a[0][2]+a[1][1]+a[2][0]==2*c&
a[0][2]!
a[2][0]!
if(a[i][2-i]==0)
a[i][2-i]=y;
3-i<
if(a[i][0]+a[i][1]+a[i][2]==2*c&
a[i][0]!
a[i][1]!
a[i][2]!
a[i][j]=y;
j+1<
elseif(a[0][i]+a[1][i]+a[2][i]==2*c&
a[0][i]!
a[1][i]!
a[2][i]!
if(a[j][i]==0)
a[j][i]=y;
电脑的进攻策略,即我们选择后手时电脑的落子策略
intattack()//takesamoveastowininfuture.
if(a[0][0]+a[0][2]+a[2][0]+a[2][2]==t||a[0][0]+a[0][2]+a[2][0]+a[2][2]==2*t)
if(a[i][0]+a[i][1]+a[i][2]==y&
(a[i][0]==y||a[i][1]==y||a[i][2]==y))
if(i==1)
for(j=2;
j>
=0;
j--)
if(a[0][i]+a[1][i]+a[2][i]==y&
(a[0][i]==y||a[1][i]==y||a[2][i]==y))
for(i=2;
i>
i--)
if((a[i][0]+a[i][1]+a[i][2]==t&
(a[i][0]==t||a[i][1]==t||a[i][2]==t))&
(a[0][2-i]+a[1][2-i]+a[2][2-i]==t&
(a[0][2-i]==t||a[1][2-i]==t||a[2][2-i]==t)))
if(a[0][0]+a[1][1]+a[2][2]==y&
(a[0][0]==y||a[1][1]==y||a[2][2]==y))
if((a[i][i]==0)&
((a[i][0]+a[i][1]+a[i][2]==y&
(a[i][0]==y||a[i][1]==y||a[i][2]==y))||((a[0][i]+a[1][i]+a[2][i]==y)&
(a[0][i]==y||a[1][i]==y||a[2][i]==y))))
(a[0][i]+a[1][i]+a[2][i]==t&
(a[0][i]==t||a[1][i]==t||a[2][i]==t)))
elseif(a[0][2]+a[1][1]+a[2][0]==y&
(a[0][2]==y||a[1][1]==y||a[2][0]==y))
if(a[i][2-i]==0&
((a[i][0]+a[i][1]+a[i][2]==y&
(a[i][0]==y||a[i][1]==y||a[i][2]==y))||((a[0][2-i]+a[1][2-i]+a[2][2-i]==y)&
(a[0][2-i]==y||a[1][2-i]==y||a[2][2-i]==y))))
for(intj=0;
else{
elseif(a[0][i]+a[1][i]+a[2][i]==y&
电脑的AI运用进攻和防守策略控制其的落子
voidai(intb)
if(!
defend(y,t,b))
defend(t,y,b))
if((a[0][0]+a[0][2]+a[2][0]+a[2][2]==t+y||a[0][0]+a[0][2]+a[2][0]+a[2][2]==t+2*y)&
a[1][1]==0)
i+=2)
j+=2)
gotoend;
elseif(b==2&
a[1][1]=y;
22\n"
attack())
if(b==0)
time_tseconds;
time(&
seconds);
srand((unsignedint)seconds);
a[(rand()%2)*2][(rand()%2)*2]=y;
if(a[i][j]==y)
elseif(a[1][1]==0)
end:
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 人工智能 井字棋 实现