Java迷宫游戏--如何不穿过墙壁



所以对于一个类项目,我正在制作一个可解决的迷宫游戏(用Java)。 我可以毫无问题地随机生成和显示迷宫,用户/玩家的表示也是如此。 但是,我遇到的问题是迷宫的各个墙壁。

我需要确保玩家无法穿过墙壁。 我环顾四周,似乎很多人都有类似的问题,但他们正在使用网格结构来制作迷宫。 我不是——我的迷宫的墙壁只是线条,所以我不能做其他人正在做的事情,(看看迷宫中的某个细胞是否已经被占用了——我没有细胞要检查)。

我所拥有的是这条线的终点——起始 x、起始 y、结束 x 和结束 y——以及代表玩家的圆圈左上角的当前点。 我也有提议的新圆圈左上角的要点。

我需要知道玩家是否会越过代表墙壁的任何一条线。 目前,我遍历一个包含所有墙壁的数组。 鉴于当前的球员位置和提议的球员位置,我需要找出这是否涉及越墙。 任何提示/提示/帮助将不胜感激。 提前谢谢你!

假设你的世界是2D的,

[] [] []|[]
      -----
[] [] [] []
[] [] [] []
[] [] [] []

和 | 和 --- 是墙

方法#1:放大网格以包括墙壁交叉点。因此,行和列的大小将是行+(行-1),col+(col-1)

这是您的新数组表示形式:原始行 = 4,新行 = 4+3 = 7。这也将创建墙壁来检查对角线运动。

[ ][ ][ ][ ][ ][|][ ]
[ ][ ][ ][ ][-][-][-]
[ ][ ][ ][ ][ ][ ][ ]
[ ][ ][ ][ ][ ][ ][ ]
[ ][ ][ ][ ][ ][ ][ ]
[ ][ ][ ][ ][ ][ ][ ]
[ ][ ][ ][ ][ ][ ][ ]

方法 #2:使用 4x4 表示形式,创建一个存储相邻图块坐标的墙类。然后创建一个列表来存储墙壁列表。

Wall(Point x,Point y); // constructor
Wall wall1 = new Wall(new Point(0,2),new Point(0,3));
Wall wall2 = new Wall(new Point(0,2),new Point(1,2));
Wall wall3 = new Wall(new Point(0,3),new Point(1,3));
此表示允许您创建规则,使 0,0 可以转到 1,1,但 0,1

不能转到 1,0。如果你想要一堵单向墙,这听起来可能很愚蠢,但谁知道呢?您可以修改墙类构造函数:

Wall(Point from,Point to);

方法 1 的冲突检查:移动角色时,移动后,如果它落在墙上,则不允许移动。

方法 2 的冲突检查:移动角色时,缓存角色的来源,以及角色将移动到的位置(如果允许移动),基于该对象构造一个新的 Wall 对象,并检查 Wall 列表是否包含新的 Wall 对象。

您可以构造一个线段(x1,x2),其中x1是玩家的当前位置,x2是玩家尝试移动到的位置。任何穿过墙壁的移动都会使此线段与墙段相交。因此,您可以通过检查 (x1, x2) 与所有迷宫墙的交集(线性时间任务)来验证移动。

检查段交集很容易,并且有一个很好的答案来解释如何实现它。

如果可以添加任何其他信息(例如,墙的最大长度),则可以以这样一种方式存储迷宫,这样您就不必查询所有墙的交叉点。例如,如果墙壁是水平或垂直的,并且移动也是如此,则只需在垂直移动的情况下检查水平墙壁。

希望这有帮助!

最新更新