简体   繁体   中英

How do you make a turtle stop at certain coordinates in a turtle race?

I'm creating a turtle race and I want to make a turtle stop when it hits the finish line. 在此处输入图片说明

The circled portion is the finish line and is at the x coordinate 220. This is my code so far:

import turtle as trtl

#add the background
wn = trtl.Screen()
wn.setup(width = 1.0 , height = 1.0)
wn.bgpic("image.png")

# Make the turtle racers
BlueTurtle = trtl.Turtle()
BlueTurtle.shape("turtle")
BlueTurtle.color("blue")
BlueTurtle.speed(4)
BlueTurtle.penup()
BlueTurtle.goto(-220,-0)
BlueTurtle.pendown()

RedTurtle = trtl.Turtle()
RedTurtle.color("red")
RedTurtle.speed(4)
RedTurtle.shape("turtle")
RedTurtle.penup()
RedTurtle.goto(-220,-75)
RedTurtle.pendown()

# Game configuration variables
def move_blue():
    BlueTurtle.forward(10)

def move_red():
    RedTurtle.forward(10)

# Create numbers and the title
pen = trtl.Turtle()
pen.pensize(10)
pen.speed(10)
pen.speed(20)
pen.penup()
pen.goto(-100, 70)
pen.pendown()
pen.write("Turtle Race", font=("Times New Roman", 40, "normal"))
numbers = ["1","2"]
coordinates = -200,50
for i in range(2):
  pen.penup()
  pen.goto(coordinates)
  pen.pendown()
  pen.write(numbers[i])
  coordinates = (coordinates[0], coordinates[1] + -100)

# Make the lines that divide the racers and the finish line
pen.penup()
pen.goto(-180, -40)
pen.pendown()
pen.forward(400)
pen.penup()
pen.goto(-180, 40)
pen.pendown()
pen.forward(400)
pen.penup()
pen.goto(-180, -110)
pen.pendown()
pen.forward(400)
pen.pensize(0)
pen.penup()
pen.goto(230, 60)
pen.pendown()
pen.right(90)
pen.forward(175)
pen.hideturtle()

# Personalizes it so that the player can move their turtle with any key they like
key1 = input("Type a letter to use to move your turtle - Blue Turtle")
key2 = input("Type a letter to use to move your turtle - Red Turtle")

# Listen for events
wn = trtl.Screen()
wn.onkeypress(move_blue, key1)
wn.onkeypress(move_red, key2)
wn.listen()

# The function for the game to stop if one of the turtles touches the finish line
keepPlaying = True
while keepPlaying:
    if BlueTurtle.pos() == (220, 0):
        pen.penup()
        pen.goto(-220, -220)
        pen.pendown()
        pen.write("The Blue Turtle hit the finish line - the blue turtle wins!" , font = 
("Arial", 20, "normal"))
        keepPlaying = False
    if RedTurtle.pos() == (220, 0):
        pen.penup()
        pen.goto(-220, -220)
        pen.pendown()
        pen.write("The Red Turtle hit the finsh line = the red turtle wins!" , font =("Arial", 
20, "normal"))
        keepPlaying = False
wn.mainloop()

The last area that says "The function for the game to stop if one of the turtles touches the finish line." is what I have tried so far. it doesn't show any errors in the terminal but when it is executed, it always seems to say "vs code is not responding" when it works fine without that section.

Red starts at (-220,-75) so if RedTurtle.pos() == (220, 0): will never be true. However, besides that, you are mixing event drive programming and game-loop programming.

At

wn.onkeypress(move_blue, key1)
wn.onkeypress(move_red, key2)
wn.listen()

You set up 2 events and tell the app to start listening for those events. When one happens, the corresponding function will be called.

But here:

keepPlaying = True
while keepPlaying:
   ...

You have a busy loop that constantly checks the positions of the turtles. But this blocks the last line wn.mainloop() from being reached.

You can change that loop to a function that checks if the turtles are at the finish line. Use a global variable to mark when the game is over:

game_over = False
def move_blue():
    if not game_over:
        BlueTurtle.forward(10)
        check_for_win()

def move_red():
    if not game_over:
        RedTurtle.forward(10)
        check_for_win()

And then later, change the loop to a function

def check_for_win():
    global game_over
    if BlueTurtle.pos() == (220, 0):
        pen.penup()
        pen.goto(-220, -220)
        pen.pendown()
        pen.write("The Blue Turtle hit the finish line - the blue turtle wins!" , font = 
("Arial", 20, "normal"))
        game_over = True
    if RedTurtle.pos() == (220, -75):
        pen.penup()
        pen.goto(-220, -220)
        pen.pendown()
        pen.write("The Red Turtle hit the finsh line = the red turtle wins!" , font =("Arial", 
20, "normal"))
        game_over = True

There are other improvements to be made, but I think this is the core of your issue.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM