我正在用 C# & XNA 编写一个抽象的策略游戏。至于AI,我目前用的是Negascout,深度为5。以下是游戏介绍:
游戏由一个 6x7 六边形位置的棋盘、42 个六边形图块和每个玩家(最多 2 个玩家)的 6 个棋子(1 个国王和 5 个棋子)组成。
在游戏的第一阶段,玩家交替在棋盘的空白位置上随机放置一块瓷砖。每个图块最多可以有 6 个指向边缘的箭头。有些箭头可以是双指向的。箭头表示从该图块移动的方向。如果有有效位置,双箭头使棋子移动/跳跃 2 个位置。如果棋盘上仍有空位,则不允许玩家将棋子放置在对手的行中。
一旦这个阶段完成,下一位玩家轮流将他的国王放在离他最近的行的 6 个瓷砖中的任何一个上。接下来,棋子开始移动。棋子根据瓷砖上的箭头移动。通过捕获或阻止国王来赢得比赛。
好的,现在开始我的移动生成功能。
瓷砖放置阶段 a) 将瓷砖放置在最近的行上。旋转瓦片以找到最佳旋转。b) 一旦最近的一排已满,将一块瓷砖放置在四周被位置包围的空位置上(即没有棋盘边缘)。旋转图块以找到最佳旋转。c) 如果没有找到位置,则添加所有剩余的空位置,尝试找到最佳旋转。
国王放置阶段 a) 找到最好的瓷砖位置并将国王放置在那里。b) 将剩余的棋子放在行中剩余的空位置上。
运动阶段 a) 如果王被攻击,如果攻击的棋子没有被防御,则尝试攻击攻击棋子。b) 为所有被攻击的玩家棋子添加移动。c) 添加玩家可以攻击的所有对手棋子。d) 添加玩家可以移动到的所有位置。
现在到评估函数。
棋子放置阶段得分 = 当前玩家迄今为止放置的棋子数量 + 当前玩家最近行上的棋子 - 没有。到目前为止对手放置的瓷砖 - 最远行(离对手最近)的对手的瓷砖。
王牌放置阶段得分 = 当前玩家最近行的牌 - 最远行的对手牌(离对手最近)。
移动阶段得分 = 当前玩家的棋子值 - 对手的棋子值。
对于箭头指向的每个有效位置,图块的权重为 100。件的重量如下:
棋子值 = 棋子类型(国王 = 10000,兵 = 1000)+ 机动性 + 防御 - 攻击 - 企业 - 阻止
其中:流动性=没有。节点可以移动到的位置数(自由或被对手占领)* 1000 防御 = 否。可以实际移动到该位置的围绕该棋子的当前玩家棋子数 * 1000 被攻击 = 否。该棋子周围实际上可以移动到该位置的对手棋子数 * 1000 被阻止 = (king = -10000, pawn = -1000) 棋子无法移动,因为所有箭头都指向无效位置,并且棋子在此游戏中没有机会再次移动.
很长,但我的问题来了:
放置图块时,AI 有时会使用错误的旋转来放置图块(即,将图块放置在箭头指向无效位置的位置)。有时这发生在他的“家”行。
移动棋子时,AI 忽略了国王的安全。主要移动国王,并在大约 4-6 步中被捕获。
任何人,尤其是具有国际象棋人工智能经验的人,对如何改进我的人工智能,特别是我的移动生成和评估功能有想法和建议?
谢谢伊万
顺便说一句...如果有人有兴趣试用邮件,请告诉我,我会在我的网站上上传设置。