五子棋评分表算法

评分表算法

一般情况下棋盘是15*15的。那么应该是572个五元组。而这五元组由黑棋白棋还有空格组成。也就是 3^5 * 572 = 138996; 看着很多吧,其实是可以分类的。每个五元组就是一种局势。

我们只用统计只有己方棋子的局势,以及只有敌方棋子的局势,针对这两种局势给予确定的评分,而其他局势直接评分为0。

下面是我使用的是评分表

// tuple is empty    
Blank,    
// tuple contains a black chess    
B,    
// tuple contains two black chesses    
BB,    
// tuple contains three black chesses    
BBB,    
// tuple contains four black chesses    
BBBB,    
// tuple contains a white chess    
W,    
// tuple contains two white chesses    
WW,    
// tuple contains three white chesses    
WWW,    
// tuple contains four white chesses    
WWWW,    
// tuple does not exist    
Virtual,    
// tuple contains at least one black and at least one white    
Polluted    


tupleScoreTable[0] = 7;    
tupleScoreTable[1] = 35;    
tupleScoreTable[2] = 800;    
tupleScoreTable[3] = 15000;    
tupleScoreTable[4] = 800000;    
tupleScoreTable[5] = 15;    
tupleScoreTable[6] = 400;    
tupleScoreTable[7] = 1800;    
tupleScoreTable[8] = 100000;    
tupleScoreTable[9] = 0;    
tupleScoreTable[10] = 0;    

很多人可能没看懂,其实就是当前五元组中黑白棋子个数以及对应的得分,tupleScoreTable[0] 对应 没有棋子的得分,tupleScoreTable[1 - 4] 代表 1个黑棋 到 4个黑棋的得分, tupleScoreTable[5 - 8]代表 1 个白棋到4个白棋的得分,tupleScoreTable[9] 代表黑白棋共存的情况,tupleScoreTable[10] 代表其他情况(貌似没用?)

当然具体怎么来统计那?onezeros的博客没有给出来,对很多初学者来说实现还是有一定困难,这里就详细的讲一讲吧。

首先我们用一个棋盘大小的二维数组来储存每个点的得分。int scoreTabel[15][15];
每次,当People或者Computer下完棋后,以该点为中心统计周围5个点的分数(上下左右对角)。
这里写图片描述

即红点,统计每个点的分数。

对于每个红点,同样的,我们向其周围8个方向找到所有包括其自身的五元组,并统计白棋和黑棋的个数,从而根据上面的评分表进行加分。

举个例子
这里写图片描述

对于1号位置,我们先统计以它为底端的五元组,即第一个矩形,然后是第二个,第三个,一直到以1号位置为顶端的五元组,这样我们就统计了y轴方向的分数。

同理,接着统计x轴方向,两种对角线方向的五元组的得分,这样1号点位置的得分就出来了,我们将这个值赋值在对应的scoreTable[][]里面;

对图1中所有红点的得分统计完成后,我们就可以遍历整个得分表scoreTable[][],其中的分最高而且为空的位置就是计算机下子的位置。

当然,这种方法思路和编程都很简单,自然效果比不上正规军中极大极小值搜索中应用alpha-beta剪枝这种方法。

近来随着计算机的快速发展,各种棋类游戏被纷纷请进了电脑,使得那些喜爱下棋,又常常苦于没有对手的棋迷们能随时过足棋瘾。而且这类软件个个水平颇高,大有与人脑分庭抗礼之势。其中战胜过国际象棋世界冠军-卡斯帕罗夫的“深蓝”便是最具说服力的代表;其它像围棋的“手淡”、象棋的“将族”等也以其优秀的人工智能深受棋迷喜爱;而我们今天将向大家介绍的是五子棋算法。   当我们与电脑对战时,您知道这些软件是怎样象人脑一样进行思考的吗?前不久我曾编写过一个五子棋的游戏,在这里就以此为例大家一起探讨探讨。   总的来说(我们假定您熟悉五子棋的基本规则),要让电脑知道该在哪一点下子,就要根据盘面的形势,为每一可能落子的点计算其重要程度,也就是当这子落下后会形成什么棋型(如:“冲四”、“活三”等),然后通览全盘选出最重要的一点,这便是最基本的算法。当然,仅靠当前盘面进行判断是远远不够的,这样下棋很容易掉进玩家设下的陷阱,因为它没有考虑以后的变化。所以在此基础上我们加入递归调用,即:在电脑中预测出今后几步的各种走法,以便作出最佳选择,这也是我们下棋时常说的“想了几步”。如此一来您的程序便具有一定的水平了。什么?不信!过来试试吧!
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值