【问题标题】:Pac-Man - keep pacman moving in a direction once one key is pressed and released吃豆人 - 一旦按下并释放一个键,就让吃豆人朝一个方向移动
【发布时间】:2019-08-16 02:21:22
【问题描述】:

所以,我想用 pygame 模块在 python3 中编写 pac-man。但是,一旦按下一个键,我不知道如何让 pac-man 继续移动。例如,目的是按下“向上”键,吃豆人将继续朝那个方向移动,直到他碰到边界,即使我松开键。到目前为止,我还没有对这些边界进行编码,因为我优先考虑 pac-man 的连续移动。我试图嵌套一个应该可以工作的while循环,但这显然给了我一个巨大的运行时错误。关于如何做到这一点的任何想法?

if keys[pygame.K_UP] and (pac.y - pac.radius) > 0:
        pac.y -= pac.speed
        pac.direction = "UP"
    elif keys[pygame.K_DOWN] and (pac.y + 2*(pac.radius) + pac.speed) < height:
        pac.y += pac.speed
        pac.direction = "DOWN"
    elif keys[pygame.K_LEFT] and (pac.x - pac.radius) > 0:
        pac.x -= pac.speed
        pac.direction = "LEFT"
        left = True
    elif keys[pygame.K_RIGHT] and (pac.x + 2*pac.radius + pac.speed) < width:
        pac.x += pac.speed
        pac.direction = "RIGHT"
        right = True

预期的结果是输入一个方向,吃豆人会自己朝那个方向移动,而不需要按住键。实际上发生的事情是我最终不得不按住键,这样吃豆人就会朝着想要的方向移动。

【问题讨论】:

  • 能否请您在 if 语句周围添加更多代码。
  • 只有在按键被按下时(例如elif keys[pygame.K_RIGHT]...),您当前才在移动 pacman(例如 pac.x += pac.speed)。您应该在按下某个键时存储方向信息,并将移动代码放在定期执行的某个地方(例如使用计时器)。

标签: python pygame pacman


【解决方案1】:

为什么不使用变量来存储最近的方向

while True:
    if keys[pygame.K_UP] and (pac.y - pac.radius) > 0:
        recent_direction = 'UP'
    elif keys[pygame.K_DOWN] and (pac.y + 2*(pac.radius) + pac.speed) < height:
        recent_direction = 'DOWN'
    elif keys[pygame.K_LEFT] and (pac.x - pac.radius) > 0:
        recent_direction = 'LEFT'
    elif keys[pygame.K_RIGHT] and (pac.x + 2*pac.radius + pac.speed) < width:
        recent_direction = 'RIGHT'
while True:
    if recent_direction == 'UP':
        pac.y -= pac.speed
    elif recent_direction == 'DOWN':
        pac.y += pac.speed
    if recent_direction == 'LEFT':
        pac.x -= pac.speed
    if recent_direction == 'RIGHT':
        pac.x += pac.speed

希望这对你有用

【讨论】:

    【解决方案2】:

    按下键时直接移动 pacman 对您的程序不起作用。您应该在此处设置 pacman 的速度或其他内容,并将每一帧应用到另一个函数中。

    def update():
        pac.y += pac.yspeed
        pac.x += pac.xspeed
    
    
    while True:
        clock.tick(60)
        if keys[pygame.K_UP] and (pac.y - pac.radius) > 0:
            pac.yspeed = 1
        elif keys[pygame.K_DOWN] and (pac.y + 2*(pac.radius) + pac.speed) < height:
            pac.yspeed = -1
        elif keys[pygame.K_LEFT] and (pac.x - pac.radius) > 0:
            pac.xspeed = -1
            left = True
        elif keys[pygame.K_RIGHT] and (pac.x + 2*pac.radius + pac.speed) < width:
            pac.xspeed = 1
            right = True
        if keys[pygame.K_ESC]:
            break
        update()
        # Do all your other stuff
    

    【讨论】:

    • 没错。但是既然你已经走了这么远,如果它显示了如何在每个时间步中调用update,那么答案将是完整的。
    • 这非常好用,我不得不做一些小的调整以确保 pac-man 一次只能在 x 方向或 y 方向移动,所以我使用了一些 if 语句。但这绝对是完美的,谢谢
    【解决方案3】:

    我建议在你的 Pac-Man 类中创建一个对象来跟踪 Pac-Man 应该移动的方向(基本上你的 pac.direction 你已经在设置)。对于每次移动迭代,不要检查您的键映射,而是检查pac.direction 并执行它所说的操作。如果你想让你的代码基本上保持原样,基本上让它看起来类似于这样:

    if pac.direction == "UP" and (pac.y - pac.radius) > 0:
            pac.y -= pac.speed
    elif pac.direction == "DOWN" and (pac.y + 2*(pac.radius) + pac.speed) < height:
            pac.y += pac.speed
    elif pac.direction == "LEFT" and (pac.x - pac.radius) > 0:
            pac.x -= pac.speed
            left = True
    elif pac.direction == "RIGHT" and (pac.x + 2*pac.radius + pac.speed) < width:
            pac.x += pac.speed
            right = True
    

    然后,您只需在按下某个键时将pac.direction 设置为正确的值,然后再获取代码。我必须承认,我不熟悉 PyGame,所以我将把它留给读者。

    或者,您可以通过设置pac.direction = (xSpeed, ySpeed) 表单的方向将其压缩很多。然后你的代码压缩到(没有边界检查可以在行之前完成):

    pac.x += pac.direction[0]  # Could be pac.direction.x if you use an object instead of a tuple
    pac.y += pac.direction[1]  # Same as above with pac.direction.y
    left = pac.direction[0] > 0  # I'm unsure why you're doing left and right separately, so I'll just put left
    
    

    【讨论】:

      【解决方案4】:

      您可以使用 OR 语句来检查吃豆人是否已经得到指示:

      if (keys[pygame.K_UP] or pac.direction == "UP") and (pac.y - pac.radius) &gt; 0:

      对每个方向的每个 if 语句重复。

      这是假设没有其他代码在改变方向。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-10-13
        • 2011-02-28
        • 2022-08-15
        • 1970-01-01
        • 2013-01-03
        相关资源
        最近更新 更多