为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

翻翻过去那场雪 2021-12-16 15:06:50
所以,我想用 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 会自己朝那个方向移动,而无需按住键。实际上发生的事情是我最终不得不按住键,这样吃豆人就会朝着想要的方向移动。
查看完整描述

3 回答

?
鸿蒙传说

TA贡献1865条经验 获得超7个赞

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


查看完整回答
反对 回复 2021-12-16
?
慕侠2389804

TA贡献1719条经验 获得超6个赞

我建议在你的 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



查看完整回答
反对 回复 2021-12-16
?
慕妹3242003

TA贡献1824条经验 获得超6个赞

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


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

希望这对你有用


查看完整回答
反对 回复 2021-12-16
  • 3 回答
  • 0 关注
  • 255 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号