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爬取Coursera课程资源的详细过程
Nov 04 Python
pandas每次多Sheet写入文件的方法
Dec 10 Python
python图像处理入门(一)
Apr 04 Python
Python面向对象程序设计构造函数和析构函数用法分析
Apr 12 Python
python绘制评估优化算法性能的测试函数
Jun 25 Python
使用django的objects.filter()方法匹配多个关键字的方法
Jul 18 Python
Python帮你微信头像任意添加装饰别再@微信官方了
Sep 25 Python
Win10环境中如何实现python2和python3并存
Jul 20 Python
Python同时处理多个异常的方法
Jul 28 Python
如何利用Python写个坦克大战
Nov 18 Python
解决tensorflow模型压缩的问题_踩坑无数,总算搞定
Mar 02 Python
Python matplotlib多个子图绘制整合
Apr 13 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 $_SERVER当前完整url的写法
2009/11/12 PHP
一个简单php扩展介绍与开发教程
2010/08/19 PHP
Codeigniter实现处理用户登录验证后的URL跳转
2014/06/12 PHP
php使用str_replace实现输入框回车替换br的方法
2014/11/24 PHP
php用ini_get获取php.ini里变量值的方法
2015/03/04 PHP
thinkphp3.2中Lite文件替换框架入口文件或应用入口文件的方法
2015/05/21 PHP
(转载)JavaScript中匿名函数,函数直接量和闭包
2007/05/08 Javascript
JavaScript Sort 表格排序
2009/10/31 Javascript
JQuery读取XML文件数据并显示的实现代码
2009/12/16 Javascript
JavaScript自动设置IFrame高度的小例子
2013/06/08 Javascript
js中浮点型运算BUG的解决方法说明
2014/01/06 Javascript
javascript调试之DOM断点调试法使用技巧分享
2014/04/15 Javascript
jQuery 实现自动填充邮箱功能(带下拉提示)
2014/10/14 Javascript
js+canvas简单绘制圆圈的方法
2016/01/28 Javascript
基于HTML模板和JSON数据的JavaScript交互(移动端)
2016/04/06 Javascript
解决vue页面刷新或者后退参数丢失的问题
2018/03/13 Javascript
深入理解Vue父子组件生命周期执行顺序及钩子函数
2018/08/12 Javascript
微信小程序自定义带价格显示日历效果
2018/12/29 Javascript
vue基础之data存储数据及v-for循环用法示例
2019/03/08 Javascript
详解VScode编辑器vue环境搭建所遇问题解决方案
2019/04/26 Javascript
Python类的专用方法实例分析
2015/01/09 Python
深入讲解Python中面向对象编程的相关知识
2015/05/25 Python
浅谈python可视化包Bokeh
2018/02/07 Python
python微信跳一跳系列之棋子定位像素遍历
2018/02/26 Python
python将txt文档每行内容循环插入数据库的方法
2018/12/28 Python
python里运用私有属性和方法总结
2019/07/08 Python
解析HTML5的存储功能和web SQL的相关操作方法
2016/02/19 HTML / CSS
Html5 APP中监听返回事件处理的方法示例
2018/03/15 HTML / CSS
商务英语求职自荐信范文
2013/12/24 职场文书
装修致歉信
2014/01/15 职场文书
奥巴马上海演讲稿
2014/09/10 职场文书
应届生求职自荐信范文
2015/03/04 职场文书
民政局未婚证明
2015/06/15 职场文书
学籍证明模板
2015/06/18 职场文书
初中物理教学反思
2016/02/19 职场文书
Golang二维数组的使用方式
2021/05/28 Golang