这是一个我已经思考了一个星期左右的问题,由同事提出:
想象一个在36x36的网格上玩的游戏。游戏的目标是创建任何大小(例如2x2、3x3、4x4等)的正方形的四个角。第一个玩家可以在除中心四个网格空间以外的任何地方放置游戏棋子。第一步后,玩家可以在网格的任何地方放置游戏棋子。放置的棋子不能移动。就是这样,游戏简单有趣。
我一直在努力想出一种算法来赢得这个游戏,或者至少做得不错。有什么建议吗?
这是一个我已经思考了一个星期左右的问题,由同事提出:
想象一个在36x36的网格上玩的游戏。游戏的目标是创建任何大小(例如2x2、3x3、4x4等)的正方形的四个角。第一个玩家可以在除中心四个网格空间以外的任何地方放置游戏棋子。第一步后,玩家可以在网格的任何地方放置游戏棋子。放置的棋子不能移动。就是这样,游戏简单有趣。
我一直在努力想出一种算法来赢得这个游戏,或者至少做得不错。有什么建议吗?
有很多启发式方法可供选择,大多数情况下您需要混合使用其中一些。
您需要填充正方形还是只需将其放置在角落里?
例如,以下情况是否为胜利?
.......................
.X..X..................
.......................
.......................
.X..X..................
.......................
.......................
.XXXX..................
.X..X..................
.X..X..................
.XXXX..................
.......................
.......................
.XXXX..................
.XXXX..................
.XXXX..................
.XXXX..................
.......................
好的,我正在将垃圾读入游戏中...因为它是模棱两可的...我假设这个游戏类似于“点和线”,其中移动空间是连接两个相邻点的线。所以2x2网格将有9个顶点,4个1x1获胜位置和1个2x2获胜位置。当一个人完成一个正方形时,游戏以胜利结束,一旦两个玩家都用完了可赢的解决方案,就会打成平局。
由于你正在处理正方形,一些逻辑很好。你可以计算任何线段对所有可能的框的成员资格。所以在2x2的例子中,半径将在2个1x1框中具有成员资格,而侧面将在一个1x1和一个2x2中具有成员资格。这种成员资格变得很重要。
在游戏开始时,您需要为所有线段生成所有成员资格。制作2份副本...(就像玩战舰一样)敌人的副本将被初始化为他完成每个框所剩余的回合数...所以在36x36上,将有144次行动来完成大框架,4组140次行动来完成4个35x35的框架。
在你的移动过程中,你会减少所有受影响的敌方方块。在你的移动中,任何一个你所做的移动都会使包含该移动的所有方块无效。你可以将这些方块设置为负1、无限或20亿……只要知道这些方块是不可能的即可。
现在,你需要创建一个反向的敌方方块副本,即“反敌方副本”。其中包含完成给定方块所需的步数。
对于给定的移动,首先检查是否存在获胜的情况。如果你能够移动并获胜(反敌方副本中有一个方块为1),则进行移动。然后检查是否需要阻止对手(敌方棋盘上有任何一个方块为1)。
现在,如果你愿意,可以添加一个极小化-极大化函数。
或者使用搜索来找到摧毁尽可能多的低分方块的位置,或者创建一条线路,在反敌方棋盘上减少多个低分方块。这应该是合理的,因为它不是试图完成任何特定的方块,而是一个极小化-极大化,你们两个都在争取低分数的情况下,这将是一个更好的情况。