欢迎来到天天文库
浏览记录
ID:15962101
大小:37.00 KB
页数:11页
时间:2018-08-06
《基于字符界面的井字棋》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、基于字符界面的井字棋/*代码作者:周翔代码功能:基于字符界面的井字棋人机交互程序。说明:对状态空间采用最大最小值搜索技术。计算机在生成的子节点中选择评估函数值最大的节点;而计算机在选择着数时使“人”选择评估函数值最小的节点,也就是对计算机一方最不利的节点。*/#includeusingnamespacestd;inttmpQP[3][3];//表示棋盘数据的临时数组,其中的元素0表示该格为空,//1表示计算机放下的子,-1表示人放下的子。constintMAX_NUM=1000;//扩展生成状态节点
2、的最大数目constintNO_BLANK=-1001;//表示没有空格constintTREE_DEPTH=3;//搜索树的最大深度,如果增加此值可以提高计算机的“智力”,//但同时也需要增加MAX_NUM的值。constintNIL=1001;//表示空staticints_count;//用来表示当前分析的节点的下标structState//该结构表示棋盘的某个状态,也可看做搜索树中的一个节点{intQP[3][3];//棋盘格局inte_fun;//当前状态的评估函数值intchild[9];//儿女节点的下标
3、intparent;//双亲节点的下标intbestChild;//最优节点(评估函数值最大)的儿女节点下标}States[MAX_NUM];//用来保存搜索树中状态节点的数组voidInit()//初始化函数,当前的棋盘格局总是保存在States[0]中{s_count=0;for(inti=0;i<3;i++)for(intj=0;j<3;j++)States[0].QP[i][j]=0;//将棋盘清空States[0].parent=NIL;//初始节点没有双亲节点}voidPrintQP()//打印当棋盘格局的
4、函数{for(inti=0;i<3;i++){for(intj=0;j<3;j++)cout<5、=-1)return-1;}for(i=0;i<3;i++){if(s.QP[0][i]==1&&s.QP[1][i]==1&&s.QP[2][i]==1)return1;if(s.QP[0][i]==-1&&s.QP[1][i]==-1&&s.QP[2][i]==-1)return-1;}if((s.QP[0][0]==1&&s.QP[1][1]==1&&s.QP[2][2]==1)6、7、(s.QP[2][0]==1&&s.QP[1][1]==1&&s.QP[0][2]==1))return1;if((s.QP[0][8、0]==-1&&s.QP[1][1]==-1&&s.QP[2][2]==-1)9、10、(s.QP[2][0]==-1&&s.QP[1][1]==-1&&s.QP[0][2]==-1))return-1;return0;}inte_fun(States)//评估函数{boolflag=true;for(inti=0;i<3;i++)for(intj=0;j<3;j++)if(s.QP[i][j]==0)flag=false;if(flag)returnNO_BLANK;if(IsWin(s)==-1)return-MAX_N11、UM;//如果计算机输了,返回最小值if(IsWin(s)==1)returnMAX_NUM;//如果计算机赢了,返回最大值intcount=0;//该变量用来表示评估函数的值//将棋盘中的空格填满自己的棋子,既将棋盘数组中的0变为1for(i=0;i<3;i++)for(intj=0;j<3;j++)if(s.QP[i][j]==0)tmpQP[i][j]=1;elsetmpQP[i][j]=s.QP[i][j];//电脑一方//计算每一行中有多少行的棋子连成3个的for(i=0;i<3;i++)count+=(tm12、pQP[i][0]+tmpQP[i][1]+tmpQP[i][2])/3;//计算每一列中有多少列的棋子连成3个的for(i=0;i<3;i++)count+=(tmpQP[0][i]+tmpQP[1][i]+tmpQP[2][i])/3;//斜行有没有连成3个的?count+=(tmpQP[0][0]+tmpQP[1][1]+t
5、=-1)return-1;}for(i=0;i<3;i++){if(s.QP[0][i]==1&&s.QP[1][i]==1&&s.QP[2][i]==1)return1;if(s.QP[0][i]==-1&&s.QP[1][i]==-1&&s.QP[2][i]==-1)return-1;}if((s.QP[0][0]==1&&s.QP[1][1]==1&&s.QP[2][2]==1)
6、
7、(s.QP[2][0]==1&&s.QP[1][1]==1&&s.QP[0][2]==1))return1;if((s.QP[0][
8、0]==-1&&s.QP[1][1]==-1&&s.QP[2][2]==-1)
9、
10、(s.QP[2][0]==-1&&s.QP[1][1]==-1&&s.QP[0][2]==-1))return-1;return0;}inte_fun(States)//评估函数{boolflag=true;for(inti=0;i<3;i++)for(intj=0;j<3;j++)if(s.QP[i][j]==0)flag=false;if(flag)returnNO_BLANK;if(IsWin(s)==-1)return-MAX_N
11、UM;//如果计算机输了,返回最小值if(IsWin(s)==1)returnMAX_NUM;//如果计算机赢了,返回最大值intcount=0;//该变量用来表示评估函数的值//将棋盘中的空格填满自己的棋子,既将棋盘数组中的0变为1for(i=0;i<3;i++)for(intj=0;j<3;j++)if(s.QP[i][j]==0)tmpQP[i][j]=1;elsetmpQP[i][j]=s.QP[i][j];//电脑一方//计算每一行中有多少行的棋子连成3个的for(i=0;i<3;i++)count+=(tm
12、pQP[i][0]+tmpQP[i][1]+tmpQP[i][2])/3;//计算每一列中有多少列的棋子连成3个的for(i=0;i<3;i++)count+=(tmpQP[0][i]+tmpQP[1][i]+tmpQP[2][i])/3;//斜行有没有连成3个的?count+=(tmpQP[0][0]+tmpQP[1][1]+t
此文档下载收益归作者所有