Java迷宫游戏 - 如何不穿墙

时间:2014-04-07 01:56:26

标签: java collision maze

因此,对于一个课程项目,我正在制作一个可解决的迷宫游戏(用Java)。我可以随意生成和显示迷宫而没有问题,用户/玩家的表示也是如此。然而,我遇到的问题是迷宫的各个墙壁。

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

我所拥有的是该线的两个端点 - 起始点x,起始点y,结束点x和结束点y--以及代表玩家的圆圈左上角的当前点。我还提到了圆圈左上角的建议点。

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

2 个答案:

答案 0 :(得分:0)

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

检查段交叉很容易,并且有一个很好的answer解释了如何实现它。

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

希望这有帮助!

答案 1 :(得分:0)

假设你的世界是2D,

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

[] [] [] []

[] [] [] []

和|和---是墙壁

方法#1:放大网格以包括墙交叉点。因此行和列的大小将为行+(行-1),列+(列-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类构造函数:

Wall(Point from,Point to);

方法1的碰撞检查: 移动角色时,移动后,如果它移到墙上,则不允许移动。

方法2的碰撞检查: 移动角色时,缓存角色所在的位置,以及角色移动到的位置(如果允许移动),构建一个新的Wall对象,并检查Wall列表是否包含新的Wall对象。