2023-12-21 15:53:36 -07:00
|
|
|
import turtle
|
|
|
|
|
import random
|
|
|
|
|
|
2023-12-21 23:35:01 -07:00
|
|
|
def stackTowers(num, turts):
|
2023-12-20 22:24:30 -07:00
|
|
|
A = []
|
|
|
|
|
B = []
|
|
|
|
|
C = []
|
|
|
|
|
rounds = 0
|
2023-12-21 23:35:01 -07:00
|
|
|
rods = {"A":A, "B":B, "C":C}
|
2023-12-20 22:24:30 -07:00
|
|
|
|
|
|
|
|
for i in range(num):
|
|
|
|
|
A.insert(0, i+1)
|
|
|
|
|
|
|
|
|
|
|
2023-12-21 23:35:01 -07:00
|
|
|
def hanoi(num, start, aux, end, turts):
|
2023-12-20 22:24:30 -07:00
|
|
|
nonlocal rounds
|
|
|
|
|
|
|
|
|
|
if num == 1:
|
|
|
|
|
end += [start.pop()]
|
|
|
|
|
rounds += 1
|
2023-12-21 23:35:01 -07:00
|
|
|
moveTurtles(turts[end[-1] - 1], rods)
|
2023-12-20 22:24:30 -07:00
|
|
|
else:
|
2023-12-21 23:35:01 -07:00
|
|
|
hanoi(num - 1, start, end, aux, turts)
|
2023-12-20 22:24:30 -07:00
|
|
|
end += [start.pop()]
|
|
|
|
|
rounds += 1
|
2023-12-21 23:35:01 -07:00
|
|
|
moveTurtles(turts[end[-1] - 1], rods)
|
|
|
|
|
hanoi(num -1, aux, start, end, turts)
|
2023-12-20 22:24:30 -07:00
|
|
|
|
2023-12-21 23:35:01 -07:00
|
|
|
hanoi(num, A, B, C, turts)
|
2023-12-20 22:24:30 -07:00
|
|
|
|
2023-12-21 15:53:36 -07:00
|
|
|
|
|
|
|
|
def createRods(t):
|
|
|
|
|
for i in range(3):
|
|
|
|
|
t.penup()
|
2023-12-21 23:35:01 -07:00
|
|
|
t.goto(300*(i-1), 100)
|
2023-12-21 15:53:36 -07:00
|
|
|
t.pendown()
|
|
|
|
|
t.right(90)
|
|
|
|
|
t.forward(200)
|
|
|
|
|
t.left(90)
|
|
|
|
|
|
|
|
|
|
def generateColor():
|
|
|
|
|
r = random.randint(0, 255)
|
|
|
|
|
g = random.randint(0, 255)
|
|
|
|
|
b = random.randint(0, 255)
|
|
|
|
|
|
|
|
|
|
hexColor = "#{:02X}{:02X}{:02X}".format(r, g, b)
|
|
|
|
|
return hexColor
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def createTurtles(num):
|
|
|
|
|
turtles = []
|
|
|
|
|
|
2023-12-21 23:35:01 -07:00
|
|
|
totalHeight = num*15
|
|
|
|
|
|
2023-12-21 15:53:36 -07:00
|
|
|
for i in range(num):
|
|
|
|
|
newTurt = turtle.Turtle()
|
|
|
|
|
newTurt.shape("square")
|
2023-12-21 23:35:01 -07:00
|
|
|
newTurt.shapesize(1/2, (i+1)*2, 1)
|
2023-12-21 15:53:36 -07:00
|
|
|
newTurt.color(generateColor())
|
2023-12-21 16:13:46 -07:00
|
|
|
newTurt.penup()
|
2023-12-21 23:35:01 -07:00
|
|
|
newTurt.goto(-300, (num*15 - 100) - i*15)
|
|
|
|
|
newTurt.name = str(i+1)
|
|
|
|
|
|
2023-12-21 15:53:36 -07:00
|
|
|
turtles.append(newTurt)
|
|
|
|
|
|
2023-12-21 23:35:01 -07:00
|
|
|
return turtles
|
|
|
|
|
|
|
|
|
|
def moveTurtles(turt, rods):
|
|
|
|
|
rodPos = {"A":-300, "B":0, "C":300}
|
|
|
|
|
x = turt.xcor()
|
|
|
|
|
y = turt.ycor()
|
2023-12-21 15:53:36 -07:00
|
|
|
|
2023-12-21 23:35:01 -07:00
|
|
|
for rods, turtList in rods.items():
|
|
|
|
|
if int(turt.name) in turtList:
|
|
|
|
|
x = rodPos[rods]
|
|
|
|
|
y = len(turtList) * 15 - 100
|
|
|
|
|
|
|
|
|
|
turt.goto(x, y)
|
2023-12-21 15:53:36 -07:00
|
|
|
|
|
|
|
|
|
|
|
|
|
def main():
|
2023-12-21 23:35:01 -07:00
|
|
|
num = 8
|
2023-12-21 15:53:36 -07:00
|
|
|
tRod = turtle.Turtle()
|
|
|
|
|
tRod.pensize(5)
|
|
|
|
|
wn = turtle.Screen()
|
|
|
|
|
|
|
|
|
|
createRods(tRod)
|
2023-12-21 16:13:46 -07:00
|
|
|
turts = createTurtles(num)
|
2023-12-21 23:35:01 -07:00
|
|
|
stackTowers(num, turts)
|
2023-12-21 16:13:46 -07:00
|
|
|
|
2023-12-21 15:53:36 -07:00
|
|
|
wn.exitonclick()
|
|
|
|
|
|
|
|
|
|
main()
|