Игровой цикл в Python не работает - PullRequest
0 голосов
/ 15 мая 2018

Привет, я пытаюсь создать простую среду / игру с черепахой.Это сетка 3х4, верхний правый квадрат которой является конечной целью.когда токен входит в эту цель, я бы хотел, чтобы токен перезапустился.Мой цикл while, похоже, замораживает скрипт.Я считаю, что моя логика здесь неверна.координаты цели (-25,225).Я хотел бы проверить, соответствует ли текущая позиция токена этому, и если да, вернуть true - это логика, которую я хотел бы реализовать.Спасибо за вашу помощь!

import turtle

wn = turtle.Screen()
wn.bgcolor("white")
wn.title("test")

""" Create the Grid """

greg = turtle.Turtle()
greg.speed(0)

def create_square(size,color="black"):
    greg.color(color)
    greg.pd()
    for i in range(4):
        greg.fd(size)
        greg.lt(90)
    greg.pu()
    greg.fd(size)

def row(size,color="black"):
    for i in range(4):
        create_square(size)

def board(size,color="black"):
    greg.pu()
    greg.goto(-(size*4),(size*4))
    for i in range(3):
        row(size)
        greg.bk(size*4)
        greg.rt(90)
        greg.fd(size)
        greg.lt(90)

def color_square(start_pos,distance_sq, sq_width, color):
    greg.pu()
    greg.goto(start_pos)
    greg.fd(distance_sq)
    greg.color(color)
    greg.begin_fill()
    for i in range(4):
        greg.fd(sq_width)
        greg.lt(90)
    greg.end_fill()
    greg.pu()

def initiate_grid(): 
    board(50)
    color_square((-200,200),150, 50,color="green")
    color_square((-200,150),50, 50,color="black")
    color_square((-200,150),150, 50,color="red")
    greg.hideturtle()

initiate_grid()



""" Create the token object """

player = turtle.Turtle()
player.color("blue")
player.shape("circle")
player.penup()
player.speed(0)
player.setposition(-175,125)
player.setheading(90)

""" Player Movement """

playerspeed = 50

#Move the player left and right
def move_left():
    x = player.xcor()
    x -= playerspeed
    if x < -175:
        x = -175
    player.setx(x)

def move_right():
    x = player.xcor()
    x += playerspeed
    if x > -25:
        x = -25
    player.setx(x)

def move_up():
    y = player.ycor()
    y += playerspeed
    if y > 225:
        y = 225
    player.sety(y)

def move_down():
    y = player.ycor()
    y -= playerspeed
    if y < 125:
        y = 125
    player.sety(y)

#Create Keyboard Bindings
turtle.listen()
turtle.onkey(move_left, "Left")
turtle.onkey(move_right, "Right")
turtle.onkey(move_up, "Up")
turtle.onkey(move_down, "Down")



def isGoal(player_pos):
    if player_pos.xcor() == -25 and player_pos.ycor() == 225:
        return True
    else:
        return False

#Main Game loop
while True:

    #check for collision between player and goal
    if isGoal(player):
        #reset player 
        player.setposition(-175,125)



delay = input("Press enter to finish.")

РЕДАКТИРОВАТЬ :

Я попробовал следующий код.Игра больше не зависает, и как только я вхожу в квадрат, жетон появляется внутри квадрата, но здесь возникает вторая проблема.Теперь я вошел в квадрат, который должен вернуть меня в исходное положение (-175, 125).Однако мне нужно нажать любую клавишу во второй раз, чтобы произошел этот сброс, и к этому времени токен сбросился бы и переместился бы на один пробел в зависимости от нажатой клавиши.есть идеи?

def isGoal():
    if player.xcor() == -25 and player.ycor() == 225:
        player.goto(-175,125)
    else:
        pass

    """ Player Movement """

playerspeed = 50

#Move the player left and right
def move_left():
    isGoal()
    x = player.xcor()
    x -= playerspeed
    if x < -175:
        x = -175
    player.setx(x)

def move_right():
    isGoal()
    x = player.xcor()
    x += playerspeed
    if x > -25:
        x = -25
    player.setx(x)

def move_up():
    isGoal()
    y = player.ycor()
    y += playerspeed
    if y > 225:
        y = 225
    player.sety(y)

def move_down():
    isGoal()
    y = player.ycor()
    y -= playerspeed
    if y < 125:
        y = 125
    player.sety(y)

#Create Keyboard Bindings
turtle.listen()
turtle.onkey(move_left, "Left")
turtle.onkey(move_right, "Right")
turtle.onkey(move_up, "Up")
turtle.onkey(move_down, "Down")

delay = input("Press enter to finish.")

1 Ответ

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

Ваш цикл while предотвращает что-либо еще.Здесь вы хотите вставить свои isGoal() проверки в обработчики событий move_<XXX> и запустить собственный основной цикл turtle.

EDIT: для вашего второго вопроса:

ОднакоМне нужно нажать любую клавишу второй раз, чтобы произошел этот сброс

причина довольно проста: вы должны позвонить isGoal() после , когда вы двигаете черепаху игрока,не раньше:

def move_left():
    x = player.xcor()
    x -= playerspeed
    if x < -175:
        x = -175
    player.setx(x)
    isGoal()
...