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删除空文件和空文件夹的方法
Jul 14 Python
Python类装饰器实现方法详解
Dec 21 Python
解决PyCharm不运行脚本,而是运行单元测试的问题
Jan 17 Python
Python实现FTP弱口令扫描器的方法示例
Jan 31 Python
python numpy实现文件存取的示例代码
May 26 Python
解决python文件双击运行秒退的问题
Jun 24 Python
tensorflow 变长序列存储实例
Jan 20 Python
python对数组进行排序,并输出排序后对应的索引值方式
Feb 28 Python
python中sklearn的pipeline模块实例详解
May 21 Python
手把手教你用Django执行原生SQL的方法
Feb 18 Python
详解python的内存分配机制
May 10 Python
分享Python获取本机IP地址的几种方法
Mar 17 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 模拟 asp.net webFrom 按钮提交事件实例
2014/10/13 PHP
CodeIgniter使用smtp服务发送html邮件的方法
2015/06/10 PHP
laravel框架模型中非静态方法也能静态调用的原理分析
2019/11/23 PHP
跨域请求之jQuery的ajax jsonp的使用解惑
2011/10/09 Javascript
ExtJs默认的字体大小改变的几种方法(自己整理)
2013/04/18 Javascript
jQuery调用AJAX时Get和post公用的乱码解决方法实例说明
2013/06/04 Javascript
jquery搜索框效果实现方法
2015/01/16 Javascript
js实现正则匹配中文标点符号的方法
2015/12/23 Javascript
使用postMesssage()实现跨域iframe页面间的信息传递方法
2016/03/29 Javascript
JS实现点击事件统计的简单实例
2016/07/10 Javascript
整理一些最近经常遇到的前端面试题
2017/04/25 Javascript
Vue配合iView实现省市二级联动的示例代码
2018/07/27 Javascript
Vue在页面数据渲染完成之后的调用方法
2018/09/11 Javascript
微信小程序 云开发模糊查询实现解析
2019/09/02 Javascript
Vue2.X和Vue3.0数据响应原理变化的区别
2019/11/07 Javascript
JS判断浏览器类型与操作系统的方法分析
2020/04/30 Javascript
解决echarts图表使用v-show控制图表显示不全的问题
2020/07/19 Javascript
王纯业的Python学习笔记 下载
2007/02/10 Python
Python中文编码那些事
2014/06/25 Python
修改Python的pyxmpp2中的主循环使其提高性能
2015/04/24 Python
python利用不到一百行代码实现一个小siri
2017/03/02 Python
深入探究Django中的Session与Cookie
2017/07/30 Python
详解通过API管理或定制开发ECS实例
2018/09/30 Python
Python Datetime模块和Calendar模块用法实例分析
2019/04/15 Python
Python3+PyInstall+Sciter解决报错缺少dll、html等文件问题
2019/07/15 Python
使用OpenCV获取图片连通域数量,并用不同颜色标记函
2020/06/04 Python
CSS3使用transition实现的鼠标悬停淡入淡出
2015/01/09 HTML / CSS
html通过canvas转成base64的方法
2019/07/18 HTML / CSS
本科生的职业生涯规划范文
2014/01/09 职场文书
经理助理岗位职责
2014/03/05 职场文书
大学生全国两会报告感想
2014/03/17 职场文书
2014民事授权委托书范本
2014/09/29 职场文书
研讨会通知
2015/04/27 职场文书
邓小平文选读书笔记
2015/06/29 职场文书
行政复议答复书
2015/07/01 职场文书
先进工作者主要事迹材料
2015/11/03 职场文书