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 相关文章推荐
解决python3在anaconda下安装caffe失败的问题
Jun 15 Python
利用Python读取txt文档的方法讲解
Jun 23 Python
Python3.6.2调用ffmpeg的方法
Jan 10 Python
Python docx库用法示例分析
Feb 16 Python
python 使用pdfminer3k 读取PDF文档的例子
Aug 27 Python
python输出带颜色字体实例方法
Sep 01 Python
python matplotlib饼状图参数及用法解析
Nov 04 Python
python实现飞机大战小游戏
Nov 08 Python
python属于跨平台语言码
Jun 09 Python
python中round函数如何使用
Jun 19 Python
python类共享变量操作
Sep 03 Python
Python爬虫之爬取某文库文档数据
Apr 21 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错误Warning:mysql_query()解决方法
2015/10/24 PHP
PHP中__autoload和Smarty冲突的简单解决方法
2016/04/08 PHP
用JavaScrpt实现文件夹简单轻松加密的实现方法图文
2008/09/08 Javascript
jQuery toggle()设置CSS样式
2009/11/05 Javascript
基于jquery的不规则矩形的排列实现代码
2012/04/16 Javascript
String.prototype实现的一些javascript函数介绍
2013/11/22 Javascript
Js实现双击鼠标自动滚动屏幕的示例代码
2013/12/14 Javascript
bootstrap改变按钮加载状态
2014/12/01 Javascript
jQuery中odd选择器的定义和用法
2014/12/23 Javascript
jquery中cookie用法实例详解(获取,存储,删除等)
2016/01/04 Javascript
bootstrap侧边栏圆点导航
2017/01/11 Javascript
bootstrap中添加额外的图标实例代码
2017/02/15 Javascript
JS对象深度克隆实例分析
2017/03/16 Javascript
Layer弹出层动态获取数据的方法
2018/08/20 Javascript
详解webpack打包后如何调试的方法步骤
2018/11/07 Javascript
原生js实现3D轮播图
2020/03/21 Javascript
vue中实现拖动调整左右两侧div的宽度的示例代码
2020/07/22 Javascript
[00:59]DOTA2英雄背景故事——上古巨神
2020/06/28 DOTA
从零学python系列之从文件读取和保存数据
2014/05/23 Python
用python实现面向对像的ASP程序实例
2014/11/10 Python
简单讲解Python中的数字类型及基本的数学计算
2016/03/11 Python
ubuntu安装sublime3并配置python3环境的方法
2018/03/15 Python
python操作xlsx文件的包openpyxl实例
2018/05/03 Python
对python特殊函数 __call__()的使用详解
2019/07/02 Python
在PyCharm的 Terminal(终端)切换Python版本的方法
2019/08/02 Python
python使用ctypes调用扩展模块的实例方法
2020/01/28 Python
解决python虚拟环境切换无效的问题
2020/04/30 Python
jupyter notebook远程访问不了的问题解决方法
2021/01/11 Python
深入浅析HTML5中的SVG
2015/11/27 HTML / CSS
详解快速开发基于 HTML5 网络拓扑图应用
2018/01/08 HTML / CSS
印度最大的网上花店:Ferns N Petals(鲜花、礼品和蛋糕)
2017/10/16 全球购物
如何提高SQL Server的安全性
2016/07/25 面试题
土木工程建筑专业毕业生求职信
2013/10/21 职场文书
城市创卫标语
2014/06/17 职场文书
领导干部作风建设自查报告
2014/10/23 职场文书
Win11怎么解除儿童账号限制?Win11解除微软儿童账号限制方法
2022/07/07 数码科技