python - 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”循环有问题,但我不知道发生了什么。
顺便说一句,我的乌龟变成了这样
帮助表示赞赏!
解决方案
你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()
事件替换。但是,一步一个脚印。
推荐阅读
- reactjs - React Hook - 从类转换为钩子 - 三元运算符
- excel - 使用 ExportAsFixedFormat 时键入 5 错误
- c++ - 将浮点 32 位 Mat 转换为 8 位无符号 Mat 时 cv::normalize 和 Mat.convertTo 之间的区别
- reactjs - React 在 componentDidMount 中对异步请求做了什么?
- flutter - 当我使用 Flutter 驱动程序运行测试时,资产未加载
- android - 恢复带有 webview 的片段时,ViewPager 崩溃
- javascript - 为什么我会收到 SyntaxError: Unexpected end of input?
- julia - 在朱莉娅的脚本中使用情节
- dependency-injection - flutter generate 没有为测试目录注释类
- plot - 如何在xarray中绘制不规则的经纬度?