吃豆人 - 一旦按下并释放一个键,让吃豆人朝一个方向移动

Pac-Man - keep pacman moving in a direction once one key is pressed and released

所以,我想用 pygame 模块在 python3 中编写吃豆人代码。但是,我不知道如何在按下单个键后让吃豆人继续移动。目的是按下 "up" 键,吃豆人将继续朝那个方向移动,直到他碰到边界,即使我松开键也是如此。截至目前,我还没有对这些边界进行编码,因为我优先考虑吃豆人的连续运动。我试图嵌套一个 while 循环,它应该可以工作,但这显然给了我一个 phat 运行-time 错误。关于如何执行此操作的任何想法?

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

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

按下键时直接移动 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

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

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

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

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

我建议在你的吃豆人 class 中创建一个对象来跟踪吃豆人应该移动的方向(基本上你的 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,所以我会把它留给 reader。

或者,你可以通过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

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

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

希望这对你有用