1、人工智能剪枝实现的一字棋实验报告DOC实验5:八剪枝实现一字棋、实验目的学习极大极小搜索及 剪枝算法实现一字棋、实验原理1.游戏规则一字棋游戏(又叫三子棋或井字棋),是一款十分经典的益智小游戏。井字棋的棋盘很简单,是一个 3X3的格子,很像中国文字中的井字,所 以得名井字棋。井字棋游戏的规则与五子棋十分类似,五子棋的规则是 一方首先五子连成一线就胜利;井字棋是一方首先三子连成一线就胜利。2.极小极大分析法设有九个空格,由 MAX,MIN二人对弈,轮到谁走棋谁就往空格上放一OXOOOXX某人的棋子),谁就取得了胜利只自己的棋子,谁先使自己的棋子构成 三子成一线(同一行或列或对角线全是用圆圈表示
2、MAX,用叉号代表 MIN比如左图中就是MAX取胜的棋局。e(P)。估价函数定义如下设棋局为 P,估价函数为(1) 若P对任何一方来说都不是获胜的位置,贝U e(P)=e(那些仍为MAX空 着的完全的行、列或对角线的总数)-e(那些仍为MIN空着的完全的行、列或对 角线的总数)(2) 若P是MAX 必胜的棋局,则 e(P)= +:(实际上赋了 60)。OXe(P)=5-4=1比如P如下图示,则 若P是B必胜的棋局,则e(P)=-:(实际上赋了 -20)需要说明的是,赋60,二赋-20的原因是机器 若赢了,则不论玩家下一步是否会赢,都会走这步必 赢棋。3.=-剪枝算法上述的极小极大分析法,实际是
3、先生成一棵博弈树,然后再计算其倒推值, 至使极小极大分析法效率较低。于是在极小极大分析法的基础上提出了 剪枝技术。a邛剪枝技术的基本思想或算法是,边生成博弈树边计算评估各节点的倒 推值,并且根据评估出的倒推值范围,及时停止扩展那些已无必要再扩展的子节 点,即相当于剪去了博弈树上的一些分枝, 从而节约了机器开销,提高了搜索效率。具体的剪枝方法如下:(1)对于一个与节点 MIN,若能估计出其倒推值的上确界 ,并且这个1值不大于 MIN的父节点(一定是或节点)的估计倒推值的下确界 ,即、;_:, 则就不必再扩展该 MIN节点的其余子节点了(因为这些节点的估值对 MIN父 节点的倒推值已无任何影响了)
4、。这一过程称为:-剪枝。(2)对于一个或节点 MAX,若能估计出其倒推值的下确界:,并且这个: 值不小于 MAX的父节点(一定是与节点)的估计倒推值的上确界,即, 则就不必再扩展该 MAX节点的其余子节点了 (因为这些节点的估值对 MAX 父节点的倒推值已无任何影响 了)。这一过程称为一:剪枝。从算法中看到:(1)MAX节点(包括起始节点)的值永不减少;(2)MIN节点(包括起始节点)的一:值永不增加。在搜索期间,丄和厶值的计算如下:(1)一个MAX节点的:-值等于其后继节点当前最大的最终倒推值。(2)一个MIN节点的一:值等于其后继节点当前最小的最终倒推值。4.输赢判断算法设计因为每次导致输
5、赢的只会是当前放置的棋子 ,输赢算法中只需从当前点开始 扫描判断是否已经形成三子。对于这个子的八个方向判断是否已经形成三子。 如 果有,则说明有一方胜利,如果没有则继续搜索,直到有一方胜利或者搜索完整 个棋盘。void PrintQP() /打印棋盘当前状态for(int i=0;i3;i+)for(i nt j=0;j3;j+)cout no wijt:coute ndl;void playerinput() /用户通过此函数来输入落子的位置,比如:用户输入3 1,则表示用户在第 3行第1列落子。if( no wi0=1 &n owi1=1 &no wi2=1)|( no w0i=1 &n
6、ow1i=1 &now 2i=1)|( no w00=1 &n ow11=1 &no w22=1)|( now20=1 &n ow11=1 &n ow02=1) II正方行连成线return 1;if( no wi0=-1 &no wi1=-1 &no wi2=-1)|( now0i=-1 &no w1i=-1 &no w2i=-1)|( now00=-1 &no w11=-1 &n ow22=-1)|( no w20=-1 &for(i nt j=0;j3;j+)/人一方/将棋盘中的空格填满自己的棋子,/flag记录本层的极值,temp记录下if(no wij=O)tmpQPij=1;els
7、etmpQPij=nowij;for(int i=0;i3;i+) II计算共有多少连成 3个1的行p+=(tmpQPi0+tmpQPi1+tmpQPi2)/3;for(int i=0;i3;i+) /计算共有多少连成 3个1的列p+=(tmpQP0i+tmpQP1i+tmpQP2i)/3;p+=(tmpQP00+tmpQP11+tmpQP22)/3; / 计算共有多少连成 3 个 1 的对角线p+=(tmpQP20+tmpQP11+tmpQP02)/3;for(int i=0;i3;i+) 既将棋盘数组中的 0变为-1for(i nt j=0;j3;j+)if(no wij=0) tmpQP
8、ij=-1;elsetmpQPij=no wij;for(int i=0;i3;i+)q+=(tmpQPi0+tmpQPi1+tmpQPi2)/3; for(int i=0;iflag)flag=temp;if(flag=val)out=true;/根据上一个结点是否为上确界,用本层的if(max)极值修改上一个结点的估计值if(flagval) val=flag; elseif(flagval)val=flag;return flag; /函数返回的是本层的极值 m 用来存放最大的 val/记录最佳走步的坐标int computer()int m=-10000,val=-10000,dep=
9、1;int x_pos,y_pos;char ch;cout ch;while(ch!=y&ch!= n)cout非法输入!您希望先走吗(y/n) ch;system(cls);In it();cout棋盘如下:endl;Prin tQP();if(ch=n) /计算机先走L5:for(i nt x=0;x3;x+)for(i nt y=0;y3;y+)if(no wxy=O)now xy=1;cut(val,dep,1); /计算机试探的走一步棋,棋盘状态改变了,在该状态下计算出深度为 dep-1的棋盘状态估计值 valif(Checkwi n()=1)cout电脑将棋子放在:x+1y+1e
10、ndl;Prin tQP();cout电脑获胜!游戏结束.endl;return 0;大估计值m=val;x_pos=x;y_pos=y;val=-10000;now xy=O;no wx_posy_pos=1;val=-10000;m=-10000;dep=1;cout电脑将棋子放在:x_pos+1y_pos+1endl;Prin tQP();coute ndl;nu m+;value();if(p=O)cout平局!endl;return 0;playerinput(); / 玩家走一步棋Prin tQP();coute ndl;nu m+;value();if(p=0)cout平局!en
11、dl;return 0;if(Checkwi n()=_1)cout您获胜!游戏结束.endl;return 0;goto L5;else /人先走L4: playeri nput();Prin tQP();coute ndl;nu m+;value();if(q=0)cout平局!endl;return 0;if (Checkwi n()=-1)cout您获胜!游戏结束.endl;return 0;for(i nt x=0;x3;x+)for(i nt y=0;y3;y+)if(no wxy=O)now xy=1;cut(val,dep,1);if(Checkwi n()=1)cout电脑将
12、棋子放在:x+1y+1endl;Prin tQP();cout电脑获胜!游戏结束.m)m=val;x_pos=x;y_pos=y;val=-10000;now xy=O;no wx_posy_pos=1;val=-10000;m=-10000;dep=1;cout电脑将棋子放在:x_pos+1y_pos+1endl;Prin tQP();coute ndl;nu m+;value();if(q=0)cout平局!endl;return 0;goto L4;return 0;int mai n()computer();system(pause);return 0;4.主要函数1估值函数估价函数:
13、int CTic_MFCDIg:evaluate(int board)完成功能:根据输入棋盘,判断当前棋盘的估值,估价函数为前面所讲:若是 MAX 的必胜局,则 e = +INFINITY,这里为+60若是MIN的必胜局,则e = -INFINITY,这里为-20,这样赋值的原 因是机器若赢了,则不考虑其它因素。其它情况,棋盘上能使 CUMPUTER成三子一线的数目为 el 棋盘上能使PLAYER成三子一线的数目为e2, e1-e2作为最终权值参数: board待评估棋盘返回: 评估结果2.Alpha-Beta 剪枝算法AlphaBeta剪枝主函数:int CTic_MFCDIg:AlphaB
14、eta(int Board, int Depth, int turn, int Alpha, int Beta, int *result)完成功能:根据输入棋盘,搜索深度,及其他参数,给出一个相应的最优解,存入 result 中。参数:board :待评估棋盘Depth :搜索深度turn :当前是机器走(MAX 结点)还是玩家走(MIN结点)Alpha :alpha值,第一次调用默认-100Beta :beta值,第一次调用默认+100result :输出结果返回:若当前点为MAX节点,则返回alpha值;3 .判断胜负int CTic_MFCDIg:isWi n(i nt curPos)完
15、成功能:根据输入棋盘,判断当前棋盘的结果, COMPUTER胜? PLAYER胜?平局?参数:board待评估棋盘返回:-1表示:尚未结束0表示:平局1 表示:PLAYER 胜2 表示:COMPUTER 胜五、实验截图G:W.exe10-1 -1 -1 0 10 0电脑将棋子放在二羽10-1 -1 -1 110 8请输入您的棋子位置“必3 31 0 -1-1 -1 110-1电脑将棋子放在M21 1 1-1 -1 110-1平局F请按任意键继绫六、实验总结通过本次实验进一步对老师课堂上所讲的:-剪枝有了更加深刻的了解,对 它的一般实现有了初步的认识。搜索深度并非越深越好,局限于估值函数是根据能够成三子一线的数目决定 的,所以搜索到最后一层,如果有人胜,则出现 :,如果没人胜,则三子一 线数目为0,所以毫无意义。这也是为什么大多数情况下都是平局的原因。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1