int qz = 0;
//找自己的取胜点(1000)
int w1 = 100000;
//找对手的取胜点(80)
int w2 = 50000;
//找自己的三个相连的点(60)
int w3 = 10000;
//找对手的三个相连的点(40)
int w4 = 5000;
//找自己的两个相连的点(20)
int w5 = 1000;
//找对手的两个相连的点(10)
int w6 = 500;
//找自己的相连的点(5)
int w7 = 100;
//找对方的相连的点(5)
int w8 = 50;
//找自己的失败点
int w9 = -1000000; int[] arrf = new int[4];
//如果该位置下我方的子
if (mflag)
{
//我方黑子
arrchessboard[m,n] = 0;
}
else
{
//我方白子
arrchessboard[m,n] = 1;
}
arrf[0] = Rule.Xnum(m,n,arrchessboard);
arrf[1] = Rule.Ynum(m,n,arrchessboard);
arrf[2] = Rule.YXnum(m,n,arrchessboard);
arrf[3] = Rule.XYnum(m,n,arrchessboard);
//中心点权值加1
if (m==7 && n==7){qz+=1;} for (int i=0;i<4;i++)
{
if (Math.Abs(arrf[i]) == 5)
{
qz += w1;
}
if (arrf[i] == 4)
{
qz += w3;
}
if (arrf[i] == 3)
{
qz += w5;
}
if (arrf[i] == 2)
{
qz += w7;
}
//如果我方为黑棋,还要检查失败点
if (mflag)
{
if (Rule.IsFail(arrf, arrchessboard[m,n])>0)
{
qz += w9;
}
}
}
//如果该位置下对方的子
if (mflag)
{
//对方白子
arrchessboard[m,n] = 1;
}
else
{
//对方黑子
arrchessboard[m,n] = 0;
}
arrf[0] = Rule.Xnum(m,n,arrchessboard);
arrf[1] = Rule.Ynum(m,n,arrchessboard);
arrf[2] = Rule.YXnum(m,n,arrchessboard);
arrf[3] = Rule.XYnum(m,n,arrchessboard); for (int i=0;i<4;i++)
{
if (Math.Abs(arrf[i]) == 5)
{
qz += w2;
}
if (arrf[i] == 4)
{
qz += w4;
}
if (arrf[i] == 3)
{
qz += w6;
}
if (arrf[i] == 2)
{
qz += w8;
}
}
//数组好像是引用传递,探测完后恢复到默认值
arrchessboard[m,n] = 2;
return qz;

解决方案 »

  1.   

       如果自己用将棋下在某个位置,那么在这个棋的水平、垂直、两个对角方向上会得到棋子连接情况(从两个到五个),Rule.Xnum,Rule.Ynum,Rule.YXnum,Rule.XYnum这四个方法分别去检测这些连接情况,按棋子的连接数加上相应的权值,即连接数越多、权值越高、越值得下
        相应的还要检查对手如果下在这里,他将得到的棋子连接情况,然后相应得加上权值,如果连接数越多,那么对他越有利,那么我也越值得去下
        如果自己是先手黑棋,那么还要用Rule.IsFail方法去判断这个位置是不是禁手,加上-1000000,权值暴小,你怎么都不会拿它了
        上面这段代码基本就这么点意思了