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执行shell获取硬件参数写入mysql的方法
Dec 29 Python
举例讲解如何在Python编程中进行迭代和遍历
Jan 19 Python
Python常用知识点汇总
May 08 Python
Python实现霍夫圆和椭圆变换代码详解
Jan 12 Python
使用python读取csv文件快速插入数据库的实例
Jun 21 Python
详解Django的model查询操作与查询性能优化
Oct 16 Python
Python 继承,重写,super()调用父类方法操作示例
Sep 29 Python
使用python自动追踪你的快递(物流推送邮箱)
Mar 17 Python
Python包资源下载路径报404解决方案
Nov 05 Python
如何用python绘制雷达图
Apr 24 Python
PO模式在selenium自动化测试框架的优势
Mar 20 Python
python三子棋游戏
May 04 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中的静态变量及static静态变量使用详解
2015/11/05 PHP
Yii2.0表关联查询实例分析
2016/07/18 PHP
详解Laravel视图间共享数据与视图Composer
2016/08/04 PHP
PHP7引入的"??"和"?:"的区别讲解
2019/04/08 PHP
JavaScript CSS菜单功能 改进版
2008/12/20 Javascript
js 弹出框 替代浏览器的弹出框
2010/10/29 Javascript
Jquery 动态生成表格示例代码
2013/12/24 Javascript
JS结合bootstrap实现基本的增删改查功能
2016/07/22 Javascript
js实现导航栏中英文切换效果
2017/01/16 Javascript
jQuery实现在新增加的元素上添加事件方法案例分析
2017/02/09 Javascript
vue.js组件之间传递数据的方法
2017/07/10 Javascript
Bootstrap Table 在指定列中添加下拉框控件并获取所选值
2017/07/31 Javascript
详解如何让Express支持async/await
2017/10/09 Javascript
基于js Canvas实现二次贝塞尔曲线
2018/12/25 Javascript
Node.js操作系统OS模块用法分析
2019/01/04 Javascript
JavaScript常用工具方法封装
2019/02/12 Javascript
浅谈TypeScript的类型保护机制
2020/02/23 Javascript
echarts柱状图背景重叠组合而非并列的实现代码
2020/12/10 Javascript
[03:09]2014DOTA2国际邀请赛 赛场上的美丽风景线 中国Coser也爱DOTA2
2014/07/20 DOTA
[01:03:22]LGD vs OG 2018国际邀请赛淘汰赛BO3 第一场 8.25
2018/08/29 DOTA
[01:39:04]DOTA2-DPC中国联赛 正赛 SAG vs CDEC BO3 第二场 2月1日
2021/03/11 DOTA
Python产生一个数值范围内的不重复的随机数的实现方法
2019/08/21 Python
springboot配置文件抽离 git管理统 配置中心详解
2019/09/02 Python
Python模块/包/库安装的六种方法及区别
2020/02/24 Python
Python图像处理库PIL中图像格式转换的实现
2020/02/26 Python
Python把图片转化为pdf代码实例
2020/07/28 Python
浅析Python中字符串的intern机制
2020/10/03 Python
css3实现3d旋转动画特效
2015/03/10 HTML / CSS
HTML5使用drawImage()方法绘制图像
2014/06/23 HTML / CSS
CPB肌肤之钥美国官网:Clé de Peau Beauté
2017/09/05 全球购物
机械设计毕业生自荐信
2014/02/02 职场文书
道路建设实施方案
2014/03/18 职场文书
公开服务承诺制度
2014/03/26 职场文书
大学社团活动总结
2014/04/26 职场文书
三好学生先进事迹材料
2014/08/28 职场文书
护理培训心得体会
2016/01/22 职场文书