[英]Turtle racing game - unable to keep turtle on square
我和我的朋友目前正在学校里编写一项练习,我们在如何使海龟步入正轨方面遇到了困难。 为了说明这一点,在正方形的第一侧,有2只海龟在两侧竞速。 但是,当它们旋转90度时,它们中的1或2个会从侧面掉下来,这对运动要求而言是不正确的。
这是我们的代码:
import turtle
from random import randint
def read_int(prompt,first,last):
x = int(input(prompt))
while x < first or x > last:
print("Not in range. Try Again!!!")
x= int(input(prompt))
return x
square_count = read_int("Enter your laps between 1 and 10: ",1,10)
print(square_count)
#def t():
window = turtle.Screen()
window.bgcolor('lightblue')
def draw_square(turtle, center, size):
xPt, yPt = center
xPt -= size / 2
yPt += size / 2
side = 4
size = 300
angle = 90
turtle.speed(0)
turtle.up()
turtle.goto(xPt, yPt)
turtle.down()
for i in range(side):
turtle.forward(size)
turtle.right(angle)
t = turtle.Turtle()
draw_square(t,(0,0),300)
t.shape('turtle')
t.color("red")
t.pensize(5)
t.up()
t.goto(-150, 150)
#def r():
r = turtle.Turtle()
draw_square(r,(0,0),300)
r.shape('turtle')
r.color("yellow")
r.up()
r.pensize(5)
r.goto(-150, 150)
sides = 4
size = 300
count_int = int(square_count)* sides
if count_int > 1:
for sides in range(count_int):
i = 0
e = 0
while i in range(0, size) or e in range(0, size):
t_step = randint(1, 5)
t.forward(t_step)
i = i + t_step
r_step = randint(1, 5)
r.forward(r_step)
e = e + r_step
t.right(90)
r.right(90)
window.exitonclick()
您的错误在于程序的结尾。
while i in range(0, size) or e in range(0, size):
t_step = randint(1, 5)
t.forward(t_step)
i = i + t_step
r_step = randint(1, 5)
r.forward(r_step)
e = e + r_step
在让我说i = 298且t_step选择一个随机整数3的情况下,乌龟最终移动的范围大于300,从而移动到绘制的框之外。 循环不会停止,因为仅在运行所有代码后才意识到我超出了范围。 (即,到循环断开时,乌龟已经移出盒子了。)这就是为什么乌龟会移到外面的原因。 您可以尝试使用“如果”条件来防止这种情况。
您有两种问题。
首先,您应该注意乌龟走了多少步。 因为如果正方形的大小为300,则乌龟可能会执行一定数量的步,其总和不等于300。我建议您将随机步的生成更改为:
steps = random.randrange(0, 4, 2)
这样,乌龟只能走0或2步,并且您确定总和会将您带到300。
第二点也许更重要。 如果按照您的方式构造竞赛循环 ,则只有当另一只乌龟到达一行的末尾时,一只乌龟才会转动,您应该重新组织代码以使两只乌龟彼此独立。
我会采取一种略有不同的方法-而不是对两只乌龟进行硬编码,而是设计任意数量的乌龟,然后只对两只乌龟进行比赛。 这是基于许多乌龟的重写,包括对样式代码的一些重做,以及@Claudio的一些代码建议:
from random import randint
from turtle import Turtle, Screen
from collections import defaultdict
SIZE = 300
SIDES = 4
ANGLE = 90
MAXIMUM_STRIDE = 5
COLORS = ('red', 'gold', 'green', 'orange', 'blue')
MAX_RACERS = len(COLORS)
def read_int(prompt, first, last):
x = int(input(prompt))
while not first <= x <= last:
print('Not in range! Try Again.')
x = int(input(prompt))
return x
def draw_square(turtle, center, size):
xPt, yPt = center
xPt -= size / 2
yPt += size / 2
turtle.up()
turtle.goto(xPt, yPt)
turtle.down()
for _ in range(SIDES):
turtle.forward(SIZE)
turtle.right(ANGLE)
lap_count = read_int('Enter number of laps (between 1 and 10): ', 1, 10)
no_racers = read_int('Enter number of racers (between 2 and {}): '.format(MAX_RACERS), 2, MAX_RACERS)
jockey_colors = COLORS[0:no_racers]
window = Screen()
window.bgcolor('lightblue')
racers = defaultdict(dict)
draw_square(Turtle(visible=False), (0, 0), SIZE)
for color in jockey_colors:
jockey = Turtle('turtle', visible=False)
jockey.speed('fastest')
jockey.color(color)
jockey.up()
jockey.goto(-SIZE/2, SIZE/2)
jockey.showturtle()
racers[color]['jockey'] = jockey
racers[color]['sides'] = 0
racers[color]['position'] = 0
finished = False
while not finished:
for racer in racers.values():
jockey = racer['jockey']
step = randint(1, MAXIMUM_STRIDE + 1)
if racer['position'] + step > SIZE:
racer['sides'] += 1
if racer['sides'] == lap_count * SIDES:
finished = True
break
baby_step = SIZE - racer['position']
jockey.forward(baby_step)
jockey.right(ANGLE)
racer['position'] = 0
step -= baby_step
jockey.forward(step)
racer['position'] += step
window.exitonclick()
这个给你:
import turtle
from random import randint
def read_int(prompt,first,last):
x = int(input(prompt))
while x < first or x > last:
print("Not in range. Try Again!!!")
x= int(input(prompt))
return x
no_of_laps = read_int("Enter your laps between 1 and 10: ",1 , 10)
print(no_of_laps)
window = turtle.Screen()
window.bgcolor('lightblue')
def draw_square(turtle, center, size):
xPt, yPt = center
xPt -= size / 2
yPt += size / 2
side = 4
size = 300
angle = 90
turtle.speed(0)
turtle.up()
turtle.goto(xPt, yPt)
turtle.down()
for i in range(side):
turtle.forward(size)
turtle.right(angle)
t = turtle.Turtle()
draw_square(t,(0,0),300)
t.shape('turtle')
t.color("red")
t.pensize(5)
t.up()
t.goto(-150, 150)
#def r():
r = turtle.Turtle()
draw_square(r,(0,0),300)
r.shape('turtle')
r.color("yellow")
r.up()
r.pensize(5)
r.goto(-150, 150)
sides = 4
size = 300
no_of_turns = int(no_of_laps) * sides
countTurns_t = 0
countTurns_r = 0
t_i = 0
r_i = 0
while countTurns_t < no_of_turns and countTurns_r < no_of_turns:
t_step = randint(1, 5)
if t_i + t_step > size:
t_step = size - t_i
t.forward(t_step)
t_i = 0
t.right(90)
countTurns_t += 1
else:
t.forward(t_step)
t_i += t_step
r_step = randint(1, 5)
if r_i + r_step > size:
r_step = size - r_i
r.forward(r_step)
r_i = 0
r.right(90)
countTurns_r += 1
else:
r.forward(r_step)
r_i += r_step
window.exitonclick()
PS希望您能看到上面提供的此代码如何以及为什么能按预期工作。 仔细阅读其他答案,它们指出编写代码时您缺少的重要问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.