我正在使用 Pygame 在 Python 中开发一款冒险游戏。我的主要问题是我将如何定义房间的边界并让主角四处走动而不会每次都碰到边界。可悲的是,我从未研究过算法,所以我不知道如何计算路径。我知道这个问题很笼统,很难回答,但非常感谢您指出正确的方向。谢谢!
4 回答
有两种简单的方法可以定义适合此类游戏的界限。
更简单的方法是将您的区域划分为网格,并使用 2D 数组来跟踪网格中的哪些正方形是可以通过的。通常,此数组也存储您的地图信息,因此在每个位置,都有一个数字指示该方格是否包含草或墙壁或道路或山脉等(以及显示什么图片)。给你一个粗略的图片:
######
#.# #
# ## #
# #
######
如果您想要一种具有薄壁的“迷宫”外观,则需要一种更复杂的方法,即使用 2D 数组来指示网格正方形之间是否存在垂直墙,以及它们之间是否存在水平墙网格方块。一张粗略的图片(它看起来像 ASCII 一样被拉伸,但希望你能明白这一点):
- - - -
| | |
- -
| |
- - - -
接下来要决定的是你的角色可以朝哪个方向移动(上/下/左/右是最简单的,但对角线并不太难)。然后程序基本上要“精神”地探索该区域,从您当前的位置开始,希望能遇到目的地。
一种简单的向上/向下/向左/向右搜索很容易实现,并且会找到最短路径(如果有的话),称为广度优先搜索。这是一些伪代码:
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 队列。这让他们首先考虑“更有可能”的路径,但如果结果证明更直接的路径被阻塞,则绕过环岛路径。
可悲的是,我从未研究过算法,所以我不知道如何计算路径。
在你开始编写游戏之前,你应该对这些进行自我教育。这在开始时需要更多的努力,但以后会为您节省很多时间。
我建议您阅读A*搜索算法,因为它通常在游戏中用于解决路径问题。
如果这个游戏是二维的(或 2.5),我建议你使用瓷砖系统,因为检查碰撞会更容易。网上有很多信息可以让你开始使用这些。
我不熟悉 pygame,但许多应用程序通常使用包围体来定义某些区域的边缘。这个想法是,当你的角色行走时,你将检查角色体积是否与墙壁的体积相交。然后,您可以调整速度或阻止角色移动。使用不同的形状来获得光滑的墙壁,这样你的角色就不会卡在尖角上。
这些概念可用于任何需要快速边缘和边界检测的应用程序。