冒险游戏 - 在房间里走来走去

时间:2009-10-26 06:16:11

标签: python pygame

我正在使用Pygame在Python上进行冒险游戏。我的主要问题是我将如何定义房间的边界并使主角走路而不会每次都碰到边界。可悲的是,我从未研究算法,所以我不知道如何计算路径。我知道这个问题很普遍,很难回答,但是正确的方向上的一点非常值得赞赏。谢谢!

4 个答案:

答案 0 :(得分:4)

有两种简单的方法来定义适合这种游戏的界限。

更简单的方法是将您的区域划分为网格,并使用2D数组来跟踪网格中的哪些方格是可通过的。通常,此数组也会存储您的地图信息,因此在每个位置都有一个数字,表示该方块是否包含草或墙或道路或山峰等(因此要显示的图片)。为了给你一个粗略的图片:

######
#.#  #
# ## #
#    #
######

如果你想要一种带有薄壁的“迷宫”外观,那么一个更复杂的方法是使用一个2D数组来指示网格方块之间是否有垂直墙,以及网格方块之间是否有水平墙。粗略的图片(它看起来像是在ASCII中拉伸,但希望你能明白这一点):

 - - - -
| |     |
   - - 
|       |
 - - - -

接下来要确定的是你的角色可能会向哪个方向移动(上/下/左/右是最简单的,但是对角线不是更难)。然后,该计划基本上必须“精神上”探索该区域,从您当前的位置开始,希望能够到达目的地。

一个简单的搜索很容易实现上/下/左/右,并且会找到最短路径(如果有的话),称为Breadth-First search。这是一些伪代码:

queue = new Queue #just a simple first-in-first-out
queue.push(startNode)
while not queue.empty():
    exploreNode = queue.pop()
    if isWalkable(exploreNode): #this doesn't work if you use
                                #"thin walls". The check must go
                                #where the pushes are instead

        if isTarget(exploreNode):
            #success!!!
        else:
            #push all neighbours
            queue.push( exploreNode.up )
            queue.push( exploreNode.down )
            queue.push( exploreNode.left )
            queue.push( exploreNode.right )

此算法对于大型地图来说速度很慢,但它会让您习惯于某些图形搜索和寻路概念。一旦你确认它正常工作,你可以尝试用A *或类似的东西替换它,这样可以在更短的时间内得到相同的结果!

A *和许多其他搜索算法使用优先级队列而不是FIFO队列。这使得他们可以首先考虑“更可能”的路径,但如果事实证明更直接的路径被阻止,则可以绕过环形路径。

答案 1 :(得分:3)

  

可悲的是,我从未研究算法,所以我不知道如何计算路径。

在开始编写游戏之前,你应该自学这些游戏。这在开始时需要更多的努力,但以后会节省你很多时间。

答案 2 :(得分:3)

我建议您阅读A*搜索算法,因为它常用于游戏中的路径问题。

如果这个游戏是二维的(或2.5),我建议你使用一个磁贴系统,因为检查碰撞会更容易。网上有很多信息可以帮助您开始使用这些信息。

答案 3 :(得分:1)

我不熟悉pygame,但许多应用程序通常使用bounding volumes来定义某个区域的边缘。我们的想法是,当你的角色行走时,你将检查角色体积是否与墙壁的体积相交。然后,您可以调整速度或阻止角色移动。使用不同的形状来获得光滑的墙壁,这样你的角色就不会卡在尖锐的边缘上。

这些概念可用于任何需要快速检测边缘和边界的应用程序。