65.9K
CodeProject 正在变化。 阅读更多。
Home

使用MIN-MAX算法的Connect4

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.03/5 (19投票s)

2004 年 5 月 16 日

CPOL

4分钟阅读

viewsIcon

96540

downloadIcon

3194

MiniMax 算法可用于游戏 AI。

Sample Image - Connect4.gif

引言

这是一个我们都玩过的传统 Connect4 游戏,试图建立一行由 4 个相同颜色的棋子组成的行(水平、垂直或对角线)。

对于需要学习通用游戏 AI 的程序员来说,这对于放入任何基于回合的策略游戏(如井字棋甚至国际象棋)都非常有帮助。

我两年前用 C++ 制作了这个游戏。我将所有代码转换为 C#,看看将 C++ 代码转换为 C# 有多容易。

实现

该项目包含 Form1 类,其中包含简单的用户界面和绘图功能。函数 Form1.Draw 获取窗体的 Graphics 对象,以根据棋子的保存值绘制棋盘。

Connect4Board 类是从 C++ 转换而来的,它包含所有 AI 代码以及游戏规则和功能。

游戏人工智能

很抱歉,游戏的 AI 代码可能看起来难以阅读,因为它最初是用 C++ 完成的。因此,我将尝试简要解释 AI 算法,这样您就不需要阅读代码了。

AI 基于 MiniMax 算法。它通过一个递归函数工作,该函数检查计算机可以进行的 7 种可能的走法。在每种走法中,它会检查玩家可能在之后玩的 7 种走法。然后,在玩家的每种走法中,它再次检查计算机的接下来的 7 种走法,并一直进行到一定的递归级别(如 3 或 5)级别。

然后它定位棋盘状态并根据计算机和玩家的机会给它一个分数。该分数按级别返回到上一级,直到到达第一个级别,该级别为计算机的每个可能的走法都有一个分数。如果我们在计算机递归级别上,则将最佳分数返回到上一级。如果我们在玩家级别,则返回最差的分数,因为玩家会为他自己做更好的移动以对抗计算机。

对于那些感到困惑的人,我将尝试用另一种方式来表达。

首先,我们需要一个函数,该函数根据计算机和玩家的机会计算棋盘位置的分数。此函数在代码中称为“int position()”。

机会是一个空位(一个洞),周围有一排由 3 个相同颜色的棋子组成的行(水平、垂直或对角线)。如果周围有 2 个棋子,则得分较低。棋盘位置的分数是计算机的所有分数之和减去玩家的分数。

然后我们需要弄清楚何时检查棋盘的位置。一种可能的方法是在计算机的每次移动之后检查,对于 Connect4,计算机有 7 种可能的移动。因此,我们为棋盘添加一个移动。计算棋盘的分数。然后移除这个棋子。然后我们添加另一个移动,直到所有移动都被赋予一个分数。因此,计算机将决定根据最高分数来玩最好的移动。

如果计算分数的函数是非常复杂的代码,为每一个下一轮提供一个分数,那么这种方法将运行良好。但我们将无法制作这个函数。因此,更好的方法是在玩家放完他的棋子后计算分数。这将需要检查计算机和玩家的所有可能性。这意味着对于计算机的 7 次走法中的每一种,我们可以有玩家的 7 次走法。这将是 49 个要检查分数的位置。然后,我们在玩家的每 7 次走法中返回最差的位置。然后,我们在计算机的每 7 次走法中取最佳位置。

您给算法的递归级别越多,它就越能预测未来最好的走法。因此,我将简单级别设置为 3 个递归级别(检查计算机回合、玩家下一个和计算机下一个),而困难级别有 5 个递归级别,以便在花费更长时间的同时做出更好的估计。

此算法可用于任何基于回合的策略游戏,如国际象棋或类似游戏。但是游戏越复杂。您将需要制作复杂的评分函数。并有更多的递归级别。最重要的是,在每个级别上删除一些坏的走法以降低处理成本。因为您不必看到一个会让你损失很多分数的轮次的未来。

我希望您喜欢这个游戏和算法。

© . All rights reserved.