资源描述:
《五子棋人机对战代码》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、8.2电脑下棋算法设计本款游戏最核心的地方就是算法,因为这是整个程序最难的模块。算法的中心思想是:利用分数代表每个位置的重要程度,越重要的位置的分数值会越高,当电脑下棋时会先将电脑和玩家棋型的分数分别计算一遍,然后选择二者中分数最高的点下子。如果玩家的分数高,那么代表电脑应该防守,如果电脑的分数高,那么代表电脑应该进攻。具体的分数值赋值如下:分数电脑玩家活二6050半活二4035死二1010半死二1010活三950700半活三900650死三100100半死三100100活四60003500半活四50003000死四4000800半死四360075
2、0活五2000015000半活五100003300死五2000015000半死五100003300解释一下其中的活,半活,死,半死:活:代表几个子是相连的,中间没有空格,两端都至少有一个空格。半活:代表几个子不是相连的,几个子中间有一个空格,两端都至少有一个空格。死:代表几个子是相连的,中间没有空格,但有一端紧挨着对方的棋子或有一端正好在棋盘的边界。半死:代表几个子不是相连的,几个子中间有一个空格,而且一端紧挨着对方的棋子或有一端正好在棋盘的边界。每个位置的分数的计算方式是各个方向的分数相加,最后找出电脑棋型和玩家棋型的分数的最高的位置为电脑的下棋
3、点下棋。具体的代码如下:publicvoidqixing(){for(inti=0;i<17;i++){for(intj=0;j<17;j++){if(qipan[i+1][j+1]==0){//说明此处没有棋子qixingPC[i][j]=heiheng(i,j,2)+heishu(i,j,2)+heizuoxie(i,j,2)+heiyouxie(i,j,2);qixingPlayer[i][j]=heiheng(i,j,1)+heishu(i,j,1)+heizuoxie(i,j,1)+heiyouxie(i,j,1);}else{qixin
4、gPC[i][j]=0;qixingPlayer[i][j]=0;}}}}//算出黑子横方向的棋型数值publicintheiheng(inthang,intlie,intnum){intk=0;//记录空白处的个数intcount=1;//记录可以形成几连intn=hang+1;//对应棋盘的行intm=lie+1;//对应棋盘的列booleanleft=false;//判断左边是否有黑子booleanliveLeft=false;//判断左边是活还是死booleanliveRight=false;//判断右边是活还是死while((qipan[
5、n][m-1]!=-1)&&(qipan[n][m-1]==num
6、
7、qipan[n][m-1]==0)){if(qipan[n][m-1]==0&&k<1){//第一个空白if(qipan[n][m-2]!=num){liveLeft=true;break;}k++;m--;}elseif(qipan[n][m-1]==num){//黑子left=true;m--;}else{//第二个空白liveLeft=true;break;}}if(!left){k=0;m=lie+1;}while((qipan[n][m+1]!=-1)&&(qipan[
8、n][m+1]==num
9、
10、qipan[n][m+1]==0)){intt=qipan[n][m+1];if(m==lie){count++;m++;continue;}if(t==0&&k<1){//第一个空白if(qipan[n][m+2]!=num){liveRight=true;break;}k++;m++;}elseif(t==0&&k>0){//第二个空白liveRight=true;break;}else{//黑子m++;count++;}}returnjieguo(liveLeft,liveRight,count,k,num);}/
11、/算出黑子竖方向的棋型数值publicintheishu(inthang,intlie,intnum){intk=0;//记录空白处的个数intcount=1;//记录可以形成几连intn=hang+1;//对应棋盘的行intm=lie+1;//对应棋盘的列booleantop=false;//判断上边是否有黑子booleanliveLeft=false;booleanliveRight=false;while((qipan[n-1][m]!=-1)&&(qipan[n-1][m]==num
12、
13、qipan[n-1][m]==0)){if(qipan
14、[n-1][m]==0&&k<1){//第一个空白if(qipan[n-2][m]!=num){liveLeft=true