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 错误和异常小结
Oct 09 Python
搞笑的程序猿:看看你是哪种Python程序员
Jun 12 Python
python引入导入自定义模块和外部文件的实例
Jul 24 Python
Python自定义函数定义,参数,调用代码解析
Dec 27 Python
Python实现批量压缩图片
Jan 25 Python
matplotlib subplots 设置总图的标题方法
May 25 Python
Flask框架配置与调试操作示例
Jul 23 Python
解决安装python库时windows error5 报错的问题
Oct 21 Python
Python 支付整合开发包的实现
Jan 23 Python
详解django+django-celery+celery的整合实战
Mar 19 Python
Python输出指定字符串的方法
Feb 06 Python
Python Pycharm虚拟下百度飞浆PaddleX安装报错问题及处理方法(亲测100%有效)
May 24 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
为了这两部电子管收音机,买了6套全新电子管和10粒刻度盘灯泡
2021/03/02 无线电
ThinkPHP CURD方法之where方法详解
2014/06/18 PHP
Joomla框架实现字符串截取的方法示例
2017/07/18 PHP
浅谈laravel-admin的sortable和orderby使用问题
2019/10/03 PHP
PHP设计模式入门之状态模式原理与实现方法分析
2020/04/26 PHP
CSS+Jquery实现页面圆角框方法大全
2009/12/24 Javascript
基于jQuery的图片剪切插件
2011/08/03 Javascript
对于this和$(this)的个人理解
2013/09/08 Javascript
javascript右下角弹层及自动隐藏(自己编写)
2013/11/20 Javascript
jquery简单实现鼠标经过导航条改变背景图
2013/12/17 Javascript
javascript不同类型数据之间的运算的转换方法
2014/02/13 Javascript
jquery自定义下拉列表示例
2014/04/25 Javascript
JavaScript获取浏览器信息的方法
2015/11/20 Javascript
Jquery实现$.fn.extend和$.extend函数
2016/04/14 Javascript
Angularjs 实现动态添加控件功能
2017/05/25 Javascript
JavaScript常用数学函数用法示例
2018/05/14 Javascript
小程序实现录音上传功能
2019/11/22 Javascript
[02:56]DOTA2上海特锦赛小组赛解说FreeAgain采访花絮
2016/02/27 DOTA
Python随机生成信用卡卡号的实现方法
2015/05/14 Python
python安装mysql-python简明笔记(ubuntu环境)
2016/06/25 Python
python实现停车管理系统
2018/11/30 Python
Python Django 封装分页成通用的模块详解
2019/08/21 Python
Python 共享变量加锁、释放详解
2019/08/28 Python
python2与python3爬虫中get与post对比解析
2019/09/18 Python
Python+Selenium+phantomjs实现网页模拟登录和截图功能(windows环境)
2019/12/11 Python
Python和Sublime整合过程图示
2019/12/25 Python
如何使用 Flask 做一个评论系统
2020/11/27 Python
MIXIT官网:俄罗斯最大的化妆品公司之一
2020/01/25 全球购物
神话般的珠宝:Ross-Simons
2020/07/13 全球购物
在DELPHI中调用存储过程和使用内嵌SQL哪种方式更好
2016/11/22 面试题
校园招聘策划书
2014/01/09 职场文书
乡镇信息公开实施方案
2014/03/23 职场文书
日语专业求职信
2014/07/04 职场文书
组工干部演讲稿
2014/09/02 职场文书
罗马假日观后感
2015/06/08 职场文书
Python实现批量将文件复制到新的目录中再修改名称
2022/04/12 Python