5

我有一个“连接 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  

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

先感谢您。

4

3 回答 3

5

只需计算每个玩家仍然可以制作的行中可能的 4 的数量,然后从彼此中减去。

例如,两个玩家都以 0 分开始7*4 (horizontal) + 4*7 (vertical) + 4*4 (diagonal up) + 4*4 (diagonal down)。如果红色在左下角放一个,那么黄色就会失去 0 分1 + 1 + 1 + 0 = 3。但是如果红色把一个放在中间,黄色就会失去 0 分4 + 1 + 1 + 1 = 7

当然,如果任何玩家获胜,则其他玩家的得分为-infinity,无论上述系统如何。

于 2012-06-13T09:07:21.567 回答
4

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

  • 我连续有 X (如果我连续有 3 个,那比连续只有两个要好 - 你的函数应该有利于添加更长的行而不是更短的行)
  • 我的对手连续有X(同样,他/她连续的越多,我们越糟糕)
  • 数一数您要填写多少行(放置一块并形成 2 排 3 比放置一块并仅形成一排 3 更好)
  • 数一数你挡了多少排(类似地,如果你可以放下一块并挡住两个对手的 3 排,那比挡住 2 排的单排要好)
于 2012-06-11T17:57:25.603 回答
1

这是连接 4 的两个独立评估函数

  1. 一个基本评估函数如另一个答案中所建议的那样,我们可以计算玩家仍然可以连续制作的可能 4 的数量,并将其从对手中减去。与只有 1 个图块的块相比,您可以为已经具有 3 个图块的块赋予不同的权重或重要性。
  2. 另一个更强大的评估功能可以使用威胁的概念来构建。威胁是一个正方形,当对手将瓷砖掉在那里时,连接 4。您可以简单地返回每个玩家威胁数量的差异,但我们可以通过实际过滤无用威胁(例如仅高于对手威胁的威胁,或高于双方威胁的所有威胁)甚至分配奖金来做得更好对于某些威胁(例如一列中最低的威胁或同一玩家的 2 个连续威胁)。

对于更大的项目,可以手动调整权重或自学。

于 2016-07-29T11:42:49.830 回答