3

我正在写一个小游戏,由迷宫、玩家角色和一定数量的敌人组成。PC 和敌人都属于一个给定的类别,它们根据我指定的标准每隔几毫秒更新一次移动。(所有这些限制都是作业的一部分)。现在,我正在尝试编写一个标准,以便敌人和 PC 都不会移动到被迷宫墙占据的方格。为此,我使用了以下方法(所有这些都在我正在制作的 Game 类中):

def isNotWall(self,x,y):

        self.wallXI = 0
        self.wallXF = 0
        self.wallYI = 0
        self.wallYF = 0
        for wall in self.wallList:
            self.wallXI = wall[0]*self.grid + 1
            self.wallXF = (wall[0]+1)*self.grid
            self.wallYI = wall[1]*self.grid + 1
            self.wallYF = (wall[1]+1)*self.grid
            if self.wallXI < x < self.wallXF and self.wallYI < y < self.wallYF:
                return False


        return True

其中 wallList 是一个列表,其中包含数组坐标中每面墙的 x 和 y 坐标,而 grid 是每个网格正方形的大小(在本例中为 32 像素)。

现在,举一个我如何实现它的例子:

if snake[1] > self.heroe_x:
            if self.isNotWall(snake[1] - 30,snake[2]):
                snake[1] = snake[1] - 30 * segundos

其中snake[1]是以像素为单位的x坐标,snake[2]是y,segundos是经过了多少毫秒,这样敌人就会移动适当数量的像素。

据此,如果蛇(和角色)在移动结束时的位置被墙占据,则它们不应朝某个方向移动。然而,这只是部分起作用,行为不稳定,一些墙只在一个方向上起作用,而且角色经常被卡在墙内或无缘无故地停止寒冷。

任何修复这些缺陷的帮助将不胜感激。我意识到这个问题不是很简洁,但是由于我对语言的缺乏经验,我想不出一种方法来使问题更具体,并且以前的答案对我没有帮助。提前致谢!

4

1 回答 1

1

如果你只检查最终位置,如果蛇挡住它,它不会撞到墙上。说墙壁距离蛇只有 15 平方?

此外,蛇正在移动 30*segundos,但您只是在检查 30 平方以外是否有一堵墙

if snake[1] > self.heroe_x:
    next_position_x = snake[1] - (30 * segundos)
    if self.isNotWall(next_position_x,snake[2]):
        snake[1] = next_position_x

如果我是你,我会实现一个真正的寻路算法,让墙壁通过成本无限,这样它就永远不会越过墙壁。

http://en.wikipedia.org/wiki/Pathfinding

还要检查这个库

http://lib2dp.sourceforge.net/

于 2013-11-14T16:19:57.750 回答