Python Onkey не останавливая петлю - PullRequest
0 голосов
/ 13 февраля 2020
def startgame():
    start.state = False
    print start.state


def restart():
    end.state = False
    start.state = True
    print game.state, end.state


s.listen()

s.onkey(startgame, "Return")

s.onkey(restart, 'r')

# This Loop stops when you hit Enter

while start.state:
    start.enter()
s.reset()

# I tried repeating it here but it doesn't work
while end.state:
    end.enter()
s.reset()
game.state = 'playing'

Оба цикла вложены в основную, в то время как l oop, а вторая - в другую, в то время как l oop (если это помогает), поэтому это будет выглядеть примерно так

while True:
    while start.state:
        start.flash()
    s.reset()
    while True:

        # main game code here

        while end.state:
            end.flash()
        s.reset()
        game.state = 'playing'
        break

Я просто хочу, чтобы он показывал конечный экран и имел на экране надпись «Нажмите r для повторного воспроизведения», пока sh игрок не нажмет кнопку r, а затем он должен перезапустить игру и go вернуться на начальный экран. Переменная end.state не будет обновляться в течение времени, пока l oop, а start.state обновляется в течение времени, пока l oop.

1 Ответ

0 голосов
/ 13 февраля 2020

Ваши вытянутые (по времени) петли while не имеют места в управляемой событиями среде, такой как черепаха. В общем, нам нужно контролировать все событиями, в частности событиями таймера . Давайте перепишем ваш код как конечный автомат. (Поскольку у меня нет ваших классов объектов, сущности, такие как start.state, становятся глобальными, как start_state в моем примере кода.)

from turtle import Screen, Turtle

start_state = True
end_state = False

def start_game():
    global start_state

    start_state = False

def end_game():
    global end_state

    if not start_state:
        end_state = True

def restart_game():
    global end_state, start_state

    end_state = False
    start_state = True

def flash(text):
    turtle.clear()
    turtle.write(text, align="center", font=('Arial', 24, 'bold'))

    color = turtle.pencolor()
    turtle.pencolor(turtle.fillcolor())
    turtle.fillcolor(color)

def game_states():

    if start_state:
        flash("Start")
    elif end_state:
        flash("End")
    else:
        flash("Playing")

    screen.ontimer(game_states, 500)

screen = Screen()

turtle = Turtle()
turtle.hideturtle()
turtle.fillcolor(screen.bgcolor())

screen.onkey(start_game, 'Return')
screen.onkey(restart_game, 'r')
screen.onkey(end_game, 'e')
screen.listen()

game_states()

screen.mainloop()

Правила конечного автомата:

Start via <Return> -> Playing
Playing via <e> -> End and via <r> -> Start
End via <r> -> Start
...