-
Notifications
You must be signed in to change notification settings - Fork 9
/
Copy path汉诺塔高级玩法.py
96 lines (73 loc) · 2.56 KB
/
汉诺塔高级玩法.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
# -*- coding: utf-8 -*-
# Time : 2019/4/5 22:35
# Author : Mifen
# Email : [email protected]
# Github : https://github.com/Amd794
import turtle
class Stack:
def __init__(self):
self.items = []
def isEmpty(self):
return len(self.items) == 0
def push(self, item):
self.items.append(item)
def pop(self):
return self.items.pop()
def peek(self):
if not self.isEmpty():
return self.items[len(self.items) - 1]
def size(self):
return len(self.items)
def drawpole_3(): # 画出汉诺塔的poles
t = turtle.Turtle()
t.hideturtle()
def drawpole_1(k):
t.up()
t.pensize(10)
t.speed(100)
t.goto(400 * (k - 1), 100)
t.down()
t.goto(400 * (k - 1), -100)
t.goto(400 * (k - 1) - 20, -100)
t.goto(400 * (k - 1) + 20, -100)
drawpole_1(0) # 画出汉诺塔的poles[0]
drawpole_1(1) # 画出汉诺塔的poles[1]
drawpole_1(2) # 画出汉诺塔的poles[2]
def creat_plates(n): # 制造n个盘子
turtle.colormode(255)
plates = [turtle.Turtle() for i in range(n)]
for i in range(n):
plates[i].up()
plates[i].hideturtle()
plates[i].shape("square")
import random
plates[i].pencolor(random.randint(0, 255), random.randint(0, 255), random.randint(0, 255))
plates[i].fillcolor(random.randint(0, 255), random.randint(0, 255), random.randint(0, 255))
# plates[i].shape(1,8-i)
plates[i].goto(-400, -90 + 20 * i)
plates[i].showturtle()
return plates
def pole_stack(): # 制造poles的栈
poles = [Stack() for i in range(3)]
return poles
def moveDisk(plates, poles, fp, tp): # 把poles[fp]顶端的盘子plates[mov]从poles[fp]移到poles[tp]
mov = poles[fp].peek()
plates[mov].goto((fp - 1) * 400, 150)
plates[mov].goto((tp - 1) * 400, 150)
l = poles[tp].size() # 确定移动到底部的高度(恰好放在原来最上面的盘子上面)
plates[mov].goto((tp - 1) * 400, -90 + 20 * l)
def moveTower(plates, poles, height, fromPole, toPole, withPole): # 递归放盘子
if height >= 1:
moveTower(plates, poles, height - 1, fromPole, withPole, toPole)
moveDisk(plates, poles, fromPole, toPole)
poles[toPole].push(poles[fromPole].pop())
moveTower(plates, poles, height - 1, withPole, toPole, fromPole)
myscreen = turtle.Screen()
drawpole_3()
n = 8
plates = creat_plates(n)
poles = pole_stack()
for i in range(n):
poles[0].push(i)
moveTower(plates, poles, n, 0, 2, 1)
myscreen.exitonclick()