Python 键盘输入和记分。蟒蛇龟

Python 键盘输入和记分。蟒蛇龟,python,turtle-graphics,Python,Turtle Graphics,我发现了一个“flappy游戏”项目,我正在根据自己的喜好修改它 我想知道我如何用键盘而不是鼠标来控制“点击”的定义(我尝试了在线代码“onkey”,但它不起作用),我想知道我是否可以添加分数 接下来,我附上我目前拥有的代码,我希望得到一些反馈 from random import * from turtle import * from freegames import vector bird = vector(0, 0) balls = [] def tap(x, y): "Mov

我发现了一个“flappy游戏”项目,我正在根据自己的喜好修改它

我想知道我如何用键盘而不是鼠标来控制“点击”的定义(我尝试了在线代码“onkey”,但它不起作用),我想知道我是否可以添加分数

接下来,我附上我目前拥有的代码,我希望得到一些反馈

from random import *
from turtle import *
from freegames import vector

bird = vector(0, 0)
balls = []

def tap(x, y):
    "Move bird up in response to screen tap."
    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')

    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)

    if not inside(bird):
        draw(False)
        return

    for ball in balls:
        if abs(ball - bird) < 15:
            draw(False)
            return

    draw(True)
    ontimer(move, 50)

setup(420, 420, 370, 0)
hideturtle()
up()
tracer(False)
onscreenclick(tap)
move()
done()
来自随机导入的
*
从海龟进口*
从freegames导入向量
鸟=向量(0,0)
球=[]
def分接头(x,y):
“根据屏幕点击将鸟向上移动。”
向上=向量(0,30)
小鸟,上移
def内部(点):
“如果屏幕上出现点,则返回True。”
返回-200<点x<200和-200<点y<200
def抽取(活动):
“绘制屏幕对象。”
清除()
转到(bird.x,bird.y)
如果活着:
点(10,‘绿色’)
其他:
点(10,‘红色’)
对于球中球:
转到(ball.x,ball.y)
圆点(20,‘黑色’)
更新()
def move():
“更新对象位置。”
鸟.y-=5
对于球中球:
球.x-=3
如果randrange(10)=0:
y=随机范围(-199199,199)
球=向量(199,y)
balls.append(ball)
而len(balls)>0且不在内部(balls[0]):
波普(0)
如果不在内部(鸟):
抽签(假)
返回
对于球中球:
如果abs(球-鸟)<15:
抽签(假)
返回
绘制(真)
ontimer(移动,50)
设置(420、420、370、0)
希德图尔()
up()
跟踪器(假)
屏幕上单击(轻触)
移动()
完成()
我尝试过各种各样的函数,但都没有成功

我想知道如何使用 键盘,而不是鼠标

这应该简单到更换:

onscreenclick(tap)

并将
x
y
参数拖放到
tap()
。我已在下面修改了您的代码,以进行此更改并消除:

from freegames import vector
并让它运行什么是海龟可用的。我还改变了保留向量的逻辑,让默认的海龟在它们的位置上画点,改为让球和鸟都是海龟,然后根据需要移动它们。因为海龟通常不会被垃圾收集,所以我保留了一份清单,上面列出了一些已经离开屏幕的球,以便再次使用:

from random import randrange
from turtle import Turtle, Screen

BIRD_RADIUS = 10
BALL_RADIUS = 20
CURSOR_SIZE = 20

WINDOW_WIDTH, WINDOW_HEIGHT = 420, 420
GALLERY_WIDTH, GALLERY_HEIGHT = WINDOW_WIDTH - BALL_RADIUS, WINDOW_HEIGHT - BIRD_RADIUS

def click():
    "Move bird up in response to screen key click."

    bird.forward(min(BIRD_RADIUS * 3, WINDOW_HEIGHT/2 - bird.ycor()))  # flying higher

def is_ball_inside(turtle):
    "Return True if point on screen."

    x = turtle.xcor()

    return -GALLERY_WIDTH/2 < x

def is_bird_inside(turtle):
    "Return True if point on screen."

    y = turtle.ycor()

    return -GALLERY_HEIGHT/2 < y < GALLERY_HEIGHT/2

def draw(is_alive):
    "Draw screen objects."

    if not is_alive:
        bird.color('red')

    screen.update()

