今天有人提起五子棋的算法问题,就把以前开发的源码直接贴出来了。大家去看源码学习吧
因为五子棋算法如果要写说明可能会写非常大一贴。所以在此就只做简单的原理说明,具体的下载源码研究吧。
很多人第1步肯定会问起五子棋如何判断5子相连。基本只要熟悉2维数组应用的程序员就比较容易理解了。
在此用2维数组 白字为0 黑子为1 用数组判断,很快就能判断出是否五子相连
比如用这样的小数组表示棋盘:
arr[0]=[0,0,0,0,1]
arr[1]=[1,1,1,1,1]
arr[2]=[0,1,1,1,0]
arr[3]=[0,0,1,0,0]
arr[4]=[1,0,0,0,1]
上图是一个2维数组。 用肉眼很简单就能判断出 arr1这一行5个1。存在,同理。只要从一点出去(最后下的那步)进行8方面5个点的延伸出去,如果这5个点数值都一样则表示相连了
再来就是AI(机器人),先从最基本的AI谈起。
五子棋如何做机器人呢? 简单的方法就是估价。什么是估价,就是当对手每走一步。就对整个棋牌每个点做估价。然后找出价值最高的点那就是机器人要走的点。我写的AI估价表如下,当然越详细的估价及棋路判断最多那机器人就越强。
估价表(空值)
当前玩家 连成的子数 权值
PC 成活2 1
对手 成活2 2
PC 成活3 3
对手 成活3 4
PC 成活4 5
对手 成活4 6
PC 成活5 7
对手 成活5 8
估价表(全值)
对手 成活挡2 1
PC 成活挡2 2
对手 成活空2 3
PC 成活空2 4
对手 成活挡3 5
PC 成活挡3 6
对手 成活空3 7
PC 成活空3 8
对手 成活挡4 9
PC 成活挡4 10
对手 成活空4 11
PC 成活空4 12
对手 成活挡5 14
PC 成活挡5 15
棋子数 2 3 4 5
倍率 1 2 2.5 3
PC 4 8 12
对手 3 7 11
PC 2 6 10 15
对手 1 5 9 14
公式
对手空 子数*倍率+2
PC空 子数*倍率+1
对手挡 子数*倍率
PC挡 子数*倍率-1
可能一开始看上表完全不理解,这很正常。不过在此只说原理,至于实现方法看源码就行。
用如下例子来说明什么是估价,如何做估价。
最基本的就是:用一开始的判断输赢的方法,能取到1个点延伸8方向所得到8个方向8种排列的棋子情况。然后找出这8个方向中棋子拥有最多的数量就是这个点的估价。用通俗的话来解释下。
比如一开始那个数组:
arr[0]=[0,0,0,0,1]
arr[1]=[1,?,1,1,1]
arr[2]=[0,1,1,1,0]
arr[3]=[0,0,1,0,0]
arr[4]=[1,0,0,0,1]
大家看arr[1]这列,?处的估价是多少呢? 首先从这点出发,8方向找出子最多的一条则是估价。从肉眼上看一看就明白了那就是?处的右边。有3个1。子越多,表示他的价值最高。取出子最多的一方向就是这个点的估价。
这时候大家应该知道1个点的价价了。但这是不够的,省下的就是用同样的方法,找出整个棋盘里面没有下棋子的地方,然后用同样的方法计算它们的估价。价值最高的点。就是AI要走的点。