1

我正在用 C# & XNA 编写一个抽象的策略游戏。至于AI,我目前用的是Negascout,深度为5。以下是游戏介绍:

游戏由一个 6x7 六边形位置的棋盘、42 个六边形图块和每个玩家(最多 2 个玩家)的 6 个棋子(1 个国王和 5 个棋子)组成。

在游戏的第一阶段,玩家交替在棋盘的空白位置上随机放置一块瓷砖。每个图块最多可以有 6 个指向边缘的箭头。有些箭头可以是双指向的。箭头表示从该图块移动的方向。如果有有效位置,双箭头使棋子移动/跳跃 2 个位置。如果棋盘上仍有空位,则不允许玩家将棋子放置在对手的行中。

一旦这个阶段完成,下一位玩家轮流将他的国王放在离他最近的行的 6 个瓷砖中的任何一个上。接下来,棋子开始移动。棋子根据瓷砖上的箭头移动。通过捕获或阻止国王来赢得比赛。

好的,现在开始我的移动生成功能。

  1. 瓷砖放置阶段 a) 将瓷砖放置在最近的行上。旋转瓦片以找到最佳旋转。b) 一旦最近的一排已满,将一块瓷砖放置在四周被位置包围的空位置上(即没有棋盘边缘)。旋转图块以找到最佳旋转。c) 如果没有找到位置,则添加所有剩余的空位置,尝试找到最佳旋转。

  2. 国王放置阶段 a) 找到最好的瓷砖位置并将国王放置在那里。b) 将剩余的棋子放在行中剩余的空位置上。

  3. 运动阶段 a) 如果王被攻击,如果攻击的棋子没有被防御,则尝试攻击攻击棋子。b) 为所有被攻击的玩家棋子添加移动。c) 添加玩家可以攻击的所有对手棋子。d) 添加玩家可以移动到的所有位置。

现在到评估函数。

  1. 棋子放置阶段得分 = 当前玩家迄今为止放置的棋子数量 + 当前玩家最近行上的棋子 - 没有。到目前为止对手放置的瓷砖 - 最远行(离对手最近)的对手的瓷砖。

  2. 王牌放置阶段得分 = 当前玩家最近行的牌 - 最远行的对手牌(离对手最近)。

  3. 移动阶段得分 = 当前玩家的棋子值 - 对手的棋子值。

对于箭头指向的每个有效位置,图块的权重为 100。件的重量如下:

棋子值 = 棋子类型(国王 = 10000,兵 = 1000)+ 机动性 + 防御 - 攻击 - 企业 - 阻止

其中:流动性=没有。节点可以移动到的位置数(自由或被对手占领)* 1000 防御 = 否。可以实际移动到该位置的围绕该棋子的当前玩家棋子数 * 1000 被攻击 = 否。该棋子周围实际上可以移动到该位置的对手棋子数 * 1000 被阻止 = (king = -10000, pawn = -1000) 棋子无法移动,因为所有箭头都指向无效位置,并且棋子在此游戏中没有机会再次移动.

很长,但我的问题来了:

  1. 放置图块时,AI 有时会使用错误的旋转来放置图块(即,将图块放置在箭头指向无效位置的位置)。有时这发生在他的“家”行。

  2. 移动棋子时,AI 忽略了国王的安全。主要移动国王,并在大约 4-6 步中被捕获。

任何人,尤其是具有国际象棋人工智能经验的人,对如何改进我的人工智能,特别是我的移动生成和评估功能有想法和建议?

谢谢伊万

顺便说一句...如果有人有兴趣试用邮件,请告诉我,我会在我的网站上上传设置。

4

1 回答 1

2

很长,但我的问题来了:

确实很长。

放置图块时,AI 有时会使用错误的旋转来放置图块(即,将图块放置在箭头指向无效位置的位置)。有时这发生在他的“家”行。

换句话说,您的代码中有错误。没有办法回答这个问题,即使有这么多的序言。这个问题应该是一个单独的、措辞简洁的问题,其中包括相关代码的副本。

移动棋子时,AI 忽略了国王的安全。主要移动国王,并在大约 4-6 步中被捕获。

和上面一样。即使您编写的大量序言也无法回答这个问题。

我对您的建议是,您的问题要更加简洁,只发布与问题相关的详细信息,而不是将多个问题合并到一个帖子中。

任何人,尤其是具有国际象棋人工智能经验的人,对如何改进我的人工智能,特别是我的移动生成和评估功能有想法和建议?

这是一个过于模糊的问题,通常会被关闭。如果您需要有关您的代码的一些建议,您必须提供该代码,以便任何人给您一个超出盲目猜测的有用答案!

于 2010-12-04T00:56:34.053 回答