在益智游戏中检测“不再移动”

时间:2012-03-04 21:57:45

标签: c# xna puzzle

我在Flash中写了一段小游戏,我现在正用C#重新编码我的新编程经验。但是这一次,我希望能够实现检测网格何时无法解决的想法。这更像是一个概念性的谜题问题,但我会采取你可能拥有的任何资源。

游戏涉及在地图上向上,向下,向左或向右移动玩家,推动游戏块。当没有剩余某些类型的块时,赢得该级别。然而,很容易发现自己处于不再可解决的地图中。例如,如果播放器开始卡在一个墙块中,那么就根本无法解决它。

很抱歉这个抽象的问题,但是有没有人对此有任何提示?

4 个答案:

答案 0 :(得分:2)

你基本上有两种选择。两者都有优点和缺点,因此您可能希望将两者的想法结合到您的解决方案中。

选项1:编写启发式

考虑使游戏无法解决的情况(例如被卡在一堵墙块中)。一旦发生这种情况,就会检测到这种情况并打印“不再移动”。您可以考虑和实施的情况越多,算法就越好。

优势:简单快捷。

缺点:有些情况下游戏无法解析但你的算法却没有检测到它。

选项2:编写解算器

编写一个程序,给定游戏的状态(玩家在哪里,块在哪里等),输出可用于解决游戏的步骤列表(当没有解决方案时,或null或其他一些特殊值 - 这是你的“不再动作”的情况。)

如何实现这样的事情取决于游戏的确切规则。一个简单的方法是在Breadth-First Search上执行Game Tree:树中的每个节点都是游戏状态,节点之间的每个弧都是玩家可以采取的行动(向上移动,向下移动)等等。)。

优势:这可以可靠地检测何时无法赢得比赛。此外,该程序可用于在玩家卡住时向玩家提供提示。

缺点:根据游戏的复杂程度,计算解决方案可能需要很长时间。对于非常简单的游戏,这可以工作;对于一些简单的游戏,它可能需要很长时间,对于相当复杂的游戏,例如国际象棋或棋子,这是非常困难或不可能的。

答案 1 :(得分:0)

对于任何情况都有蛮力的方式 - 只需创建玩家可以制作的整个动作树。如果他们都没有赢得胜利,那么这场比赛就无法取胜。

当然,对于像纸牌游戏这样的游戏,你应该只考虑用户知道什么,而不是游戏中的任何隐藏元素 - 一些单人纸牌游戏是不可能开始的,但玩家不应该知道这一点。对于其他更复杂的游戏,蛮力不适合,因为树需要太长时间才能生成。在这些情况下,您需要找到常见的模式并检测它们。

对不起,对于任何具体的答案,它有点过于模糊。但这些是我的提示。

答案 2 :(得分:0)

你收到了关于发现游戏是否可以解决的答案,但是,在我看来你只是想看看是否还有任何合法的举动,这更容易。

当然,如果没有游戏的描述,就不可能给你任何具体的建议,但只需要听取@ Heinzi的建议并记住你只是想看看是否有任何合法的举动。因此,如果您实际上可以构建一个非空的Game Tree,那么还有一些合法的举措。

答案 3 :(得分:0)

我需要类似的东西一次。我做了一个随机生成的迷宫,需要知道是否有可能解决它...

我做了一项测试,测试了所有可能的解决方案。游戏区域(2D)是10 * 14个大牌,玩家可以在4个方向移动(就像你的游戏一样)。我的游戏只是从A点到B点。在某种程度上,你的游戏大致相同,它将把块从A点移动到B.我将从块当前位置开始,然后制作一个算法,试着向每个方向移动它。如果块的任何方向都可以,我会将瓷砖(我试图将块移动到的)添加到包含所有尚未测试的瓷砖的列表中...

所以基本上从一个瓷砖开始......测试4个方向......然后测试可能移动到的瓷砖。因此,如果可以将块移动到右侧,那么您需要测试是否可以将块从块向右移动到任何其他位置。要跟踪您测试过的瓷砖,请在瓷砖中添加一个变量,告知是否已经过测试,以及“可能达到”且尚未测试的瓷砖列表。