版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、人工智能井字棋的实现学院:信息工程学院 教师:罗会兰 专业:计算机应用技术 学号: 6120160166姓名:王硕豪简介2016年3月9 日,李世石与Alp haGo的人机大战开始。这将成为写入人类史册的一天。计算机AI可以在围棋上战胜人类顶尖棋手的时代已经到来。两个月之后,美国白宫就推动成立了机器学习与人工智能分委会,由其主持和协调撰写了三个关于为人工智能的未来做好准备国家人工智能研究和发展战略计划和人工智能、自动化与经济报告。欧盟、英国和日本等也相继发布了研发和应用人工智能的报告。显然,中 国应当参与到这种战略布局当中,这种布局不仅是国家和民族的需要,而且也是赢得未来的 利器。再厉害的程序
2、员,也是从“hello world ”程序开始写起。再“聪明”的机器,也是从零样本开始“训练”出来的。所以今天就来写一个最简单棋类游戏:Tic Tac Toe ,又叫井字棋,大陆、台湾又称为井字游戏、圈圈叉叉;另外也有打井游戏、 0X棋的称呼,香港多称井字过三关、过三关,是种纸笔游戏。大致说下井字棋的规则:1. 棋盘为3*3共9格,类似汉字“井”;2. 一方为0,方为x,轮流落子;3. 任一方先有连成一条线的 3个棋子(横、竖、斜皆可)则为胜利;第二位玩家是守。第一位玩家在 角位下子,第一位玩家就可4. 棋盘摆满仍没有一方胜利,则为平局。这种游戏实际上是由第一位玩家所控制,第一位玩家是攻,角位
3、行第一子的话赢面最大(见图一),第二位玩家若是在边, 以以两粒连线牵制着第二位玩家,然后制造“两头蛇”。OOX1 0XITTOOXX OX1OXOO0OX 0XXOXXOOOX图一运行wsh;开始的时候,会让你输入你的名字,我则输入我名字的缩写hat is ¥口口片 good name? wsh接下来,由我们来选择是先下还是后下,1是先下,2是后下;Choice i# your'? usbj. u战nna gfo 1st or 2nd?我们的符号是X,电脑的是O,由于我们选择了先下,我们在3*3的棋盘上先下在第2行第2列;lie t * 3start the game.Ent
4、er Enteri*ow: 2 colunn : 2电脑则下在了第1行第1列,再次由我们决定,如果我们下在了已经有棋子的位置上则会提 示你已经下过了;Co nputer- t urn : 1 1X0Enter Enterrow:1CDlunn :3Copiputer turn ;0 Ent" i*ow:我们为了防守下在了第 2行第1列,电脑又下在了第2行第3列,这时候其实我们可以注意 到如果想要胜利只有将第 2列连成直线一种方法了;0Enter Enterrow: 2 column :0 Conputep turn;0K十 P T'_UTLbl我们下在了第行第2列,电脑下在了
5、第 3行第2列,这时候已经可以看出是个平局了;0K0Enter Enterrow : colunn:0K0Gonputer turn ;0Ent"XXQHOU:我们把最后一个位置填上,电脑告诉我们这是一个平局,是否还想要再玩; KXX 0 lie 11 Played! It is A tie.Majina play again wsh y严n?输入y,电脑让我们再次选择先后手,大家就可以根据自己的想法来试着战胜电脑了。llannAasfain usb yn?Okay s:a you think 9011 can beat ne this time Let's see agai
6、in if yciu can_This tine you uanna 90 1st or 2nd* wsli?如果失败了,也会询问你是否再次挑战,如果输入n则会直接跳出;It Manndiisinpossible to be«t ne wsh, you couldn again ws>i y/n?代码实现棋盘本身的数据,用int a33来表示,棋盘中0表示空,1表示我们下的,其余的则是电 脑下的;void print()int i,j;cout<< "n"for (i=0;i<3;i+)for (j=0;j<3;j+)cout<
7、<if (aij=0)".t"elsecout<<if (aij=1)"Xt"elsecout<<"0t"cout<<e ndl;检查是否有人获胜,分别是三行,三列,对角线的int check()for (int i=0;i<3;i+)8 种情况if (ai0!=0&&ai0=ai1&&ai1=ai2)|(a0i!=0&&a0i=a1i&&a1 i=a2i)return 1;if (a00!=0&&a00=a
8、11&&a11=a22) return 1;else if (a02!=0&&a02=a11&&a11=a20)return 1; elsereturn 0;我们下棋的时候, 下第几行第几列, 如果输入大于 2 或者小于 0 提示输入正确的数字, 如果 下的位置已经被下过了提示这里已经被下过了;void pin()int r=0,c=0;cout<< "Enter row: " ;cin>>r;cout<< "Enter column: "cin>>c;r-;
9、c-;if (r>2|c>2|r<0|c<0)strcpy(str, strcat(str,name);"Enter correct value " );strcat(str, puts(str); pin();".n" );else if (arc!=0)cout<< "It is already filled.n"pin();elsearc=t;int电脑的防守策略,即我们选择先手时电脑的应对策略 defend( int c, int p, int b)if (b<3)return 0;e
10、lse if (a00+a11+a22=2*c&&a00!=p&&a11!=p&&a22!=p)for (int i=0;i<3;i+)if (aii=0)aii=y; cout<<"Computer turn: " <<i+1<<" " <<i+1<<endl;return 1;elseif(a02+a11+a20=2*c&&a02!=p&&a11!=p&&a20!=p)for(int i=0
11、;i<3;i+)if (ai2-i=0)ai2-i=y; cout<<"Computer turn: " <<i+1<<" " <<3-i<<endl;return 1;elseinti,j;for(i=0;i<3;i+)if (ai0+ai1+ai2=2*c&&ai0!=p&&ai1!=p&&ai2!=p)for (j=0;j<3;j+)if (aij=0)aij=y; cout<<"Computer tu
12、rn: " <<i+1<<" " <<j+1<<endl;return 1;else if (a0i+a1i+a2i=2*c&&a0i!=p&&a1i!=p&&a2i!=p)for (j=0;j<3;j+)if (aji=0)aji=y;cout<<"Computer turn: " <<j+1<<" " <<i+1<<endl; return 1;return0;
13、电脑的进攻策略,即我们选择后手时电脑的落子策略 intattack() /takes a move as to win in i,j; if(a00+a02+a20+a22=t|a00+a02+a20+a22=2*t)for (i=0;i<3;i+)if( ai0+ai1+ai2=y && (ai0=y|ai1=y|ai2=y) )if (i=1)for(j=0;j<3;j+)aij=y; cout<<if (aij=0)"Computer turn: " <<i+1<<" &q
14、uot; <<j+1<<endl; return 1;elsefor(j=2;j>=0;j-)aij=y; cout<<if (aij=0)if"Computer turn: " <<i+1<<" " <<j+1<<endl; return 1;(a0i+a1i+a2i=y && (a0i=y|a1i=y|a2i=y)if (i=1)for(j=0;j<3;j+)if (aji=0)aji=y;cout<<"Compute
15、r turn: " <<j+1<<" " <<i+1<<endl; return 1;elsefor(j=2;j>=0;j-)if (aji=0)aji=y;cout<<"Computer turn: " <<j+1<<" " <<i+1<<endl; return 1;for (i=2;i>=0;i-)if (ai2-i=0)if (ai0+ai1+ai2=t&&(ai0=t|ai1=t|
16、ai2=t)&&(a02-i+a12-i+a22-i=t&&(a02-i=t|a12-i=t|a22-i=t)ai2-i=y;cout<<"Computer turn: " <<i+1<<" " <<3-i<<endl; return 1;elseiffor (i=2;i>=0;i-)if (ai2-i=0)ai2-i=y;cout<<"Computer turn: " <<i+1<<" &q
17、uot; <<3-i<<endl; return 1;(a00+a11+a22=y && (a00=y|a11=y|a22=y)for (i=2;i>=0;i-)if (aii=0)&&(ai0+ai1+ai2=y&&(ai0=y|ai1=y|ai2=y)|( (a0i+a1i+a2i=y)&&(a0i=y|a1i=y|a2i=y)aii=y;cout<<"Computer turn: " <<i+1<<" " <<
18、;i+1<<endl; return 1;for (i=2;i>=0;i-)if (aii=0)if (ai0+ai1+ai2=t&&(ai0=t|ai1=t|ai2=t)&&(a0i+a1i+a2i=t&&(a0i=t|a1i=t|a2i=t)aii=y; cout<<"Computer turn: " <<i+1<<" " <<i+1<<endl; return 1;for (i=2;i>=0;i-)if (aii=0)
19、aii=y; cout<<"Computer turn: " <<i+1<<" " <<i+1<<endl; return 1;else if ( a02+a11+a20=y && (a02=y|a11=y|a20=y)for (i=2;i>=0;i-)if (ai2-i=0&&(ai0+ai1+ai2=y&&(ai0=y|ai1=y|ai2=y)|(a02-i+a12-i+a22-i=y)&&(a02-i=y|a12-i=y
20、|a22-i=y)ai2-i=y;cout<<"Computer turn: " <<i+1<<" " <<3-i<<endl; return 1;for (i=2;i>=0;i-)if (ai2-i=0)if (ai0+ai1+ai2=t&&(ai0=t|ai1=t|ai2=t)&&(a02-i+a1 2-i+a22-i=t&&(a02-i=t|a12-i=t|a22-i=t) ai2-i=y; cout<<"Comp
21、uter turn: " <<i+1<<" " <<3-i<<endl;return 1;for (i=2;i>=0;i-)ai2-i=y;cout<<if (ai2-i=0)"Computer turn: " <<i+1<<" " <<3-i<<endl; return 1;elsefor (i=0;i<3;i+)if ( ai0+ai1+ai2=y && (ai0=y|ai1=y|ai2
22、=y) )if (i=1)for (int j=0;j<3;j+)if (aij=0)aij=y;cout<<"Computer turn: " return 1;<<i+1<< " " <<j+1<<endl;else for (j=2;j>=0;j-)aij=y; cout<<if (aij=0)<<i+1<< " " <<j+1<<endl;"Computer turn: "re
23、turn 1;else if (a0i+a1i+a2i=y &&(a0i=y|a1i=y|a2i=y)if (i=1)for (j=0;j<3;j+)if (aji=0)aji=y;cout<<"Computer turn: " return 1;<<j+1<< " " <<i+1<<endl;elsefor (j=2;j>=0;j-)if (aji=0)aji=y; cout<<"Computer turn: " return 1;<<j+1<< " " <<i+1<<endl;return0;电脑的 AI 运用进攻和防守策略控制其的落子void ai( int b)if (!defend(y,t,b)if (!defend(t,y,b)if (a00+a02+a20+a22=t+y|a00+a02+a20+a22=t+2*y)&&a11=0)for
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论