Pac-Man - 按下并释放一个键后,让吃豆人保持一个方向移动

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


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

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


翻翻过去那场雪
浏览 256回答 3
3回答

鸿蒙传说

当按键被按下时直接移动你的 pacman 对你的程序不起作用。您应该在此处设置吃豆人的速度或其他内容,并将其应用于另一个函数中的每一帧。def update():&nbsp; &nbsp; pac.y += pac.yspeed&nbsp; &nbsp; pac.x += pac.xspeedwhile True:&nbsp; &nbsp; clock.tick(60)&nbsp; &nbsp; if keys[pygame.K_UP] and (pac.y - pac.radius) > 0:&nbsp; &nbsp; &nbsp; &nbsp; pac.yspeed = 1&nbsp; &nbsp; elif keys[pygame.K_DOWN] and (pac.y + 2*(pac.radius) + pac.speed) < height:&nbsp; &nbsp; &nbsp; &nbsp; pac.yspeed = -1&nbsp; &nbsp; elif keys[pygame.K_LEFT] and (pac.x - pac.radius) > 0:&nbsp; &nbsp; &nbsp; &nbsp; pac.xspeed = -1&nbsp; &nbsp; &nbsp; &nbsp; left = True&nbsp; &nbsp; elif keys[pygame.K_RIGHT] and (pac.x + 2*pac.radius + pac.speed) < width:&nbsp; &nbsp; &nbsp; &nbsp; pac.xspeed = 1&nbsp; &nbsp; &nbsp; &nbsp; right = True&nbsp; &nbsp; if keys[pygame.K_ESC]:&nbsp; &nbsp; &nbsp; &nbsp; break&nbsp; &nbsp; update()&nbsp; &nbsp; # Do all your other stuff

慕侠2389804

我建议在你的 Pac-Man 类中创建一个对象来跟踪 Pac-Man 应该移动的方向(基本上你pac.direction已经设置了)。对于每个移动迭代,不是检查您的键映射,而是检查pac.direction并执行它所说的操作。如果你想保持你的代码大部分是这样的话,基本上让它看起来与这个相似:if pac.direction == "UP" and (pac.y - pac.radius) > 0:&nbsp; &nbsp; &nbsp; &nbsp; pac.y -= pac.speedelif pac.direction == "DOWN" and (pac.y + 2*(pac.radius) + pac.speed) < height:&nbsp; &nbsp; &nbsp; &nbsp; pac.y += pac.speedelif pac.direction == "LEFT" and (pac.x - pac.radius) > 0:&nbsp; &nbsp; &nbsp; &nbsp; pac.x -= pac.speed&nbsp; &nbsp; &nbsp; &nbsp; left = Trueelif pac.direction == "RIGHT" and (pac.x + 2*pac.radius + pac.speed) < width:&nbsp; &nbsp; &nbsp; &nbsp; pac.x += pac.speed&nbsp; &nbsp; &nbsp; &nbsp; right = True然后您只需要pac.direction在获得代码之前在按下某个键时设置为正确的值。我必须承认,我不熟悉 PyGame,所以我将把它留给读者。或者,您可以通过确定表单的方向来将其压缩很多pac.direction = (xSpeed, ySpeed)。然后你的代码压缩到(没有可以在行之前完成的边界检查):pac.x += pac.direction[0]&nbsp; # Could be pac.direction.x if you use an object instead of a tuplepac.y += pac.direction[1]&nbsp; # Same as above with pac.direction.yleft = pac.direction[0] > 0&nbsp; # I'm unsure why you're doing left and right separately, so I'll just put left

慕妹3242003

为什么不使用变量来存储最近的方向while True:&nbsp; &nbsp; if keys[pygame.K_UP] and (pac.y - pac.radius) > 0:&nbsp; &nbsp; &nbsp; &nbsp; recent_direction = 'UP'&nbsp; &nbsp; elif keys[pygame.K_DOWN] and (pac.y + 2*(pac.radius) + pac.speed) < height:&nbsp; &nbsp; &nbsp; &nbsp; recent_direction = 'DOWN'&nbsp; &nbsp; elif keys[pygame.K_LEFT] and (pac.x - pac.radius) > 0:&nbsp; &nbsp; &nbsp; &nbsp; recent_direction = 'LEFT'&nbsp; &nbsp; elif keys[pygame.K_RIGHT] and (pac.x + 2*pac.radius + pac.speed) < width:&nbsp; &nbsp; &nbsp; &nbsp; recent_direction = 'RIGHT'while True:&nbsp; &nbsp; if recent_direction == 'UP':&nbsp; &nbsp; &nbsp; &nbsp; pac.y -= pac.speed&nbsp; &nbsp; elif recent_direction == 'DOWN':&nbsp; &nbsp; &nbsp; &nbsp; pac.y += pac.speed&nbsp; &nbsp; if recent_direction == 'LEFT':&nbsp; &nbsp; &nbsp; &nbsp; pac.x -= pac.speed&nbsp; &nbsp; if recent_direction == 'RIGHT':&nbsp; &nbsp; &nbsp; &nbsp; pac.x += pac.speed希望这对你有用
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python