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

Python 冒险游戏-在房间里走来走去,python,pygame,Python,Pygame,我正在用Pygame开发一个Python冒险游戏。我的主要问题是如何定义房间的边界,让主人公在每次都不触及边界的情况下四处走动。可悲的是,我从来没有研究过算法,所以我不知道如何计算路径。我知道这个问题很笼统,很难回答,但如果你能指出正确的方向,我将不胜感激。谢谢 可悲的是,我从来没有研究过算法,所以我不知道如何计算路径 在你开始写游戏之前,你应该对自己进行这些方面的教育。这在开始时需要更多的努力,但会为以后节省更多的时间 我不熟悉pygame,但许多应用程序通常用于定义某个区域的边缘。其思想是,

我正在用Pygame开发一个Python冒险游戏。我的主要问题是如何定义房间的边界,让主人公在每次都不触及边界的情况下四处走动。可悲的是,我从来没有研究过算法,所以我不知道如何计算路径。我知道这个问题很笼统,很难回答,但如果你能指出正确的方向,我将不胜感激。谢谢

可悲的是,我从来没有研究过算法,所以我不知道如何计算路径


在你开始写游戏之前,你应该对自己进行这些方面的教育。这在开始时需要更多的努力,但会为以后节省更多的时间

我不熟悉pygame,但许多应用程序通常用于定义某个区域的边缘。其思想是,当角色行走时,您将检查角色的体积是否与墙的体积相交。然后可以调整速度或停止角色移动。使用不同的形状来获得平滑的墙,这样角色就不会被尖角边缘卡住


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

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


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

有两种简单的方法可以定义你的游戏边界,这两种方法适用于此类游戏

更简单的方法是将您的区域划分为网格,并使用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*和许多其他搜索算法使用优先级队列而不是FIFO队列。这让他们先考虑“更可能”的路径,但如果发现更直接的路径被阻塞,则绕过迂回路径。

你自己控制你的主要角色吗?或者它是某种人工智能在自己周围移动?谢谢!我正在研究A*算法。非常感谢。我目前正在研究这一点,非常感谢您的详细描述。它帮助我更好地理解算法!我可能已经习惯了A*算法,因为它为我做了大部分的思考:)地图的大小可能是A*的一个问题,因为我正在使用()的当前实现在处理1024x768地图时速度非常慢。也许我应该把每一张地图的分幅放大,减少分幅的总量。为什么你的地图这么大?1像素的瓷砖太小了。如果你希望你的游戏世界是“手绘”的而不是用瓷砖绘制的,一个合理的解决方案是也绘制一个(不可见的)可通行/不可通行区域的地图,该地图中的每个正方形都有4x4像素。您还可以通过各种方式使*“更智能”,例如区分“本地”旅行和“全球”旅行。或者你可以限制A*愿意看多远,或者强迫用户点击更容易到达的地方。是的,1像素的瓷砖肯定太小了。为了澄清,我正在使我的地图适合于2.5D视角的世界(例如猴子岛3)。即使如此,你是对的,我不需要1px的瓷砖。4甚至10像素的瓷砖就足够了。瓷砖是看不见的。谢谢你的建议。我还计划从svg导入地图,以便轻松修改每个房间。
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 )