0

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

1 Answer 1

1

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()
Sign up to request clarification or add additional context in comments.

2 Comments

thank you for your response. Slight problem I have tweaked the isGoal() function a bit: def isGoal(): if player.xcor() > -50 and player.ycor() == 225: player.setposition(-175,125) elif player.xcor() == -25 and player.ycor() > 200: player.setposition(-175,125) else: pass I have also added isGoal() at the beginning of event handlers. still causing me some issues.
@HimansuOdedra please don't post code in comments, it's unreadable. Edit your post adding the updated code instead (NB leave the original question and code, just add to the question), or post a new question. Also, "still causing me some issues" is a totally useless description of your (new) problem, you have to explain (here again editing your post or asking a new question) exactly what goes wrong.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.