You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用键盘控制Python Turtle版Flappy Bird的tap函数并添加计分功能

解决你的Flappy Bird键盘控制和计分问题

我看了你的代码,刚好能帮你搞定这两个问题,咱们一步步来拆解:

一、把鼠标点击改成键盘控制

你之前用onkey没生效,核心原因是没调用turtle.listen()——这个函数是让turtle库开始监听键盘事件的,缺了它所有键盘绑定都不会起作用。另外,原来的tap函数接收x,y参数,但键盘事件的回调不需要这些参数,咱们调整一下就行:

  1. 修改tap函数,去掉不必要的参数:
def tap():
    "Move bird up in response to key press."
    up = vector(0, 30)
    bird.move(up)
  1. 替换原来的鼠标点击绑定,换成键盘事件并开启监听:
# 绑定空格键(你也可以换成'Up'方向键)
onkey(tap, 'space')
# 必须调用listen()才能激活键盘监听
listen()

现在按空格键就能让小鸟往上飞了~

二、添加计分功能

咱们可以加一个全局计分变量,每次小鸟成功通过一个管道(也就是黑色小球从屏幕左侧移出)时加分,然后在画面上实时显示分数:

  1. 先定义计分变量,放在bird和balls的定义下面:
bird = vector(0, 0)
balls = []
score = 0  # 新增计分变量
  1. 修改move函数,在移除左侧小球时触发加分:
while len(balls) > 0 and not inside(balls[0]):
    balls.pop(0)
    score += 1  # 每通过一个管道,分数+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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:01:16