如何设计一个适合Connect 4的优秀评估函数?

9

我有一个Java实现的“Connect 4”游戏(具有可变列数和行数)。

根据用户选择,此实现使用Mini-max算法或Alpha-beta剪枝的Mini-max算法,在搜索的最大深度为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个回答

7
只需计算每个玩家仍然可以制造的4行数量,然后将其相互减去即可。
例如,两个玩家都从得分为7*4(水平)+ 4*7(垂直)+ 4*4(对角线向上)+ 4*4(对角线向下)开始。如果红色在左下角放置一个棋子,则黄色会失去1 + 1 + 1 + 0 = 3的得分。但是,如果红色将一个棋子放在中间,黄色将失去4 + 1 + 1 + 1 = 7的得分。
当然,如果任何一方获胜,则另一方的得分为-无限大,无论上述系统如何。

1
计算6的7次方不会很耗费资源吗?(其中6是深度,7是列数) - shinzou
如何计算这个? - qwerty

6
你已经处理好了基本情况:我赢得100分,我输了-100分,平局为0分。你可以消除“不确定”情况,因为它不反映棋盘的“好坏”。现在你需要填补空缺。以下是你想要考虑和分配值的情况:
  • 我有X子连成一行(如果我有3个连成一行,那比只有2个连成一行更好——你的函数应该优先考虑添加到较长的连珠中)
  • 我的对手有X子连成一行(同样,他/她连成的越多,我们就越糟糕)
  • 计算你填充了多少行(放置一个棋子并形成2个3子连珠比只形成一个3子连珠更好)
  • 计算你阻止了多少行(类似地,如果你可以放下一颗棋子并阻止两个对手的3子连珠,那比阻止一个2子连珠更好)

2
这里有两个针对四子棋的评估函数:
  1. 一个基本的评估函数建议是,我们可以计算玩家仍然可以制造的可能的四子连珠数量,并从对手中减去它。您可以根据已经有三个棋子的方块与只有一个棋子的方块之间的差异给予不同的权重或重要性。
  2. 另一个更强的评估函数可以使用威胁的概念构建。威胁是指当对手在一个方格中放置一枚棋子时,连接4个棋子。您可以简单地返回每个玩家威胁数量的差异,但我们可以通过过滤无用的威胁(例如仅在对手威胁上方的威胁,或所有威胁都在两个玩家的威胁之上)甚至为某些威胁分配奖励(例如列的最底部威胁或相同玩家的2个连续威胁)来做得更好。
这些权重可以手动调整或自学习以适用于更大的项目。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接