Вам нужно прочитать о движении по периметру круга и эллипса. А также полярные и декартовы координаты. Ниже приведен грубый, если не ошибочный пример, который включает основные идеи, но требует работы.
Но сначала давайте рассмотрим некоторые специфические проблемы с кодом:
speed(-10)
Это в основном бессмыслица. Неправильная черепаха, неверный аргумент. Перечитайте документацию. Вместо того, чтобы идти на все эти усилия:
pil_img = Image.open("eightLane.jpg") # Use PIL to open .jpg image.
tk_img = ImageTk.PhotoImage(pil_img) # Convert it into something tkinter can use.
canvas = turtle.getcanvas() # Get the tkinter Canvas of this TurtleScreen.
# Create a Canvas image object holding the tkinter image.
img_obj_id = canvas.create_image(0, 0, image=tk_img, anchor='center')
Почему бы просто не преобразовать внешнее фоновое изображение в GIF и просто сделать: структура данных:
addk=0
addkk=0
addkkk=0
addkkkk=0
addkkkkk=0
addkkkkkk=0
addkkkkkkk=0
addkkkkkkkk=0
Если бы мы расширили ипподром до девяти полос, то должно быть только небольшое количество мест, в которых ваш код должен измениться. Мой пример:
from turtle import Screen, Turtle
from math import sin, cos, atan2, pi
from random import randrange
# should probably calculate starting positions based on ellipse perimeter
LINEUP = [ # (color, (starting postion))
('red', (0, 90)),
('yellow', (-55, 120)),
('blue', (-120, 150)),
('green', (-195, 165)),
('dark goldenrod', (-270, 180)),
('blue violet', (-365, 170)),
('magenta', (-465, 140)),
('light slate gray', (-550, 100)),
]
DELTA = 0.4 # radians clockwise
def radii(index): # calculate concentric ellipse radii
return 265 + index * 44, 90 + index * 36
def race():
"""
every 1/10th of a second, pick a random
racer and move it forward a bit
"""
index = randrange(len(racers))
racer = racers[index]
# get angle from x, y; bump angle; compute new x, y
theta = atan2(racer.ycor(), racer.xcor()) + DELTA
a, b = radii(index)
x = a * cos(theta)
y = b * sin(theta)
racer.setheading(racer.towards(x, y))
racer.setposition(x, y)
# check if racer has crossed the finish line
if pi/2 < theta < pi/2 + DELTA/2:
pass # we have a winner!
else:
screen.ontimer(race, 100)
screen = Screen()
screen.setup(1225, 825) # fit image
screen.bgpic("eightLane.gif") # convert image to GIF for simplicity
racers = []
for index, (color, position) in enumerate(LINEUP):
racer = Turtle('turtle', visible=False)
racer.setheading(180 + index * 10)
racer.speed('fastest')
racer.color(color)
racer.penup()
racer.setposition(position)
racer.showturtle()
racers.append(racer)
race()
screen.mainloop()
Это очень просто сделать рекурсивно. Основная идея заключается в том, что для каждого элемента набор подмножеств можно разделить поровну на те, которые содержат этот элемент, и на те, которые его не содержат, и эти два набора в противном случае равны.
Редактировать Чтобы сделать его кристально ясным:
Если Вы хотите перечислить все возможные подмножества, взглянули на данную статью. Они обсуждают разные подходы, такие как лексикографический порядок, серое кодирование и последовательность банкира. Они дают реализацию в качестве примера последовательности банкира и обсуждают различные характеристики решений, например, производительности.
одним простым способом был бы следующий псевдокод:
Set getSubsets(Set theSet)
{
SetOfSets resultSet = theSet, tempSet;
for (int iteration=1; iteration < theSet.length(); iteration++)
foreach element in resultSet
{
foreach other in resultSet
if (element != other && !isSubset(element, other) && other.length() >= iteration)
tempSet.append(union(element, other));
}
union(tempSet, resultSet)
tempSet.clear()
}
}
Ну, я не совсем уверен, что это правильно, но выглядит нормально.