我用C#编写了一个抽象策略游戏。 XNA。至于人工智能,我目前正在使用Negascout,深度为5.以下是对游戏的描述:
游戏包括一个6x7六角形位置的板,42个六角形瓷砖,以及每个玩家最多2个玩家的6个棋子(1个王牌和5个棋子)。
在游戏的第一阶段,玩家交替地将随机牌放置在棋盘的空位置上。每个图块最多可以有6个箭头指向边缘。有些箭头可以是双尖的。箭头表示从该图块移动的方向。如果有有效位置,双向箭头会使一块移动/跳跃2个位置。如果棋盘上还有空位,则不允许玩家将棋子放在对手的行中。
一旦这个阶段完成,下一个玩家将他的国王放在距离他最近的6个瓦片中的任何一个上。接下来,件的运动开始。根据瓷砖上的箭头移动碎片。通过捕获或阻挡国王来赢得比赛。
好的,现在我的移动生成功能。
瓷砖放置阶段 a)将瓷砖放在最近的行上。旋转瓷砖以找到最佳旋转。 b)一旦最近的行已满,将瓷砖放在空位置上,该位置被所有侧面的位置包围(即没有板边缘)。旋转瓷砖以找到最佳旋转。 c)如果未找到任何位置,请添加所有剩余的空位置,尝试找到最佳旋转位置。
King放置阶段 a)找到最好的瓷砖的位置,并将国王放在那里。 b)将剩余的棋子放在该行的其余空位置上。
运动阶段 a)如果国王受到攻击,如果没有防御,则尝试攻击攻击部分。 b)为所有被攻击的玩家的棋子添加动作。 c)添加玩家可以攻击的所有对手棋子。 d)添加玩家可以移动的所有位置。
现在进行评估功能。
瓷砖放置阶段 得分=当前玩家到目前为止放置的牌数+当前玩家在最近一排的牌 - 没有。到目前为止放置的瓷砖对手 - 对手的最远行(最接近对手)的瓷砖。
King放置阶段 得分=最近一行的当前玩家的牌 - 最远一行的对手牌(最接近对手)。
运动阶段 得分=当前玩家的棋子价值 - 对手的棋子价值。
对于箭头指向的每个有效位置,图块的权重为100。碎片的重量如下:
片段价值=片段类型(国王= 10000,典当= 1000)+流动性+防御 - 攻击 - 企业 - 被阻止
其中: mobilty =没有。位置节点可以移动到(由对手释放或占用)* 1000 辩护=不。围绕这件作品的当前玩家作品可以实际移动到这个位置* 1000 攻击=否。围绕这件作品的对手棋子可以实际移动到这个位置* 1000 blocked =(king = -10000,pawn = -1000)棋子无法移动,因为所有箭头都指向无效位置且该棋子在此游戏中无法再次移动。
很长一段时间,但问题出现了:
放置瓷砖时,AI有时会使用错误的旋转放置瓷砖(即将瓷砖放置在箭头指向无效位置的位置)。有时这发生在他的“家”行中。
当移动棋子时,AI忽略了王的安全。移动大部分是国王,并在大约4-6次移动中被捕获。
任何人,尤其是国际象棋人工智能经验,都有关于如何改进人工智能的想法和建议,特别是我的移动生成和评估功能?
由于 伊万
btw ...如果有人有兴趣尝试邮件,请告诉我,我会在我的网站上传一个设置。
答案 0 :(得分:2)
很长一段时间,但问题出现了:
确实很长。
当放置瓷砖时,AI有时会使用错误的旋转放置瓷砖(即将瓷砖放置在箭头指向无效位置的位置)。有时这发生在他的“家”行中。
换句话说,您的代码中存在错误。即使有这么广泛的序言,也没有办法回答这个问题。这个问题应该在一个单独的,简明扼要的问题中,其中包括相关代码的副本。
当移动棋子时,AI忽略了王安全。移动大部分是国王,并在大约4-6次移动中被捕获。
与上述相同。即使是你所写的大量序言,也无法回答这个问题。
我的建议是更简洁地回答您的问题,仅发布与问题相关的详细信息,而不是将多个问题合并到一个帖子中。
任何人,尤其是国际象棋人工智能经验,都有关于如何改进人工智能的想法和建议,特别是我的移动生成和评估功能?
这是一个过于含糊的问题,通常会被关闭。如果您需要关于代码的一些建议,则必须提供该代码,以便任何人都能为您提供超出盲目推测的有用答案!