您好,欢迎访问三七文档
8.2电脑下棋算法设计本款游戏最核心的地方就是算法,因为这是整个程序最难的模块。算法的中心思想是:利用分数代表每个位置的重要程度,越重要的位置的分数值会越高,当电脑下棋时会先将电脑和玩家棋型的分数分别计算一遍,然后选择二者中分数最高的点下子。如果玩家的分数高,那么代表电脑应该防守,如果电脑的分数高,那么代表电脑应该进攻。具体的分数值赋值如下:分数电脑玩家活二6050半活二4035死二1010半死二1010活三950700半活三900650死三100100半死三100100活四60003500半活四50003000死四4000800半死四3600750活五2000015000半活五100003300死五2000015000半死五100003300解释一下其中的活,半活,死,半死:活:代表几个子是相连的,中间没有空格,两端都至少有一个空格。半活:代表几个子不是相连的,几个子中间有一个空格,两端都至少有一个空格。死:代表几个子是相连的,中间没有空格,但有一端紧挨着对方的棋子或有一端正好在棋盘的边界。半死:代表几个子不是相连的,几个子中间有一个空格,而且一端紧挨着对方的棋子或有一端正好在棋盘的边界。每个位置的分数的计算方式是各个方向的分数相加,最后找出电脑棋型和玩家棋型的分数的最高的位置为电脑的下棋点下棋。具体的代码如下:publicvoidqixing(){for(inti=0;i17;i++){for(intj=0;j17;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{qixingPC[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[n][m-1]!=-1)&&(qipan[n][m-1]==num||qipan[n][m-1]==0)){if(qipan[n][m-1]==0&&k1){//第一个空白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[n][m+1]==num||qipan[n][m+1]==0)){intt=qipan[n][m+1];if(m==lie){count++;m++;continue;}if(t==0&&k1){//第一个空白if(qipan[n][m+2]!=num){liveRight=true;break;}k++;m++;}elseif(t==0&&k0){//第二个空白liveRight=true;break;}else{//黑子m++;count++;}}returnjieguo(liveLeft,liveRight,count,k,num);}//算出黑子竖方向的棋型数值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||qipan[n-1][m]==0)){if(qipan[n-1][m]==0&&k1){//第一个空白if(qipan[n-2][m]!=num){liveLeft=true;break;}k++;n--;}elseif(qipan[n-1][m]==num){//黑子top=true;n--;}else{//第二个空白liveLeft=true;break;}}if(!top){k=0;n=hang+1;}while((qipan[n+1][m]!=-1)&&(qipan[n+1][m]==num||qipan[n+1][m]==0)){intt=qipan[n+1][m];if(n==hang){count++;n++;continue;}if(t==0&&k1){//第一个空白if(qipan[n+2][m]!=num){liveRight=true;break;}k++;n++;}elseif(t==0&&k0){//第二个空白liveRight=true;break;}else{//黑子n++;count++;}}//returnjieguo(k==0,count);returnjieguo(liveLeft,liveRight,count,k,num);}//算出黑子左斜方向的棋型数值publicintheizuoxie(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]!=-1)&&(qipan[n+1][m-1]==num||qipan[n+1][m-1]==0)){if(qipan[n+1][m-1]==0&&k1){//第一个空白if(qipan[n+2][m-2]!=num){liveLeft=true;break;}k++;n++;m--;}elseif(qipan[n+1][m-1]==num){//黑子top=true;n++;m--;}else{//第二个空白liveLeft=true;break;}}if(!top){k=0;n=hang+1;m=lie+1;}while((qipan[n-1][m+1]!=-1)&&(qipan[n-1][m+1]==num||qipan[n-1][m+1]==0)){intt=qipan[n-1][m+1];if(n==(hang+2)&&m==lie){count++;n--;m++;continue;}if(t==0&&k1){//第一个空白if(qipan[n-2][m+2]!=num){liveRight=true;break;}k++;n--;m++;}elseif(t==0&&k0){//第二个空白liveRight=true;break;}else{//黑子n--;m++;count++;}}returnjieguo(liveLeft,liveRight,count,k,num);}//算出黑子右斜方向的棋型数值publicintheiyouxie(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]!=-1)&&(qipan[n-1][m-1]==num||qipan[n-1][m-1]==0)){if(qipan[n-1][m-1]==0&&k1){//第一个空白if(qipan[n-2][m-2]!=num){liveLeft=true;break;}k++;n--;m--;}elseif(qipan[n-1][m-1]==num){//黑子top=true;n--;m--;}else{//第二个空白liveLeft=true;break;}}if(!top){k=0;n=hang+1;m=lie+1;}while((qipan[n+1][m+1]!=-1)&&(qipan[n+1][m+1]==num||qipan[n+1][m+1]==0)){intt=qipan[n+1][m+1];if(n==hang&&m==lie){count++;n++;m++;continue;}if(t==0&&k1){//第一个空白if(qipan[n+2][m+2]!=num){liveRight=true;break;}k++;n++;m++;}elseif(t==0&&k0){//第二个空白liveRight=true;break;}else{//黑子n++;m++;count++;}}returnjieguo(liveLeft,liveRight,count,k,num);}publicintjieguo(booleanleft,booleanright,intcount,intk,intnum){if(count==1){return0;}elseif(count==2){if(left&&right){if(k==0){if(num==2){return60;}else{return50;}}else{if(num==2){return40;}else{return35;}}}elseif(!left&&!right){return0;}else{return10;}}elseif(count==3){if(left&&right){if(k==0){if(num==2){return950;}else{return700;}}else{if(num==2){return900;}else{return650;}}}elseif(!left&&!right){return0;}else{return100;}}elseif(count==4){if(left&&right){if(k==0){if(num==2){return6000;}else{return3500;}}else{if(num==2){return5000;}else{return3000;}}}elseif(!left&&!right){return0;}else{if(k==0){if(num==2){return4000;}else{return800;}}else{if(num==2){return3600;}else{return750;}}}}else{if(k==0){if(num==2){return20000;}else{return15000;}}else{if(num==2){return10000;}else{return3300;}}}}
本文标题:五子棋人机对战代码
链接地址:https://www.777doc.com/doc-4924350 .html