python 游戏 —— 汉诺塔(Hanoita)
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)的更多相关文章
- python递归——汉诺塔
汉诺塔的传说 法国数学家爱德华·卢卡斯曾编写过一个印度的古老传说:在世界中心贝拿勒斯(在印度北部)的圣庙里,一块黄铜板上插着三根宝石针.印度教的主神梵天在创造世界的时候,在其中一根针上从下到上地穿好了 ...
- python解决汉诺塔问题
今天刚刚在博客园安家,不知道写点什么,前两天刚刚学习完python 所以就用python写了一下汉诺塔算法,感觉还行拿出来分享一下 首先看一下描述: from :http://baike.baidu. ...
- 【学习】Python解决汉诺塔问题
参考文章:http://www.cnblogs.com/dmego/p/5965835.html 一句话:学程序不是目的,理解就好:写代码也不是必然,省事最好:拿也好,查也好,解决问题就好! ...
- Python实现汉诺塔问题的可视化(以动画的形式展示移动过程)
学习Python已经有一段时间了,也学习了递归的方法,而能够实践该方法的当然就是汉诺塔问题了,但是这次我们不只是要完成对汉诺塔过程的计算,还要通过turtle库来体现汉诺塔中每一层移动的过程. 一.设 ...
- python实现汉诺塔程序
# 汉诺塔思想笔记# 认识汉诺塔的目标:把A柱子上的N个盘子移动到C柱子# 递归的思想就是把这个目标分解成三个子目标# 子目标1:将前n-1个盘子从a移动到b上# 子目标2:将最底下的最后一个盘子从a ...
- Python之汉诺塔递归运算
汉诺塔问题是一个经典的问题.汉诺塔(Hanoi Tower),又称河内塔,源于印度一个古老传说.大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘.大梵天命令婆 ...
- python 实现汉诺塔
汉诺塔:汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具.大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘. 大梵天命令婆罗门把圆盘从下面开始按大小顺 ...
- python实现汉诺塔
经典递归算法汉诺塔分析: 当A柱子只有1个盘子,直接A --> C 当A柱子上有3个盘子,A上第一个盘子 --> B, A上最后一个盘子 --> C, B上所有盘子(1个) --&g ...
- python实现汉诺塔移动
汉诺塔问题 汉诺塔是根据一个传说形成的一个问题.汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具.大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘.大 ...
随机推荐
- 遗传算法(GA)
来自:https://blog.csdn.net/u010451580/article/details/51178225 遗传算法是模仿生物进化机制的随机全局搜索和优化方法.借鉴达尔文进化论和孟德尔的 ...
- 基于三层架构项目下的Ado【六】
一.基于三层架构项目下的Ado增删改查总结,提示:现在一般都是使用EF框架操作. 1. 先在model层创建出一个和你将会查询出一样类型的表,比如你将查询出的有五个字段,那么你就需要创建出一个和你查询 ...
- leecode第二百九十二题(Nim游戏)
class Solution { public: bool canWinNim(int n) { )==)//用与的时候,要注意优先级问题 //用n%4==0的时候,其耗时比用&短,但是空间消 ...
- JS-函数作用域
如果变量在函数内没有声明(没有使用 var 关键字),该变量为全局变量.
- Ctrl+Alt+Down/Up 按键冲突
I mapped Ctrl-Alt-Up/Down to open web-browser and email client but it didn't take effect. Ctrl-Alt-U ...
- 方程的解_NOI导刊2010提高
方程的解 给定x,求\(a_1+a_2+...+a_k=x^x\ mod\ 1000\)的正整数解解的组数,对于100%的数据,k≤100,x≤2^31-1. 解 显然x是可以快速幂得到答案的,而该问 ...
- JSP介绍
1.JSP简介 JSP全名为Java Server Pages,中文名叫java服务器页面,其根本是一个简化的Servlet设计,它是由Sun Microsystems公司倡导.许多公司参与一起建立的 ...
- Vue 知识整理—02-起步
一:Vue 语法格式: vue vm = new Vue({ //选项 }) 二:Vue 实例: <div id="app"> <p>{{message}} ...
- java知识随笔
Servlet: void init(ServletConfig var1) throws ServletException; ServletConfig getServletConfig(); vo ...
- 1、java的数据类型
一.基本数据类型 1.整型(byte,short,int,long) byte在内存中占用一个字节,short占用两个字节,int占用四个字节,long占用8个字节: Java语言中整型默认为int型 ...