Python 吃豆人-按下并松开一个键后,让吃豆人朝一个方向移动

Python 吃豆人-按下并松开一个键后,让吃豆人朝一个方向移动,python,pygame,pacman,Python,Pygame,Pacman,所以,我想用python3和pygame模块来编写pac-man。然而,我不知道如何保持吃豆人移动一旦一个单一的键被按下。例如,目标是按下“向上”键,吃豆人将继续朝该方向移动,直到到达边界,即使我松开该键。到目前为止,我还没有对这些边界进行编码,因为我正在优先考虑吃豆人的连续移动。我试图嵌套一个while循环,这个循环本应该有效,但这显然给了我一个phat运行时错误。有什么办法可以做到这一点吗 if keys[pygame.K_UP] and (pac.y - pac.radius) >

所以,我想用python3和pygame模块来编写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
如果键[pygame.K_UP]和(pac.y-pac.radius)>0:
pac.y-=pac.speed
pac.direction=“向上”
elif键[pygame.K_DOWN]和(pac.y+2*(pac.radius)+pac.speed)<高度:
pac.y+=pac.speed
pac.direction=“向下”
elif键[pygame.K_左]和(pac.x-pac.radius)>0:
pac.x-=pac.speed
pac.direction=“左”
左=真
elif键[pygame.K_RIGHT]和(pac.x+2*pac.radius+pac.speed)<宽度:
pac.x+=pac.speed
pac.direction=“右”
右=真

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

当按下按键时直接移动你的吃豆人对你的程序不起作用。你应该在这里设置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
def update():
pac.y+=pac.y速度
pac.x+=pac.xspeed
尽管如此:
时钟滴答(60)
如果键[pygame.K_UP]和(pac.y-pac.radius)>0:
pac.yspeed=1
elif键[pygame.K_DOWN]和(pac.y+2*(pac.radius)+pac.speed)<高度:
pac.yspeed=-1
elif键[pygame.K_左]和(pac.x-pac.radius)>0:
pac.xspeed=-1
左=真
elif键[pygame.K_RIGHT]和(pac.x+2*pac.radius+pac.speed)<宽度:
pac.xspeed=1
右=真
如果键[pygame.K_ESC]:
打破
更新()
#做你所有的其他事情

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

if(键[pygame.K_UP]或pac.direction==“UP”)和(pac.y-pac.radius)>0:

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


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

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

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

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
为True时:
如果键[pygame.K_UP]和(pac.y-pac.radius)>0:
最近的方向=‘向上’
elif键[pygame.K_DOWN]和(pac.y+2*(pac.radius)+pac.speed)<高度:
最近_方向=‘向下’
elif键[pygame.K_左]和(pac.x-pac.radius)>0:
最近的方向='左'
elif键[pygame.K_RIGHT]和(pac.x+2*pac.radius+pac.speed)<宽度:
最近的方向='右'
尽管如此:
如果最近的_方向==“向上”:
pac.y-=pac.speed
elif最近的方向==‘向下’:
pac.y+=pac.speed
如果最近的_方向==‘左’:
pac.x-=pac.speed
如果最近的_方向=='右':
pac.x+=pac.speed

希望这对您有用

您能在if语句周围添加一些代码吗?您当前正在移动pacman(例如,
pac.x+=pac.speed
),只有在按下一个键时(例如,
elif键[pygame.K_RIGHT]…
)。你应该在按键时存储方向信息,并将移动代码放置在定期执行的位置(例如,使用计时器)。准确地说。但是既然你已经走了这么远,如果它显示了如何在每个时间步调用
update
,那么答案将是完整的。这非常有效,我不得不做一些小的调整,以确保pac man一次只在x方向或y方向移动,所以我使用了一些if语句。但这绝对是完美的,谢谢
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