Ввод с клавиатуры и оценка.Питон черепаха - PullRequest
0 голосов
/ 26 мая 2018

Я нашел проект "игра с ошибками" и модифицирую его по своему вкусу.

Я хотел бы знать, как я могу управлять определением «касание» с помощью клавиатуры, а не мыши (я пробовал онлайн-код «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()

Я перепробовал все виды функцийи никто не работал.

1 Ответ

0 голосов
/ 28 мая 2018

Я хотел бы знать, как я могу управлять определением «касание» с помощью клавиатуры, а не с помощью мыши

Это должно быть так же просто, как заменить:

onscreenclick(tap)

с

onkey(tap, "Up")
listen()

и сбросом аргументов x и y в tap().Я переработал ваш код ниже, чтобы внести это изменение и устранить:

from freegames import vector

и заставить его работать только с тем, что доступно в turtle.Я также изменил логику сохранения векторов и размещения по умолчанию точек на черепахах, чтобы вместо них сделать шары и птицу всеми черепахами и просто перемещать их по мере необходимости.Так как черепахи не собирают мусор нормально, я держу список шаров, которые ушли за пределы экрана для повторного использования:

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()

Чтобы сделать окно черепахи слушателем клавиатуры, вам нужно прикоснуться к нему мышью, чтобы сделать его активным, прежде чем нажимать клавишу со стрелкой вверх.

Перед добавлением текущей оценки в окно, вам необходимо определить, какая из них оценивается.(Это номер мяча, который успешно уклонен?) Здесь я бы использовал дополнительную невидимую черепаху, расположенную в фиксированном положении, которая просто делает undo() и write() для обновления экрана.

...