def move():
    "Update object positions."

    if not is_bird_inside(bird):
        draw(False)  # flew or fell out of gallery
        return

    bird.backward(BIRD_RADIUS/2)  # falling to earth

    for ball in balls:
        ball.forward(3)

    for ball in balls:
        if ball.distance(bird) < (BIRD_RADIUS + BALL_RADIUS) / 2:
            draw(False)
            return

    while balls and not is_ball_inside(balls[0]):
        ball = balls.pop(0)
        ball.hideturtle()

        spare_balls.append(ball)  # reduce, reuse, recycle

    if randrange(10) == 0:
        ball = spare_balls.pop() if spare_balls else Turtle("circle", visible=False)
        ball.shapesize(BALL_RADIUS / CURSOR_SIZE)
        ball.setheading(180)
        ball.penup()
        ball.goto(GALLERY_WIDTH/2, randrange(BALL_RADIUS - GALLERY_HEIGHT/2, GALLERY_HEIGHT/2 - BALL_RADIUS))
        ball.showturtle()

        balls.append(ball)

    draw(True)

    screen.ontimer(move, 50)

screen = Screen()
screen.setup(WINDOW_WIDTH, WINDOW_HEIGHT + 10)  # little bit added for title bar

bird = Turtle("circle", visible=False)
bird.shapesize(BIRD_RADIUS / CURSOR_SIZE)
bird.color("green")
bird.setheading(90)
bird.penup()
bird.showturtle()

balls = []
spare_balls = []

screen.tracer(False)

screen.onkey(click, "Up")
screen.listen()

move()

screen.mainloop()
来自随机导入范围
从海龟进口海龟,屏幕
鸟_半径=10
球头半径=20
光标大小=20
窗宽、窗高=420420
廊道宽度,廊道高度=窗宽-球半径,窗高-鸟半径
def click():
“向上移动小鸟以响应屏幕键的单击。”
小鸟向前(最小(小鸟半径*3,窗口高度/2-bird.ycor())#飞得更高
def在球内(海龟):
“如果屏幕上出现点,则返回True。”
x=turtle.xcor()
返回-通道宽度/2
要使turtle窗口成为键盘侦听器,您需要在按下向上箭头键之前用鼠标触摸它,使其处于活动状态

在将当前分数添加到窗口之前,您需要定义一个人的分数。(这是成功闪避的球数吗?)在这里,我将使用一个额外的、不可见的乌龟,它固定在一个位置,只执行
undo()
write()
来更新scrore

from random import randrange
from turtle import Turtle, Screen

BIRD_RADIUS = 10
BALL_RADIUS = 20
CURSOR_SIZE = 20

WINDOW_WIDTH, WINDOW_HEIGHT = 420, 420
GALLERY_WIDTH, GALLERY_HEIGHT = WINDOW_WIDTH - BALL_RADIUS, WINDOW_HEIGHT - BIRD_RADIUS

def click():
    "Move bird up in response to screen key click."

    bird.forward(min(BIRD_RADIUS * 3, WINDOW_HEIGHT/2 - bird.ycor()))  # flying higher

def is_ball_inside(turtle):
    "Return True if point on screen."

    x = turtle.xcor()

    return -GALLERY_WIDTH/2 < x

def is_bird_inside(turtle):
    "Return True if point on screen."

    y = turtle.ycor()

    return -GALLERY_HEIGHT/2 < y < GALLERY_HEIGHT/2

def draw(is_alive):
    "Draw screen objects."

    if not is_alive:
        bird.color('red')

    screen.update()

def move():
    "Update object positions."

    if not is_bird_inside(bird):
        draw(False)  # flew or fell out of gallery
        return

    bird.backward(BIRD_RADIUS/2)  # falling to earth

    for ball in balls:
        ball.forward(3)

    for ball in balls:
        if ball.distance(bird) < (BIRD_RADIUS + BALL_RADIUS) / 2:
            draw(False)
            return

    while balls and not is_ball_inside(balls[0]):
        ball = balls.pop(0)
        ball.hideturtle()

        spare_balls.append(ball)  # reduce, reuse, recycle

    if randrange(10) == 0:
        ball = spare_balls.pop() if spare_balls else Turtle("circle", visible=False)
        ball.shapesize(BALL_RADIUS / CURSOR_SIZE)
        ball.setheading(180)
        ball.penup()
        ball.goto(GALLERY_WIDTH/2, randrange(BALL_RADIUS - GALLERY_HEIGHT/2, GALLERY_HEIGHT/2 - BALL_RADIUS))
        ball.showturtle()

        balls.append(ball)

    draw(True)

    screen.ontimer(move, 50)

screen = Screen()
screen.setup(WINDOW_WIDTH, WINDOW_HEIGHT + 10)  # little bit added for title bar

bird = Turtle("circle", visible=False)
bird.shapesize(BIRD_RADIUS / CURSOR_SIZE)
bird.color("green")
bird.setheading(90)
bird.penup()
bird.showturtle()

balls = []
spare_balls = []

screen.tracer(False)

screen.onkey(click, "Up")
screen.listen()

move()

screen.mainloop()