我应该如何为Connect 4设计一个好的评估功能?

时间:2012-06-11 17:46:06

标签: java heuristics evaluation-function

我有一个“连接4”游戏的java实现(有可变数量的列和行)。

此实现使用(根据用户的选择)Mini-max的Mini-max算法,具有Alpha-beta修剪,最大搜索深度 maxDepth

我现在的问题是为电路板的状态设计良好的评估功能(这是在maxDepth返回的值)。

值介于 -100(最差选择,它对应于失败情况) 100(最佳选择,它对应于获胜情况)其中 0 应该是“抽奖”情况

实际上我已经实现了两个函数(我报告伪代码,因为代码很长)

1)

  • 没有胜利/没有失去

- >如果表格已满==>画(0)

- >如果表格不满==>不确定的情况(50)

- >如果我赢了:100

- >如果赢了对手:-100

2)

Of me:
- InARow[0] = maximum number of pieces in a HORIZONTAL in a row
- InARow[1] = maximum number of pieces in a VERTICAL in a row
- InARow[2] = maximum number of pieces in a DIAGONAL (ascending) in a row
- InARow[3] = maximum number of pieces in a DIAGONAL (descending) in a row
Of the opponent
- InARow2[0] = maximum number of pieces in a HORIZONTAL in a row
- InARow2[1] = maximum number of pieces in a VERTICAL in a row
- InARow2[2] = maximum number of pieces in a DIAGONAL (ascending) in a row
- InARow2[3] = maximum number of pieces in a DIAGONAL (descending) in a row

value = (100* (InARow[0] + InARow[1] + InARow[2] + InARow[3]) )/16 - (100* (InARow2[0] + InARow2[1] + InARow2[2] + InARow2[3]) )/16  

我需要设计一个第三个(如果可能的话更好)功能。有什么建议吗?

提前谢谢。

3 个答案:

答案 0 :(得分:4)

只计算每个玩家仍然可以制作的4行数,并相互减去。

例如,两位玩家的得分均为7*4 (horizontal) + 4*7 (vertical) + 4*4 (diagonal up) + 4*4 (diagonal down)。如果红色在左下角放置一个,则黄色会失去1 + 1 + 1 + 0 = 3的分数。但是如果红色将一个放在中间,则黄色会失去4 + 1 + 1 + 1 = 7的分数。

当然,如果任何一名玩家获胜,那么无论上述系统如何,其他玩家的得分均为-infinity

答案 1 :(得分:3)

你已经解决了基本情况:我的胜利= 100分,我的损失= -100,平局= 0。你可以杀死的“不确定”的情况,它并不反映董事会的“善意”。所以现在你需要填补空白。您要考虑的案例并将值分配给:

  • 我有一个X连续(如果我连续3个,这比连续两个更好 - 你的功能应该倾向于在较短的行上添加更长的行)
  • 我的对手连续X(同样,他/她连续越多,我们的情况越差)
  • 计算你要填充的行数(放置一块并形成2行3个比放置一块并且只形成一行3个好)
  • 计算你阻挡了多少行(类似地,如果你可以放下一块并阻止两个对手的行数为3,那么比阻止一行2行更好)

答案 2 :(得分:0)

以下是连接4

的两个独立评估函数
  1. 一个基本的评估函数如另一个答案中所建议的那样,我们可以计算出玩家仍可以制作的行中可能的4个数量,并从对手中减去它。与只有1个图块的块相比,您可以为已经有三个图块的块赋予不同的权重或重要性。
  2. 可以使用威胁的概念构建另一个更强大的评估功能。威胁是一个正方形,当对手放下一块瓷砖时它连接4。您可以简单地返回每个玩家的威胁数量差异,但我们可以通过实际过滤无用的威胁(比如对手威胁之上的威胁,或者两个玩家都面临威胁的威胁)甚至分配奖金来做得更好对于某些威胁(如列的最低威胁或同一玩家的2次连续威胁)。
  3. 对于较大的项目,可以手动调整权重或自学。