如何用键盘控制Python Turtle版Flappy Bird的tap函数并添加计分功能
解决你的Flappy Bird键盘控制和计分问题
我看了你的代码,刚好能帮你搞定这两个问题,咱们一步步来拆解:
一、把鼠标点击改成键盘控制
你之前用onkey没生效,核心原因是没调用turtle.listen()——这个函数是让turtle库开始监听键盘事件的,缺了它所有键盘绑定都不会起作用。另外,原来的tap函数接收x,y参数,但键盘事件的回调不需要这些参数,咱们调整一下就行:
- 修改
tap函数,去掉不必要的参数:
def tap(): "Move bird up in response to key press." up = vector(0, 30) bird.move(up)
- 替换原来的鼠标点击绑定,换成键盘事件并开启监听:
# 绑定空格键(你也可以换成'Up'方向键) onkey(tap, 'space') # 必须调用listen()才能激活键盘监听 listen()
现在按空格键就能让小鸟往上飞了~
二、添加计分功能
咱们可以加一个全局计分变量,每次小鸟成功通过一个管道(也就是黑色小球从屏幕左侧移出)时加分,然后在画面上实时显示分数:
- 先定义计分变量,放在
bird和balls的定义下面:
bird = vector(0, 0) balls = [] score = 0 # 新增计分变量
- 修改
move函数,在移除左侧小球时触发加分:
while len(balls) > 0 and not inside(balls[0]): balls.pop(0) score += 1 # 每通过一个管道,分数+1
- 在
draw函数里添加分数显示的逻辑,比如放在屏幕左上角:
draw(True) # 显示当前分数 goto(-180, 180) write(f"Score: {score}", font=('Arial', 16, 'normal'))
完整修改后的代码
把上面的改动整合起来,最终代码如下:
from random import * from turtle import * from freegames import vector bird = vector(0, 0) balls = [] score = 0 # 新增计分变量 def tap(): "Move bird up in response to key press." up = vector(0, 30) bird.move(up) def inside(point): "Return True if point on screen." return -200 < point.x < 200 and -200 < point.y < 200 def draw(alive): "Draw screen objects." clear() goto(bird.x, bird.y) if alive: dot(10, 'green') else: dot(10, 'red') # 显示当前分数 goto(-180, 180) write(f"Score: {score}", font=('Arial', 16, 'normal')) for ball in balls: goto(ball.x, ball.y) dot(20, 'black') update() def move(): "Update object positions." bird.y -= 5 for ball in balls: ball.x -= 3 if randrange(10) == 0: y = randrange(-199, 199) ball = vector(199, y) balls.append(ball) while len(balls) > 0 and not inside(balls[0]): balls.pop(0) score += 1 # 通过管道后加分 if not inside(bird): draw(False) # 游戏结束时显示最终分数 goto(0, 0) write(f"Game Over! Final Score: {score}", align='center', font=('Arial', 20, 'bold')) return for ball in balls: if abs(ball - bird) < 15: draw(False) # 碰撞后显示最终分数 goto(0, 0) write(f"Game Over! Final Score: {score}", align='center', font=('Arial', 20, 'bold')) return draw(True) ontimer(move, 50) setup(420, 420, 370, 0) hideturtle() up() tracer(False) # 替换鼠标点击为键盘控制 onkey(tap, 'space') listen() move() done()
补充小细节
- 如果你想用方向键控制,只需要把
onkey(tap, 'space')换成onkey(tap, 'Up')就行。 - 目前的计分逻辑是通过一个小球加1分,如果你想改成类似原版Flappy Bird的成对管道计分,可以调整生成小球的逻辑,让它们成对出现,然后每通过一对加2分。
内容的提问来源于stack exchange,提问作者Dani Dobber
相关产品推荐
相关产品推荐

