1. 程式人生 > >python 遊戲 —— 漢諾塔(Hanoita)

python 遊戲 —— 漢諾塔(Hanoita)

解決 int 窗口 win7 lse ack item top gif

python 遊戲 —— 漢諾塔(Hanoita)

一、漢諾塔問題

1. 問題來源

  問題源於印度的一個古老傳說,大梵天創造世界的時候做了三根金剛石柱子,在一根柱子上從下往上按照大小順序摞著64片黃金圓盤。大梵天命令婆羅門把圓盤從下面開始按大小順序重新擺放在另一根柱子上。並且規定,在小圓盤上不能放大圓盤,在三根柱子之間一次只能移動一個圓盤。

2. 問題闡述

  塔內有三個座A、B、C,A座上有64個盤子,盤子從上到下逐漸變大,最下面的盤子最大。目前要把A座的64個盤子從A座移到C座,並且每次只能移動一個盤子,移動過程中三個座保持大盤子在下,小盤子在上,要求輸出盤子的移動過程。

二、問題解析

1. 解決方法:遞歸方法

2. 解題過程

  (1) 將上面63個盤子從A座移到B座

  (2) 將最下面的盤子從A座移到C座

  (3) 將B座的63個盤子從B座移到C座

三、問題解決

1. 非可視化解決

  (1) 代碼實現

技術分享圖片
 1 ‘‘‘ 編程環境:python3.7  win7x64 ‘‘‘
 2 def printf(A,C):  #盤子移動的輸出格式
 3     print("{} --> {}".format(A,C))
 4 
 5 def move(n,A,B,C):
 6     if n == 1:
 7         printf(A,C)     #將最後1個盤子從A座移到C座
 8     else:
 9         move(n-1,A,C,B) #將n個盤子從A座借助B座移到C座
10         printf(A,C)     #將最後1個盤子從A座移到C座
11         move(n-1,B,A,C) #將n個盤子從B座借助A座移到C座
12 
13 N = int(input("請輸入漢諾塔層數:"))
14 move(N,‘A‘,‘B‘,‘C‘)
技術分享圖片

    (2) 有圖有真相

技術分享圖片

2. 可視化解決

  (1) 代碼實現

技術分享圖片
 1 ‘‘‘ 編程環境:python3.7  win7x64 ‘‘‘
 2 from turtle import *
 3 class Stack:
 4     def __init__(self):
 5         self.items = []
 6     def isEmpty(self):
 7         return len(self.items) == 0
 8     def push(self, item):
 9         self.items.append(item)
10     def pop(self):
11         return self.items.pop()
12     def peek(self):
13         if not self.isEmpty():
14             return self.items[len(self.items) - 1]
15     def size(self):
16         return len(self.items)
17 
18 def drawpole_1(k):#畫漢諾塔的底座
19     up()
20     pensize(10)
21     speed(100)
22     goto(400*(k-1), 100)
23     down()
24     goto(400*(k-1), -100)
25     goto(400*(k-1)-20, -100)
26     goto(400*(k-1)+20, -100)
27 
28 def drawpole_3():#畫出漢諾塔的三個底座
29     hideturtle()#隱藏
30     drawpole_1(0)#畫出漢諾塔的底座左
31     drawpole_1(1)#畫出漢諾塔的底座中
32     drawpole_1(2)#畫出漢諾塔的底座右
33 
34 def creat_plates(n):#制造n個盤子
35     plates=[Turtle() for i in range(n)]
36     for i in range(n):
37         plates[i].up()
38         plates[i].hideturtle()
39         plates[i].shape("square")
40         plates[i].shapesize(1,8-i)
41         plates[i].goto(-400,-90+20*i)
42         plates[i].showturtle()
43     return plates
44 
45 def pole_stack():#制造底座的棧
46     poles=[Stack() for i in range(3)]
47     return poles
48 
49 def moveDisk(plates,poles,fp,tp):#把poles[fp]頂端的盤子plates[mov]從poles[fp]移到poles[tp]
50     mov=poles[fp].peek()
51     plates[mov].goto((fp-1)*400,150)
52     plates[mov].goto((tp-1)*400,150)
53     l=poles[tp].size()#確定移動到底部的高度(恰好放在原來最上面的盤子上面)
54     plates[mov].goto((tp-1)*400,-90+20*l)
55 
56 def moveTower(plates,poles,height,fromPole, toPole, withPole):#遞歸放盤子
57     if height >= 1:
58         moveTower(plates,poles,height-1,fromPole,withPole,toPole)
59         moveDisk(plates,poles,fromPole,toPole)
60         poles[toPole].push(poles[fromPole].pop())
61         moveTower(plates,poles,height-1,withPole,toPole,fromPole)
62 
63 myscreen=Screen()
64 setup(1200,500) #設置窗口大小
65 drawpole_3()    #畫漢諾塔的底座
66 n=int(input("請輸入漢諾塔的層數並回車:"))#輸入漢諾塔的盤子數
67 plates=creat_plates(n)#制造n個盤子
68 poles=pole_stack()
69 for i in range(n):
70     poles[0].push(i)
71 moveTower(plates,poles,n,0,2,1)
72 myscreen.exitonclick()
技術分享圖片

  (2) 有圖有真相

技術分享圖片

python 遊戲 —— 漢諾塔(Hanoita)