五子棋功能需求说明书防堵成一排 打三个数字

人工智能的期末大作业,最近几个项目都在单干。还是要养成整理的好习惯!
基于α-β剪枝算法的智能五子棋
一、基本介绍
游戏界面:使用了Java Swing进行开发,如图所示。
游戏步骤:
1. 先设置游戏的参数,可以选择模式(双人、单人、双机),智能(估值函数、估值函数+搜索树),搜索树(层数、每层节点),再开始游戏;
2. 在棋盘上单击鼠标左键,落下棋子;
3. 在棋盘上单击鼠标右键,查看该点的估值;
4. 可以显示落子顺序和悔棋;
5. 使用搜索树AI时,控制台显示搜索过程;
6. 某方胜利后,游戏结束。
二、棋型确定
1.五子棋棋型的定义十分模糊,如网上对活二、眠三、死四的定义经常自相矛盾。
2.在大部分论文中,考虑的棋型非常少,如对活三的典型棋型列举不够完整,且常把眠三当死三。
正确、完全的棋型:
以上问题,令我奔溃了很久,最后对比了N个文献,才确定了比较可信的参考,棋型整理如下:
(1黑,2白,0空)
图例(来自)
至少五颗同色棋子连在一起
有两个连五点(即有两个点可以形成五),图中白点即为连五点
有一个连五点
可以形成活四的三
只能够形成冲四的三
能够形成活三的二
能够形成眠三的二
(图不全)
两头都被封堵的四
两头都被封堵的三
两头都被封堵的二
棋型判断:
由于棋型比较多,判断起来不太有规律。我就直接取出某点的横、竖、撇、捺四个方向的字串,用正则表达式判断棋型了,这样的效率应该还不错。
例如对下图A点,如果放白子,可以在横向形成“20022200000”活三,如果放黑子,可以在捺向形成“00001100000”活二。
三、落子估值方式
分析:棋子落在哪里最好?
1. 需要考虑落下后会在四个方向各形成什么棋型,是否形成组合棋型,然后进行初步打分;
2. 同时还要考虑落子位置,一般同分情况下越中心的点越好;
3. 可以分析对攻击效果、防守效果、综合效果。
初步打分:
就是按照威胁程度给每种棋型打分,在理解棋型后,试验了多组估分方式,最后确定效果最好的一组打分方式如下:
棋型(含组合棋型)
活4、双冲4、冲4活3
再统计在四个方向各形成什么棋型,是否形成组合棋型,取最高分为初步打分的结果。
落子位置:
根据棋盘分布问题,越中心的点分值应当越高。
private static int[][] position = {
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0 },
{ 0, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 0 },
{ 0, 1, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 1, 0 },
{ 0, 1, 2, 3, 4, 4, 4, 4, 4, 4, 4, 3, 2, 1, 0 },
{ 0, 1, 2, 3, 4, 5, 5, 5, 5, 5, 4, 3, 2, 1, 0 },
{ 0, 1, 2, 3, 4, 5, 6, 6, 6, 5, 4, 3, 2, 1, 0 },
{ 0, 1, 2, 3, 4, 5, 6, 7, 6, 5, 4, 3, 2, 1, 0 },
{ 0, 1, 2, 3, 4, 5, 6, 6, 6, 5, 4, 3, 2, 1, 0 },
{ 0, 1, 2, 3, 4, 5, 5, 5, 5, 5, 4, 3, 2, 1, 0 },
{ 0, 1, 2, 3, 4, 4, 4, 4, 4, 4, 4, 3, 2, 1, 0 },
{ 0, 1, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 1, 0 },
{ 0, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 0 },
{ 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } };
例如,对下图A点,如果放白子,在四个方向分别会形成活3、活2、眠2,形成两种棋型(组合棋型)活3和活2眠2,最高分为活3对应的200分,再加上位置分值6分,就是206分;如果放黑子,同理是25分。因此,当要在J9落下白子时,可获得攻击分206,防守分25,综合分231。
四、棋局估值函数
函数描述:
有了落子估值方式后,可以针对某一棋局,分析一定棋盘范围内的各个可落子点的落子估值,将最大综合分作为该棋局的估值。
利用估值函数,即可实现简单智能,即只考虑当前局面下的最佳落子点,并落子。
例如,人机对战:
优点是速度快,眼前胜利绝不放过,缺点也是显而易见的,对于埋伏了多步的杀法,这种只顾“近忧”的智能无能为力。因此,就需要搜索算法增加“远虑”。
五、搜索算法
极大极小搜索:
分析:要想得更远的,棋子落在哪里最好?
1. 在对弈中,可利用棋局估值函数对任何一个局面进行估值,估值越大表明对当前玩家越有利,估分越小则表明越不利;
2. 选择落子时,要考虑对自己第一步越有利的,对对手下一步越不利的,对自己第二步越有利的,以此类推;
3. 这样选择落子时就表现为一棵极大极小搜索树,逐层搜索,对自己轮的层就选最大值的局面,对对手轮就选最小值的局面,直到一定深度。
但测试后发现该算法速度比较慢,对15×15的棋盘,搜索第一层有15×15=225个结点,第二层就约有15×15×15×15=50625个节点,完全是指数爆炸。
α-β剪枝算法:
在搜索的过程中,实际上有搜索很多点是多余的。经过α-β剪枝,可以极大的减少搜索的数量。在查阅资料的过程中,发现α-β剪枝算法是一个基础而经典的算法,还有很多、很多,值得深入学习。
(建立在MinMax算法基础上):
alpha-beta(player,board,alpha,beta)
if(game over in current board position)
return winner
children = all legal moves for player from this board
if(max's turn)
for each child
score = alpha-beta(other player,child,alpha,beta)
(we have found a better best move....)
if score & alpha then alpha = score
(cut off...)
if alpha &= beta then return alpha
return alpha (this is our best move)
else (min's turn)
for each child
score = alpha-beta(other player,child,alpha,beta)
(opponent has found a better worse move.....)
if score & beta then beta = score
(cut off....)
if alpha &= beta then return beta
return beta (this is the opponent's best move)
以上述伪代码为原型,我尝试实现五子棋AI的α-β剪枝算法。但是试验后发现该原型还有很多不足,比如速率仍然不快,尤其是开局落子时,比如经常忽视近层的绝杀,还需根据五子棋的特点继续优化算法。
六、算法优化
速率提高:
1. 限制落子范围:在当前棋局的所有棋子的最左、最右、最上、最下点的5格之内,不超过棋盘边界。这样在棋子较少的时候,搜索结点的数量大大减少。
2. 减少每层的搜索结点:在一方落子后,程序自动对新棋局下的可落子点进行落子估值,保存估值前几名的落子点,在拓展搜索树时,只考虑这些落子点作为新层结点,并进行下一步搜索,大大减少搜索范围。
近层绝杀:
在递归过程中,如果发现某落子后可能形成活4、双冲4、冲4活3这些对方无法防守的棋局,则将该落子点的估分人为设成一个无穷大值,即优先这种走法。同时,如果己方和对方同时出现活4、双冲4、冲4活3的棋局,则以己方的攻击为先。
综上,最后的α-β算法代码如下(更多详细内容,可见源代码的注解):
public int alpha_beta(int depth, Board board, int alpha, int beta) {
if (depth == level || board.isGameOver() != 0) {
Chess[] sorted = board.getSorted();
Chess move = board.getData()[sorted[0].x][sorted[0].y];
return move.getSum();// 局面估分
Board temp = new Board(board);
Chess[] sorted = temp.getSorted();
for (int i = 0; i & i++) {
int x = sorted[i].x;
int y = sorted[i].y;
if (!temp.putChess(x, y))
if (sorted[i].getOffense() &= Board.Level.ALIVE_4.score) {
score = INFINITY + 1;
} else if (sorted[i].getDefence() &= Board.Level.ALIVE_4.score) {
score = INFINITY;
score = alpha_beta(depth + 1, temp, alpha, beta);
temp = new Board(board);
if (depth % 2 == 0) {// MAX
if (score & alpha) {
if (depth == 0) {
if (alpha &= beta)
} else {// MIN
if (score & beta)
if (alpha &= beta)
return depth%2==0?alpha:
例如,深度为2,每层5个结点,H8黑、I7白后考虑落下黑子,依次拓展落子估值前5大的点G7、H7、I9、I8、H6,根据深度优先搜索,先假设落下G7黑,则再次拓展5个结点I9、F6、J10、E5、K11,其中落子I9白(即共四子)后的棋局(I8是该棋局的最大落子估值点)估值为233,以此类推。根据剪枝原理,最后可得最佳落子点。
更多优化的思考:
1. 考虑利用多线程,让算法实现并行计算,每个线程负责不同子树,可提高速率;
2. 落子的影响范围有限,搜索过程中很多点的估值并没有改变,可以考虑把一些点的估值记录下来,以后只要遇到搜索到的节点,就可以直接得到结果,可提高速率;
3. 由于算法的固定性,所以一担玩家一次获胜,按照相同的走法,必然会再次获胜。但除了必杀招或者必防招,一个局面很多时候没有绝对最好的走法,而是有一些都不错的走法。考虑把这些评分差不多走法汇集起来,然后随机选择它们中的一种走法,避免走法的固定。
4. 可利用神经网络思想来提高速率,存储结点信息,增加学习功能,避免再次犯错。
花了约一周的时间,网上并没有满意的源码参考来作为基础,基本都是自己完成的,挺有成就感,但是也误了时间,非常抱歉!
整个过程中有几个坎,一是资料混乱,棋型很难确定,二是得弄清楚落子估值和棋局估值函数的联系和区别,这个没有找到明确描述的资料,是我自己分析猜测的,三是写完α-β算法不是万事大吉,要做个高智商的AI还很有欠缺。
(界面设计)
(基本棋型、专业术语)
(α-β剪枝算法)
(相关论文)
唐永强,汪波.基于神经网络思想及α-β方法的五子棋算法设计.《电脑应用技术》二零零九总第七十二期
简越.基于UML的五子棋人机对弈.本科毕业论文
浏览 12288
浏览: 38476 次
楼主有代码吗?
(window.slotbydup=window.slotbydup || []).push({
id: '4773203',
container: s,
size: '200,200',
display: 'inlay-fix'五子棋大师2单机版|五子棋大师2电脑版下载最新版-心愿下载
五子棋大师2电脑版 最新版五子棋大师2单机版
网友评分:
软件介绍相关软件其它版本相关教程相关专题下载地址
五子棋小游戏五子棋软件五子棋游戏
五子棋小游戏是一种知名度很高,流行度也不错的棋类游戏,现实中玩五子棋的人不多,但是五子棋常常被搬到游戏里,深受玩家喜爱。五子棋小游戏简单易学,不过真正想要下好又需要不错的思考能力哦!心愿下载提供五子棋...
fiver6.8.2最新版连珠妙手:高难度五子棋:能赢了猪八戒就不错了,如果如来都败在了你的手下,那就...
1.1 绿色版侠客五子棋游戏是音乐在线工作室开发的一款人机对战五子棋游戏。五子棋游戏具有...
v1.0 免费版畅玩五子棋小游戏是一款五子棋小游戏,可以联网进行对战的一款益智型小游戏。
v4.0 免费版黑石五子棋软件是目前最强大的连珠对弈软件,也是使用最广泛的连珠软件。其强大...
v2.00 绿色版五子棋终结者是一个计算机执黑必胜的五子棋小程序,严格地、完全地毯式地终结了...
V1.06 绿色版易小生五子棋人机对战是一款免费的五子棋益智游戏,提供人机对战,人人对战,可自...
五子棋是一种两人对弈的纯策略型棋类游戏,五子棋软件规则简单但非常考验双方的观察力,容易上手,两人对局,各执一色,轮流下一子,先将横、竖或斜线的5个或5个以上同色棋子连成不间断的一排者为胜。五子棋软件哪个...
v2.00 绿色版五子棋终结者是一个计算机执黑必胜的五子棋小程序,严格地、完全地毯式地终结了...
fiver6.8.2最新版连珠妙手:高难度五子棋:能赢了猪八戒就不错了,如果如来都败在了你的手下,那就...
v4.0 免费版黑石五子棋软件是目前最强大的连珠对弈软件,也是使用最广泛的连珠软件。其强大...
5.26 绿色版连珠终结者是一个计算机执黑必胜的五子棋小程序,严格地、完全地毯式地终结了自...
五子棋是起源于中国古代的传统黑白棋种之一。五子棋游戏是五子棋玩法为基础开发的游戏,五子棋游戏容易上手,老少皆宜,而且趣味横生,引人入胜。心愿下载整理了五子棋游戏大厅,五子棋游戏免费下载,希望你玩的愉快...
v1.0 免费版畅玩五子棋小游戏是一款五子棋小游戏,可以联网进行对战的一款益智型小游戏。
5.26 绿色版连珠终结者是一个计算机执黑必胜的五子棋小程序,严格地、完全地毯式地终结了自...
1.1 绿色版侠客五子棋游戏是音乐在线工作室开发的一款人机对战五子棋游戏。五子棋游戏具有...
v2.0.0.1 免费版美捷五子棋是一款精美的五子棋游戏,界面精美、功能全面,支持人机对战和双人对战...
v2.00 绿色版五子棋终结者是一个计算机执黑必胜的五子棋小程序,严格地、完全地毯式地终结了...
v1.7.4专业五子棋app是一款五子棋类手机游戏,在游戏中我们可以尽情的享受五子棋给我们...
五子棋大师2电脑版相关软件
& &评论摘要(以下显示最近10条评论)
软件下载说明
* 为了达到最快的下载速度,站长推荐您使用下载本站软件。
* 请升级到最新版的以便正常解压缩下载的软件!
* 本站下载的软件,部分经过压缩加密处理,解压密码为:www.wishdown.com
* 为方便大家交流,我们开通了QQ群:① ②6656287,请勿重复添加。
* 本站所提供的所有软件均为作者提交或网上搜集,若侵犯您的版权利益,通知我们!
wishdownlucksky
是一个免费软件下载站,提供绿色软件,免费软件,手机软件,游戏下载,我们的目标是:让电脑软件改变学习和生活. &&
Copyright &
www.wishdown.com All rights reserved.五子棋单机版下载|五子棋大师下载 单机版_ - pc6游戏网隔了一年才把AI思路给写了。。。
需求分析与设计方案:
如需整个工程,移步
注:全文,都默认以黑方为己方。
一、五子棋基本棋型
参考资料:
最常见的基本棋型大体有以下几种:连五,活四,冲四,活三,眠三,活二,眠二。①连五:顾名思义,五颗同色棋子连在一起,不需要多讲。图2-1&&②活四:有两个连五点(即有两个点可以形成五),图中白点即为连五点。稍微思考一下就能发现活四出现的时候,如果对方单纯过来防守的话,是已经无法阻止自己连五了。图2-2&&③冲四:有一个连五点,如下面三图,均为冲四棋型。图中白点为连五点。相对比活四来说,冲四的威胁性就小了很多,因为这个时候,对方只要跟着防守在那个唯一的连五点上,冲四就没法形成连五。图2-3&&图2-4&&图2-5&&④活三:可以形成活四的三,如下图,代表两种最基本的活三棋型。图中白点为活四点。活三棋型是我们进攻中最常见的一种,因为活三之后,如果对方不以理会,将可以下一手将活三变成活四,而我们知道活四是已经无法单纯防守住了。所以,当我们面对活三的时候,需要非常谨慎对待。在自己没有更好的进攻手段的情况下,需要对其进行防守,以防止其形成可怕的活四棋型。图2-6&&图2-7&其中图2-7中间跳着一格的活三,也可以叫做跳活三。⑤眠三:只能够形成冲四的三,如下各图,分别代表最基础的六种眠三形状。图中白点代表冲四点。眠三的棋型与活三的棋型相比,危险系数下降不少,因为眠三棋型即使不去防守,下一手它也只能形成冲四,而对于单纯的冲四棋型,我们知道,是可以防守住的。图2-8&&图2-9&&图2-10&
2-11&图2-12&图2-13&如上所示,眠三的形状是很丰富的。对于初学者,在下棋过程中,很容易忽略不常见的眠三形状,例如图2-13所示的眠三。有新手学了活三眠三后,会提出疑问,说活三也可以形成冲四啊,那岂不是也可以叫眠三?会提出这个问题,说明对眠三定义看得不够仔细:眠三的的定义是,只能够形成冲四的三。而活三可以形成眠三,但也能够形成活四。此外,在五子棋中,活四棋型比冲四棋型具有更大的优势,所以,我们在既能够形成活四又能够形成冲四时,会选择形成活四。温馨提示:学会判断一个三到底是活三还是眠三是非常重要的。所以,需要好好体会。后边禁手判断的时候也会有所应用。&⑥活二:能够形成活三的二,如下图,是三种基本的活二棋型。图中白点为活三点。活二棋型看起来似乎很无害,因为他下一手棋才能形成活三,等形成活三,我们再防守也不迟。但其实活二棋型是非常重要的,尤其是在开局阶段,我们形成较多的活二棋型的话,当我们将活二变成活三时,才能够令自己的活三绵绵不绝微风里,让对手防不胜防。图2-14&&图2-15&&图2-16&⑦眠二:能够形成眠三的二。图中四个为最基本的眠二棋型,细心且喜欢思考的同学会根据眠三介绍中的图2-13找到与下列四个基本眠二棋型都不一样的眠二。图中白点为眠三点。图2-17&图2-18&&图2-19&&图2-20&
二、打分机制
1、打分思路
(1)先对整个棋盘形势进行打分,存在两个矩阵(二维数组)上
(2)一个为我方的形势分数,一个为敌方的形势分数
(3)找出我方形势分数的最大值mymaxscore及其对应的位置,找出敌方形势的最大值hismaxscore及其对应的位置
(4)判断是进攻还是防守:
如果mymaxscore&=hismaxscore,则进攻,下我方形势最大值mymaxscore对应的位置;如果有多个mymaxscore相等,则下这几个对应位置上hismaxscore最大的位置。
否则,防守,下敌方形势最大值hismaxscore对应的位置。如果有多个hismaxscore相等,则下这几个对应位置上mymaxscore最大的位置。
2、打分方法
(1)在棋盘空位置上预添加要判断放的棋子
(2)取出以空位置为中心的4个方向(上,下,左,右),每个方向以该位置为中心两边各取4个格子信息。如下所示:
注:中心位置都是预放置,当前判断的时候位置还是空的
(3)四个方向都判断其棋型,是否连五,活四,冲四,活三,眠三,活二,眠二等中的一种
(4)最后综合四个方向的棋型,对该位置进行打分。
3、打分规定
注:机器方即为本方,人方即为敌方
综合四个方向后:
判断是否能成如果是机器方的话给予分,如果是人方的话给予分;
判断是否能成活或者是双死或者是死活,如果是机器方的话给予分,如果是人方的话给予分;
判断是否已成双活,如果是机器方的话给予分,如果是人方的话给予分;
判断是否成死活(高级),如果是机器方的话给予分,如果是人方的话给予分;
判断是否能成死,如果是机器方的话给予500分,如果是人方的话给予500分;
判断是否能成低级死,如果是机器方的话给予400分,如果是人方的话给予400分;
判断是否能成单活,如果是机器方的话给予100分,如果是人方的话给予100分;
判断是否能成跳活3,如果是机器方的话给予90分,如果是人方的话给予90分;
判断是否能成双活,如果是机器方的话给予50分,如果是人方的话给予50分;
判断是否能成活,如果是机器方的话给予10分,如果是人方的话给予10分;
判断是否能成低级活2,如果是机器方的话给予分,如果是人方的话给予9分;
判断是否能成死,如果是机器方的话给予5分,如果是人方的话给予5分;
判断是否能成死,如果是机器方的话给予2分,如果是人方的话给予2分。
判断是否其他情况(nothing),如果是机器方的话给予1分,如果是人方的话给予1分。
有棋子,则直接0分。
4、棋型判断方法
(1)在空位置上添加要判断色的棋子
(2)取出以空位置为中心的,要判断单个方向(上,下,左,右中的一种)上的,两边各4个位置信息,形成
(3)先找出与中心点相连而成的连续子有多少个
(4)再进行下一步判断
注:以下说明都以黑方为例子
&中心点相连而成的连续子有5个:不管哪种情况,都可以直接判断为成5:
中心点相连而成的连续子有4个:
两边均空,活4
1、2均非空,则nothing
1、2只有一个为空,则死4
中心点相连而成的连续子有3个:
2,3均空时:
1,4均为白子,则为死3
1,4只要有一个空,则为活3
1,4只要有一个黑,则为死4&
以此类推,根据第一部分中的五子棋棋型去判断棋型类型。
具体可直接查看源码部分。
&单个方向的棋型判断:
if (count &= 5)//中心线5连
return WIN5;//5连珠
if (count == 4)//中心线4连
if (colorleft == NOTHINGFLAG && colorright == NOTHINGFLAG)//两边断开位置均空
return ALIVE4;//活四
else if (colorleft == hiscolor && colorright == hiscolor)//两边断开位置均非空
return NOTHREAT;//没有威胁
else if (colorleft == NOTHINGFLAG || colorright == NOTHINGFLAG)//两边断开位置只有一个空
return DIE4;//死四
if (count == 3) {//中心线3连
int colorleft1 = chess[left - 1];
int colorright1 = chess[right + 1];
if (colorleft == NOTHINGFLAG && colorright == NOTHINGFLAG)//两边断开位置均空
if (colorleft1 == hiscolor && colorright1 == hiscolor)//均为对手棋子
return DIE3;
else if (colorleft1 == mycolor || colorright1 == mycolor)//只要一个为自己的棋子
return LOWDIE4;
else if (colorleft1 == NOTHINGFLAG || colorright1 == NOTHINGFLAG)//只要有一个空
return ALIVE3;
else if (colorleft == hiscolor && colorright == hiscolor)//两边断开位置均非空
return NOTHREAT;//没有威胁
else if (colorleft == NOTHINGFLAG || colorright == NOTHINGFLAG)//两边断开位置只有一个空
if (colorleft == hiscolor) {//左边被对方堵住
if (colorright1 == hiscolor)//右边也被对方堵住
return NOTHREAT;
if (colorright1 == NOTHINGFLAG)//右边均空
return DIE3;
if (colorright1 == mycolor)
return LOWDIE4;
if (colorright == hiscolor) {//右边被对方堵住
if (colorleft1 == hiscolor)//左边也被对方堵住
return NOTHREAT;
if (colorleft1 == NOTHINGFLAG)//左边均空
return DIE3;
if (colorleft1 == mycolor)//左边还有自己的棋子
return LOWDIE4;
if (count == 2) {//中心线2连
int colorleft1 = chess[left - 1];
int colorright1 = chess[right + 1];
int colorleft2 = chess[left - 2];
int colorright2 = chess[right + 2];
if (colorleft == NOTHINGFLAG && colorright == NOTHINGFLAG)//两边断开位置均空
if ((colorright1 == NOTHINGFLAG && colorright2 == mycolor) ||
(colorleft1 == NOTHINGFLAG && colorleft2 == mycolor))
return DIE3;//死3
else if (colorleft1 == NOTHINGFLAG && colorright1 == NOTHINGFLAG)
return ALIVE2;//活2
if ((colorright1 == mycolor && colorright2 == hiscolor) ||
(colorleft1 == mycolor && colorleft2 == hiscolor))
return DIE3;//死3
if ((colorright1 == mycolor && colorright2 == mycolor) ||
(colorleft1 == mycolor && colorleft2 == mycolor))
return LOWDIE4;//死4
if ((colorright1 == mycolor && colorright2 == NOTHINGFLAG) ||
(colorleft1 == mycolor && colorleft2 == NOTHINGFLAG))
return TIAO3;//跳活3
//其他情况在下边返回NOTHREAT
else if (colorleft == hiscolor && colorright == hiscolor)//两边断开位置均非空
return NOTHREAT;
else if (colorleft == NOTHINGFLAG || colorright == NOTHINGFLAG)//两边断开位置只有一个空
if (colorleft == hiscolor) {//左边被对方堵住
if (colorright1 == hiscolor || colorright2 == hiscolor) {//只要有对方的一个棋子
return NOTHREAT;//没有威胁
else if (colorright1 == NOTHINGFLAG && colorright2 == NOTHINGFLAG) {//均空
return DIE2;//死2
else if (colorright1 == mycolor && colorright2 == mycolor) {//均为自己的棋子
return LOWDIE4;//死4
else if (colorright1 == mycolor || colorright2 == mycolor) {//只有一个自己的棋子
return DIE3;//死3
if (colorright == hiscolor) {//右边被对方堵住
if (colorleft1 == hiscolor || colorleft2 == hiscolor) {//只要有对方的一个棋子
return NOTHREAT;//没有威胁
else if (colorleft1 == NOTHINGFLAG && colorleft2 == NOTHINGFLAG) {//均空
return DIE2;//死2
else if (colorleft1 == mycolor && colorleft2 == mycolor) {//均为自己的棋子
return LOWDIE4;//死4
else if (colorleft1 == mycolor || colorleft2 == mycolor) {//只有一个自己的棋子
return DIE3;//死3
if (count == 1) {//中心线1连
int colorleft1 = chess[left - 1];
int colorright1 = chess[right + 1];
int colorleft2 = chess[left - 2];
int colorright2 = chess[right + 2];
int colorleft3 = chess[left - 3];
int colorright3 = chess[right + 3];
if (colorleft == NOTHINGFLAG && colorleft1 == mycolor &&
colorleft2 == mycolor && colorleft3 == mycolor)
return LOWDIE4;
if (colorright == NOTHINGFLAG && colorright1 == mycolor &&
colorright2 == mycolor && colorright3 == mycolor)
return LOWDIE4;
if (colorleft == NOTHINGFLAG && colorleft1 == mycolor &&
colorleft2 == mycolor && colorleft3 == NOTHINGFLAG && colorright == NOTHINGFLAG)
return TIAO3;
if (colorright == NOTHINGFLAG && colorright1 == mycolor &&
colorright2 == mycolor && colorright3 == NOTHINGFLAG && colorleft == NOTHINGFLAG)
return TIAO3;
if (colorleft == NOTHINGFLAG && colorleft1 == mycolor &&
colorleft2 == mycolor && colorleft3 == hiscolor && colorright == NOTHINGFLAG)
return DIE3;
if (colorright == NOTHINGFLAG && colorright1 == mycolor &&
colorright2 == mycolor && colorright3 == hiscolor && colorleft == NOTHINGFLAG)
return DIE3;
if (colorleft == NOTHINGFLAG && colorleft1 == NOTHINGFLAG &&
colorleft2 == mycolor && colorleft3 == mycolor)
return DIE3;
if (colorright == NOTHINGFLAG && colorright1 == NOTHINGFLAG &&
colorright2 == mycolor && colorright3 == mycolor)
return DIE3;
if (colorleft == NOTHINGFLAG && colorleft1 == mycolor &&
colorleft2 == NOTHINGFLAG && colorleft3 == mycolor)
return DIE3;
if (colorright == NOTHINGFLAG && colorright1 == mycolor &&
colorright2 == NOTHINGFLAG && colorright3 == mycolor)
return DIE3;
if (colorleft == NOTHINGFLAG && colorleft1 == mycolor &&
colorleft2 == NOTHINGFLAG && colorleft3 == NOTHINGFLAG && colorright == NOTHINGFLAG)
return LOWALIVE2;
if (colorright == NOTHINGFLAG && colorright1 == mycolor &&
colorright2 == NOTHINGFLAG && colorright3 == NOTHINGFLAG && colorleft == NOTHINGFLAG)
return LOWALIVE2;
if (colorleft == NOTHINGFLAG && colorleft1 == NOTHINGFLAG &&
colorleft2 == mycolor && colorleft3 == NOTHINGFLAG && colorright == NOTHINGFLAG)
return LOWALIVE2;
if (colorright == NOTHINGFLAG && colorright1 == NOTHINGFLAG &&
colorright2 == mycolor && colorright3 == NOTHINGFLAG && colorleft == NOTHINGFLAG)
return LOWALIVE2;
//其余在下边返回没有威胁
return NOTHREAT;//返回没有威胁
综合四个方向评分:
if (situation.win5 &= 1)
return LevelO//赢5
if (situation.alive4 &= 1 || die4 &= 2 || (die4 &= 1 && alive3 &= 1))
return L//活4 双死4 死4活3
if (alive3 &= 2)
return L//双活3
if (situation.die3 &= 1 && situation.alive3 &= 1)
return L//死3高级活3
if (situation.die4 &= 1)
return L//高级死4
if (situation.lowdie4 &= 1)
return L//低级死4
if (situation.alive3 &= 1)
return L//单活3
if (situation.tiao3 &= 1)
return LevelE//跳活3
if (alive2 &= 2)
return LevelN//双活2
if (situation.alive2 &= 1)
return LevelT//活2
if (situation.lowalive2 &= 1)
return LevelE//低级活2
if (situation.die3 &= 1)
return LevelT//死3
if (situation.die2 &= 1)
return LevelT//死2
return LevelF//没有威胁
阅读(...) 评论()

我要回帖

更多关于 五子棋功率 的文章

 

随机推荐