C语言五子棋价值函数biao,简易五子棋评估函数 - osc_9dvtgsvd的个人空间 - OSCHINA - 中文开源技术交流社区...

voidCFiveChessDlg::ComputerDown()

{int mode = 0, cur = 0, curX = 0, curY = 0, sum1 = 0, sum2 = 0;int x = 0, y = 0, cx = 0, cy = 0, cPrior = 0, prior = 0, flgL = 0, flgR = 0;for (x = 0; x < 15; x++)

{for (y = 0; y < 15; y++)

{//扫描全部空白点

if (chessData[x][y] == 0)

{

prior= 0;for (mode = 1; mode < 5; mode++) //模式1为 — 向判断,模式2为 | 向判断

{ //模式3为 \ 向判断,模式4为 / 向判断

sum1 = sum2 = 0;

flgL= flgR = 0;

curX=x;

curY= y; //改变模式后重置变量

for (cur = -4; cur <= 4; cur++)

{if (mode == 1) //向→检查

{

curX= x +cur;if (curX < 0) continue; //左越界继续

if (curX > 14) break; //右越界停止

}if (mode == 2) //向↓检查

{

curY= y +cur;if (curY < 0) continue; //上越界继续

if (curY > 14) break; //下越界停止

}if (mode == 3) //向↘检查

{

curX= x +cur;

curY= y +cur;if (curX < 0 || curY < 0) continue; //左或上越界继续

if (curX > 14 || curY > 14) break; //右或下越界停止

}if (mode == 4) //向↗检查

{

curX= x +cur;

curY= y -cur;if (curX < 0 || curY>14) continue; //左或下越界继续

if (curX > 14 || curY < 0) break; //右或上越界停止

}//初始化棋子标志,用于判断反色

if (cur < 0 && flgL == 0 && chessData[curX][curY] != 0)

flgL=chessData[curX][curY];if (cur > 0 && flgR == 0 && chessData[curX][curY] != 0)

flgR=chessData[curX][curY];if (cur < 0 && chessData[curX][curY] == (-flgL))

{

sum1= -1; //左侧搜索到反色,相当于被堵住的棋

flgL = -flgL; //同时标记也取反

}if (cur < 0 && chessData[curX][curY] ==flgL)

{

sum1++; //左侧搜索到同色

}if (cur == -1 && sum1 > 0 && chessData[curX][curY] == 0)

{

sum1--; //左一位搜索到空棋

}if (cur == 1 && sum2 > 0 && chessData[curX][curY] == 0)

{

sum2--; //右一位搜索到空棋

}if (cur > 0 && flgL == flgR) //如果左边的棋子和右边的同色

{

sum2+= sum1; //用sum2代替sum1继续搜索

sum1 = 0; //sum1置0以防重复相加和影响后面的cPrior

}if (cur > 0 && chessData[curX][curY] == (-flgR))

{

sum2--; //右边出现反色则,相当于被堵住的棋

break; //不需要继续搜索了

}if (cur > 0 && chessData[curX][curY] ==flgR)

{

sum2++;//右侧搜索到同色

}

}//长连相对短连拥有绝对的优势

if (sum1 == 1) prior = prior + 1;if (sum1 == 2) prior = prior + 10 - 2 * flgL; //数目相同白棋优先

if (sum1 == 3) prior = prior + 100 - 20 *flgL;if (sum1 == 4) prior = prior + 1000 - 200 *flgL;if (sum2 == 1) prior = prior + 1;if (sum2 == 2) prior = prior + 10 - 2 *flgR;if (sum2 == 3) prior = prior + 100 - 20 *flgR;if (sum2 == 4) prior = prior + 1000 - 200 *flgR;

}if (prior >cPrior)

{

cPrior=prior;

cx=x;

cy=y;

}if (prior == cPrior && rand() < RAND_MAX / 5)

{//除第一个棋外很少有优先级相等的点

cPrior =prior;

cx=x;

cy=y;

}

}

}

}

PutDown(cx, cy);//在得到的点下棋

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值