五子棋人机对战代码

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

8.2电脑下棋算法设计

本款游戏最核心的地方就是算法,因为这是整个程序最难的模块。算法的中心思想是:

利用分数代表每个位置的重要程度,越重要的位置的分数值会越高,当电脑下棋时会先将电脑和玩家棋型的分数分别计算一遍,然后选择二者中分数最高的点下子。如果玩家的分数高, 那么代表电脑应该防守,如果电脑的分数高,那么代表电脑应该进攻。

解释一下其中的活,半活,死,半死:

活:代表几个子是相连的,中间没有空格,两端都至少有一个空格。

半活:代表几个子不是相连的,几个子中间有一个空格,两端都至少有一个空格。

死:代表几个子是相连的,中间没有空格,但有一端紧挨着对方的棋子或有一端正好在

棋盘的边界。

半死:代表几个子不是相连的,几个子中间有一个空格,而且一端紧挨着对方的棋子或

有一端正好在棋盘的边界。

每个位置的分数的计算方式是各个方向的分数相加,最后找出电脑棋型和玩家棋型的分

数的最高的位置为电脑的下棋点下棋。

具体的代码如下:

public void qixi ng(){

for ( int i=0;i<17;i++){

for ( int j=0;j<17;j++){

if (qipan [i+1][j+1]==0){ // 说明此处没有棋子

qix in gPC [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; }

}

}

}

// 算出黑子横方向的棋型数值

public int heihen ( int hang, int lie, int num){

int k = 0; // 记录空白处的个数

int count = 1; // 记录可以形成几连

int n = hang+1; // 对应棋盘的行

int m = lie+1; // 对应棋盘的列

boolean left = false ; // 判断左边是否有黑子

boolean liveLeft = false ; // 判断左边是活还是死boolean liveRight = false ; // 判断右边是活还是死while (( qipan [n][m-1]!=-1)&&( qipan [n][m-1]==num|| qipan ){

[n][m-1]==0) if ( qipan [n][m-1]==0&&k<1){ // 第一个空白

if ( qipan [n][m-2]!=num){ liveLeft = true ; break ;

}

k++;

m--;

} else if ( 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)

int t = 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++;

} else if (t==0&&k>0){ // 第二个空白 liveRight = true ; break ; } else { // 黑子

m++; count++;

}

}

return jieguo(liveLeft,liveRight,count,k,num);

}

// 算出黑子竖方向的棋型数值 public

int heishu( int hang, int lie, int num){ int k = 0; // 记录空白处的个数 int count = 1; // 记录可以形成几连 int n = hang+1; // 对应棋盘的行 int

m = lie+1;

// 对应棋盘的列

boolean top =

false ; // 判断上边是否有黑子 boolean liveLeft = false boolean liveRight = false

while (( qipan [n-1][m]!=-1)&&( qipan [n-1][m]==num|| qipan ){

if ( qipan [n-1][m]==0&&k<1){ // 第一个空白

if ( qipan [n-2][m]!=num){ liveLeft = true ;

break ;

}

k++; n--;

){

[n-1][m]==0)

相关文档
最新文档