<p>我将采用一种稍微不同的方法——而不是硬编码两个海龟,而是为任意数量的海龟设计,然后只与两只海龟比赛。这里有一个基于任意数量的海龟的重写,其中包括一些style代码的返工,以及@Claudio的一些代码建议:</p>
<pre><code>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()
</code></pre>