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编写屏幕截图程序方法
Feb 18 Python
使用Python编写一个最基础的代码解释器的要点解析
Jul 12 Python
深入理解Django的自定义过滤器
Oct 17 Python
Python实现对字典分别按键(key)和值(value)进行排序的方法分析
Dec 19 Python
一篇文章了解Python中常见的序列化操作
Jun 20 Python
python实现抠图给证件照换背景源码
Aug 20 Python
python连接、操作mongodb数据库的方法实例详解
Sep 11 Python
pyqt5 QScrollArea设置在自定义侧(任何位置)
Sep 25 Python
opencv3/C++图像像素操作详解
Dec 10 Python
Python安装tar.gz格式文件方法详解
Jan 19 Python
Django查询优化及ajax编码格式原理解析
Mar 25 Python
python遍历路径破解表单的示例
Nov 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
骨王战斗力在公会成员中排不进前五,却当选了会长,原因竟是这样
2020/03/02 日漫
PHP 数组入门教程小结
2009/05/20 PHP
thinkPHP数据查询常用方法总结【select,find,getField,query】
2017/03/15 PHP
Jquery知识点三 jquery表单对象操作
2011/01/17 Javascript
控制文字内容的显示与隐藏示例
2014/06/11 Javascript
浅谈jQuery的offset()方法及示例分享
2015/07/17 Javascript
js中使用使用原型(prototype)定义方法的好处详解
2016/07/04 Javascript
简单理解Vue条件渲染
2016/12/03 Javascript
jquery pagination插件动态分页实例(Bootstrap分页)
2016/12/23 Javascript
Three.js基础部分学习
2017/01/08 Javascript
js模拟微博发布消息
2017/02/23 Javascript
使用bootstrap-paginator.js 分页来进行ajax 异步分页请求示例
2017/03/09 Javascript
在iframe中使bootstrap的模态框在父页面弹出问题
2017/08/07 Javascript
countup.js实现数字动态叠加效果
2019/10/17 Javascript
[01:01:18]DOTA2上海特级锦标赛主赛事日 - 2 败者组第二轮#2COL VS LGD
2016/03/03 DOTA
python实现从ftp服务器下载文件的方法
2015/04/30 Python
python实现朴素贝叶斯分类器
2018/03/28 Python
Python字符串逆序的实现方法【一题多解】
2019/02/18 Python
pyqt5让图片自适应QLabel大小上以及移除已显示的图片方法
2019/06/21 Python
python连接PostgreSQL数据库的过程详解
2019/09/18 Python
初学者学习Python好还是Java好
2020/05/26 Python
使用python-cv2实现视频的分解与合成的示例代码
2020/10/26 Python
美国旅游网站:Tours4Fun
2017/02/17 全球购物
哥德堡通行证:Gothenburg Pass
2019/12/09 全球购物
授权委托书范本
2014/04/03 职场文书
自愿离婚协议书2015
2015/01/26 职场文书
青岛海底世界导游词
2015/02/11 职场文书
搬迁通知
2015/04/20 职场文书
给老师的保证书怎么写
2015/05/09 职场文书
工作汇报材料难写?方法都在这里了!
2019/07/01 职场文书
检讨书之工作不认真
2019/08/14 职场文书
java解析XML详解
2021/07/09 Java/Android
2021好看的国漫排行榜前十名 《完美世界》上榜,《元龙》排名第一
2022/03/18 国漫
vue3种table表格选项个数的控制方法
2022/04/14 Vue.js
移除Selenium中window.navigator.webdriver值
2022/06/10 Python
详解MySQL的内连接和外连接
2023/05/08 MySQL