Himansu Odedra
Himansu Odedra

Reputation: 81

Game loop in turtle python not functioning

Hi i am trying to create a simple environment/ game with turtle. It is a 3x4 grid with the upper right most square being the end goal. as the token enters this goal I would like the token to reset to the start. My while loop however seems to be freezing the script. I believe my logic here is wrong. the coordinates of the goal is (-25,225). I would like to check if the token's current position matches this and if so return true - this is the logic i would like to implement. Thanks for your help!

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.")

EDIT :

I have now tried the following code. Game doesn't freeze anymore and once i enter the square the token appears inside the square but this is where the second problem occurs. I have now entered the square which should reset me back to my original position (-175, 125). However I need to press any key a second time in order for that reset to happen and by this time the token would have reset and moved one space based on the key I pressed. any ideas?

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.")

Upvotes: 0

Views: 1067

Answers (1)

bruno desthuilliers
bruno desthuilliers

Reputation: 77952

Your while loop prevents anything else to happen indeed. What you want here is to put your isGoal() checks in the move_<XXX> event handlers and let turtle's own main loop run.

EDIT: for your second question:

However I need to press any key a second time in order for that reset to happen

the reason is quite simple: you should call isGoal() after you move the player's turtle, not before:

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

Upvotes: 1

Related Questions