关于五子棋电脑AI算法的一些思考

这个部分是一个重点,也是一个难点,也是一个队伍最有可能出彩的一部分。我看了一些资料,但是现在我有了新的想法。

 

大部分算法中,都要进行两步。第一步是优先级的计算,然后是打分。但是我在想能不能通过某种数学模式把这两种计算融合在一起。也就是说,我们能够从所打的分中间识别出优先级。这使我想到了数学十进制中的位。反正我最主要是从四个方向进行判定,所以某些优先级低的,我们在给其打分的时候,就将它的分数设为处在其优先级之上的十分之一。其实我觉得这里只要大于其分数的八倍就可以,因为我最后选取最优位置的方法是累加法,算出分数和最高的位置,这样的话,即使在四个方向上某较低优先级都出现了,但是即使全加起来也不会超过较高优先级的分数,这样的话,如果出现优先级较高的情况,那么我们计算的结果必然是优先级较高的分数最高。这样,变省去了一些不必要的分类,使得算法更直接,更容易理解。

 

首先我们先来看一下置棋时的优先级分布以及我为其所指定的打分方案:

首先声明的是,对于已经五子相连的情况,我们在此部分算法中不再实现,因为这个时候胜负已经分出,我们调用checkboard类的judge的方法便可以了。这只不过是在电脑AI后再将judge的代码复制过去罢了。

我们的目的是给棋盘上的空位进行打分,进而算出分数最高的位置。那么我在这里想运用试探法,因为我觉得这样的话代码比较好写。所谓试探法就是,我们找出棋盘上的所有空位,然后我们假设这个空位上放置的是白棋,然后看看相连的情况,然后打分,并将分数加至存储该空位分数的变量;再假设这个空位上放置的是黑棋,然后再看相连的情况,然后打分,并将分数加至存储该空位分数的变量;这样遍历完所有的空位的时候,我们便完成了打分工作,然后再比较空位的分数,选出分数最高的空位,该位置即为最优的位置。

下面是一些情况的优先级排列:(假设我们是白棋)下列情况均为在该空位置棋之后:

在实现的时候,我们还需要定义两个临时的Checker指针变量,用来保存相连的一串棋子前后的位置的状态。color用来保存棋子的颜色,count用来保存相连的棋子的个数,temptr1与temptr2用来保存两端的棋子指针。文中的我们是电脑哦!

情况

所打分数

color=1&&count=5我们先赢,赢了再说

100 000 0000

Color=0&&count=5对方要赢,如果我们不能先赢,那么一定得先阻拦

10 000 0000

Color=1&&count=4&&!temptr1&&!temptr2双方均不会赢,如果我们能成活四,那么敌方必输,所以要先置棋

1 000 0000

Color=1&&count=4&&((!temptr1&&temptr2)||((temptr1)&&!temptr2))双方均不会赢,那么如果我们能成冲四,则要先置棋,牵着敌方的鼻子走,因为下过本步棋之后敌方一定会来阻止我们

100 0000

Color=0&&count=4&&!temptr1&&!temptr2双方均不会赢,如果对方能成活四,那么我们一定要优先阻拦,否则便会输棋

10 0000

Color=1&&count=3&&!temptr1&&!temptr2双方均不会赢,如果我们能成活三,则要优先这个位置

1 0000

Color=0&&count=4&&((!temptr1&&temptr2)||((temptr1)&&!temptr2))双方均不会赢,如果敌方能成冲四,那么我们要尽力阻拦

1 000

Color=1&&count=3&&((!temptr1&&temptr2)||((temptr1)&&!temptr2))双方均不会赢,如果我们能成冲三,那么要优先这个位置

1 00

Color=1&&count=2&&!temptr1&&!temptr2双方均不会赢,如果我们能成活二,则要优先这个位置

1 0

Color=1&&count=2&&((!temptr1&&temptr2)||((temptr1)&&!temptr2))双方均不会赢,如果我们能成冲二,那么要优先这个位置

1

其他情况

0

这个算法的主要思想是,对于敌方构不成威胁的情况,(即活四以下,但是这里我们把冲四也算进来了,并赋予了较高的优先级),我们暂不理会,而是一心想着自己怎么能赢。这里我们只能分成这么多情况,因为假设我们的分数是long型的,那么它的长度是32位,转换成十进制,位数也就是10位,因而我选了最大的分数为1000 000 000,这样刚好能满足要求。

    但是这里有个小小的问题,就是在刚开始落子的时候,怎么落?我想这个时候我们可以事先设置某个空位的分值为髙值,落棋之后分数便置为0了。当对方先下的时候,我们就将第一个棋子放在对方棋子的周围,启动AI,这样接下来问题便简单了,因为一定会出现冲二,进而便是对方的活四,然后再防守,这样一步步,便展开了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值