Programming 版 (精华区)

发信人: lofe ()感激生活(), 信区: Programming
标  题: 五子棋核心代码!
发信站: 哈工大紫丁香 (Sun Sep  3 16:44:55 2000), 转信

现将“五子棋”算法简单介绍如下:



for(k=1;k<=2;k++)
 {
    for(i=1;data[x-i][y]==k;i++);
  for(j=1;data[x+j][y]==k;j++);
  if(data[x-i][y]==0)v2+=1;if(data[x+j][y]==0)v2+=1;
  v+=i+j;v1=i+j;   values[k-1]+=zz(v1,v2,k);v2=0;
    for(i=1;data[x][y-i]==k;i++);
  for(j=1;data[x][y+j]==k;j++);
  if(data[x][y-i]==0)v2+=1;if(data[x][y+j]==0)v2+=1;
  v+=i+j;v1=i+j;   values[k-1]+=zz(v1,v2,k);v2=0;
    for(i=1;data[x-i][y-i]==k;i++);
   for(j=1;data[x+j][y+j]==k;j++);
   if(data[x-i][y-i]==0)v2+=1;if(data[x+j][y+j]==0)v2+=1;
  v+=i+j; v1=i+j;  values[k-1]+=zz(v1,v2,k);v2=0;
    for(i=1;data[x-i][y+i]==k;i++);
   for(j=1;data[x+j][y-j]==k;j++);
   if(data[x-i][y+i]==0)v2+=1;if(data[x+j][y-j]==0)v2+=1;
  v+=i+j; v1=i+j;  values[k-1]+=zz(v1,v2,k);v2=0;
}
 return(values[0]+values[1]);
以上部分为“五子棋”的算法核心部分,思路是:
    1。判断任意点是否为可落子点。(data[x][y]为棋盘数组,'0'代表无子,'1'代表
黑子,'2'代表白子。)
    2。如果是可落子点的话则:在横、竖、双斜四个方向上判断周围子的分布情况。比
如在横向上连续有两个同色子且两子以外没有任何子,同时此两子为敌方的子,则返回
一个值:values代表此点的落子利益值。(具体算法解释不再祥诉,可参看源程序相关
部分)
    3.最后再一对方的角度再演算一遍,即可求出各点的落子利弊值。以此为依据可确
定具体落子点。
int zz(v1,v2,k)   /*每个可能落子点的加权值(电脑走棋时)*/
int v1,v2,k;
{ int value1,n;
    value1=0;n=0;
 if(v1==3&&v2==0){value1+=0;if(k==2)value1+=2;}
 if(v1==3&&v2==1){value1+=11;if(k==2)value1+=5;}
 if(v1==3&&v2==2){value1+=12;if(k==2)value1+=6;}
 if(v1==4&&v2==0){value1=0;}
 if(v1==4&&v2==1){value1+=15;if(k==2)value1+=7;}
 if(v1==4&&v2==2){value1+=31;if(k==2)value1+=62;}
 if(v1==5&&v2==0){value1=0;}
 if(v1==5&&v2==1){value1+=95;if(k==2)value1+=31;}
 if(v1==5&&v2==2){value1+=400;if(k==2)value1+=32;}
 if(v1==6&&v2==1){value1+=600;if(k==2)value1+=20;}
 if(v1==6&&v2==2){value1+=700;if(k==2)value1+=20;}
 n=value1;
if(n==126||n==62||n==91||n==80||n==139||n==78||n==46||n==58||n==74||n==89)
   {value1+=133;if(k==2)value1+=20;
   }
  return(value1);
}
int check() /*选择加权值最大的点作为电脑的落子点*/
{int i,j,v;
  for (i=0;i<=22;i++)
    for (j=0;j<=22;j++)
       value[i][j]=0;
 for (i=0;i<=22;i++)
    for (j=0;j<=22;j++)
      { if(data[i][j]==0)
    {
      value[i][j]=select(i,j);
    }
      }
  v=0;
  for(i=0;i<=22;i++)
      for(j=0;j<=22;j++)
 {if(value[i][j]>=v)
    {x3=i;y3=j;
     v=value[i][j];
    }
 }
  if(v==0){x3=6;y3=6;}
  return(NULL);
}

--
      其实       
   放飞的风筝    
 随时可以飞回身旁
   需要的只是    
 一个留下的理由!
※ 修改:.haojs 于 Sep  3 16:42:23 修改本文.[FROM: bbs.hit.edu.cn]
--
※ 转寄:.武汉白云黄鹤站 bbs.whnet.edu.cn.[FROM: bbs.hit.edu.cn]

--
☆ 来源:.哈工大紫丁香 bbs.hit.edu.cn.[FROM: haojs.bbs@bbs.whnet.]
[百宝箱] [返回首页] [上级目录] [根目录] [返回顶部] [刷新] [返回]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:6.502毫秒