python 实现汉诺塔游戏


Posted in Python onNovember 28, 2020

一、汉诺塔问题

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) 代码实现

''' 编程环境:python3.7 win7x64 '''
def printf(A,C): #盘子移动的输出格式
  print("{} --> {}".format(A,C))

def move(n,A,B,C):
  if n == 1:
    printf(A,C)   #将最后1个盘子从A座移到C座
  else:
    move(n-1,A,C,B) #将n个盘子从A座借助B座移到C座
    printf(A,C)   #将最后1个盘子从A座移到C座
    move(n-1,B,A,C) #将n个盘子从B座借助A座移到C座

N = int(input("请输入汉诺塔层数:"))
move(N,'A','B','C')

(2) 有图有真相

python 实现汉诺塔游戏

2. 可视化解决

 

(1) 代码实现

''' 编程环境:python3.7 win7x64 '''
from turtle import *
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_1(k):#画汉诺塔的底座
  up()
  pensize(10)
  speed(100)
  goto(400*(k-1), 100)
  down()
  goto(400*(k-1), -100)
  goto(400*(k-1)-20, -100)
  goto(400*(k-1)+20, -100)

def drawpole_3():#画出汉诺塔的三个底座
  hideturtle()#隐藏
  drawpole_1(0)#画出汉诺塔的底座左
  drawpole_1(1)#画出汉诺塔的底座中
  drawpole_1(2)#画出汉诺塔的底座右

def creat_plates(n):#制造n个盘子
  plates=[Turtle() for i in range(n)]
  for i in range(n):
    plates[i].up()
    plates[i].hideturtle()
    plates[i].shape("square")
    plates[i].shapesize(1,8-i)
    plates[i].goto(-400,-90+20*i)
    plates[i].showturtle()
  return plates

def pole_stack():#制造底座的栈
  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=Screen()
setup(1200,500) #设置窗口大小
drawpole_3()  #画汉诺塔的底座
n=int(input("请输入汉诺塔的层数并回车:"))#输入汉诺塔的盘子数
plates=creat_plates(n)#制造n个盘子
poles=pole_stack()
for i in range(n):
  poles[0].push(i)
moveTower(plates,poles,n,0,2,1)
myscreen.exitonclick()

(2) 有图有真相

python 实现汉诺塔游戏

以上就是python 实现汉诺塔游戏的详细内容,更多关于python 汉诺塔游戏的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
深度定制Python的Flask框架开发环境的一些技巧总结
Jul 12 Python
让python 3支持mysqldb的解决方法
Feb 14 Python
Python下载网络文本数据到本地内存的四种实现方法示例
Feb 05 Python
python OpenCV学习笔记之绘制直方图的方法
Feb 08 Python
如何用Python合并lmdb文件
Jul 02 Python
使用Python实现从各个子文件夹中复制指定文件的方法
Oct 25 Python
python引入不同文件夹下的自定义模块方法
Oct 27 Python
Python完成毫秒级抢淘宝大单功能
Jun 06 Python
PyQt5笔记之弹出窗口大全
Jun 20 Python
python通过nmap扫描在线设备并尝试AAA登录(实例代码)
Dec 30 Python
python中子类与父类的关系基础知识点
Feb 02 Python
用python 绘制茎叶图和复合饼图
Feb 26 Python
Python读写锁实现实现代码解析
Nov 28 #Python
python解压zip包中文乱码解决方法
Nov 27 #Python
python 实现控制鼠标键盘
Nov 27 #Python
Python模拟键盘输入自动登录TGP
Nov 27 #Python
python操作toml文件的示例代码
Nov 27 #Python
Python GUI库Tkiner使用方法代码示例
Nov 27 #Python
Python爬虫爬取有道实现翻译功能
Nov 27 #Python
You might like
php更新修改excel中的内容实例代码
2014/02/26 PHP
迁移PHP版本到PHP7
2015/02/06 PHP
AES加解密在php接口请求过程中的应用示例
2016/10/26 PHP
PHP压缩图片功能的介绍
2019/03/21 PHP
用JS提交参数创建form表单在FireFox中遇到的问题
2013/01/16 Javascript
JavaScript打印iframe内容示例代码
2013/08/20 Javascript
JAVASCRIPT函数作用域和提前声明 分享
2013/08/22 Javascript
JavaScript函数模式详解
2014/11/07 Javascript
使用JavaScript和C#中获得referer
2014/11/14 Javascript
js实现用户注册协议倒计时的方法
2015/01/21 Javascript
用户代理字符串userAgent可实现的四个识别
2015/09/20 Javascript
深入理解jQuery之防止冒泡事件
2016/05/24 Javascript
微信小程序滚动Tab实现左右可滑动切换
2017/08/17 Javascript
Layui table 组件的使用之初始化加载数据、数据刷新表格、传参数
2017/09/11 Javascript
详解Webpack实战之构建 Electron 应用
2017/12/25 Javascript
在vue项目中引入highcharts图表的方法(详解)
2018/03/05 Javascript
jQuery实现基本淡入淡出效果的方法详解
2018/09/05 jQuery
JavaScript中var的重要性实例分析
2019/07/09 Javascript
基于JavaScript实现大文件上传后端代码实例
2020/08/18 Javascript
python访问纯真IP数据库的代码
2011/05/19 Python
编写Python脚本来获取Google搜索结果的示例
2015/05/04 Python
Python实现文件按照日期命名的方法
2015/07/09 Python
python实现kMeans算法
2017/12/21 Python
tensorflow 获取变量&打印权值的实例讲解
2018/06/14 Python
python 寻找list中最大元素对应的索引方法
2018/06/28 Python
python配置grpc环境
2019/01/01 Python
Python3连接Mysql8.0遇到的问题及处理步骤
2020/02/17 Python
详解Python 最短匹配模式
2020/07/29 Python
老教师工作总结的自我评价
2013/09/27 职场文书
前台接待员岗位职责
2014/01/02 职场文书
个人求职信范文
2014/05/24 职场文书
学习优秀党员杨宗兴先进事迹材料思想汇报
2014/09/14 职场文书
暑期实践个人总结
2015/03/06 职场文书
2019开业庆典剪彩仪式主持词!
2019/07/22 职场文书
人物搭配车车超萌联名预备中 【咒术迴战】 ⨯ 【天竺鼠车车】 展开合作
2022/04/11 日漫
Go本地测试解耦任务拆解及沟通详解Go本地测试的思路沟通的重要性总结
2022/06/21 Golang