首页 > 解决方案 > Python海龟赛跑:去一个点然后转身

问题描述

嗨,我还有一个问题:你如何让乌龟走到一个点然后转身?我希望海龟到达 x 坐标 160 的点并返回,同时继续比赛(这意味着它们不会以相同的速度移动)。

这是我的代码:

import turtle
from random import randint

turtle.speed(0)

turtle.penup()
turtle.goto(-140,140)

for step in range(15):
  turtle.write(step,align='center')
  turtle.right(90)
  turtle.forward(10)
  turtle.pendown()
  turtle.forward(180)
  turtle.penup()
  turtle.backward(190)
  turtle.left(90)
  turtle.forward(20)

roy = turtle.Turtle()
roy.color('red')
roy.shape('turtle')

roy.penup()
roy.goto(-160,100)
roy.pendown()

bob = turtle.Turtle()
bob.color('blue')
bob.shape('turtle')

bob.penup()
bob.goto(-160,70)
bob.pendown()

oreo = turtle.Turtle()
oreo.color('orange')
oreo.shape('turtle')

oreo.penup()
oreo.goto(-160,40)
oreo.pendown()

yay = turtle.Turtle()
yay.color('yellow')
yay.shape('turtle')

yay.penup()
yay.goto(-160,10)
yay.pendown()

go = turtle.Turtle()
go.color('green')
go.shape('turtle')

go.penup()
go.goto(-160,-20)
go.pendown()

for turn in range(100):
  roy.forward(randint(1,5))
  bob.forward(randint(1,5))
  oreo.forward(randint(1,5))
  yay.forward(randint(1,5))
  go.forward(randint(1,5))

  if roy.xcor() >= 160:
    roy.left(180)
  else:
    break
  if bob.xcor() >= 160:
    bob.left(180)
  else:
    break
  if yay.xcor() >= 160:
    yay.left(180)
  else:
    break
  if oreo.xcor() >= 160:
    oreo.left(180)
  else:
    break
  if go.xcor() >= 160:
    go.left(180)
  else:
    break

我知道最后我的“if”循环有问题,但我不知道发生了什么。

顺便说一句,我的乌龟变成了这样

帮助表示赞赏!

标签: pythonpython-turtle

解决方案


else break是个问题,当第一只乌龟试图转身时,它就结束了比赛。此外,left(180)如果海龟稍微超过转折点,因为它将开始旋转,这可能会产生问题。使用setheading(180)更安全,因为它会避免旋转并将海龟送回起跑线:

from turtle import Screen, Turtle
from random import randint, choice

screen = Screen()

turtle = Turtle()
turtle.hideturtle()
turtle.speed('fastest')
turtle.penup()
turtle.goto(-140, 140)

for step in range(15):
    turtle.write(step, align='center')
    turtle.right(90)
    turtle.forward(10)
    turtle.pendown()
    turtle.forward(180)
    turtle.penup()
    turtle.backward(190)
    turtle.left(90)
    turtle.forward(20)

roy = Turtle()
roy.color('red')
roy.shape('turtle')

roy.penup()
roy.goto(-160, 100)
roy.pendown()

bob = Turtle()
bob.color('blue')
bob.shape('turtle')

bob.penup()
bob.goto(-160, 70)
bob.pendown()

oreo = Turtle()
oreo.color('orange')
oreo.shape('turtle')

oreo.penup()
oreo.goto(-160, 40)
oreo.pendown()

yay = Turtle()
yay.color('yellow')
yay.shape('turtle')

yay.penup()
yay.goto(-160, 10)
yay.pendown()

go = Turtle()
go.color('green')
go.shape('turtle')

go.penup()
go.goto(-160, -20)
go.pendown()

while True:
    racer = choice([roy, bob, oreo, yay, go])
    racer.forward(randint(1, 5))

    if racer.xcor() > 160:
        racer.setheading(180)
    elif racer.xcor() < -160:
        break  # we have a winner!

screen.mainloop()

在此处输入图像描述

while True:并不真正属于像turtle这样的事件驱动环境,可以用ontimer()事件替换。但是,一步一个脚印。


推荐阅读