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备份Mysql脚本
Aug 11 Python
python使用正则表达式的search()函数实现指定位置搜索功能
Nov 10 Python
Python3结合Dlib实现人脸识别和剪切
Jan 24 Python
Python实现矩阵相乘的三种方法小结
Jul 26 Python
用Python实现数据的透视表的方法
Nov 16 Python
Python3实现的回文数判断及罗马数字转整数算法示例
Mar 27 Python
python itchat实现调用微信接口的第三方模块方法
Jun 11 Python
Python集合操作方法详解
Feb 09 Python
浅谈Python中文件夹和python package包的区别
Jun 01 Python
Python中关于logging模块的学习笔记
Jun 03 Python
利用Python实现Excel的文件间的数据匹配功能
Jun 16 Python
pytorch掉坑记录:model.eval的作用说明
Jun 23 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
基于mysql的bbs设计(五)
2006/10/09 PHP
php面向对象全攻略 (十) final static const关键字的使用
2009/09/30 PHP
php5.3中连接sqlserver2000的两种方法(com与ODBC)
2012/12/29 PHP
[原创]PHP实现字节数Byte转换为KB、MB、GB、TB的方法
2017/08/31 PHP
JS定义回车事件(实现代码)
2013/07/08 Javascript
js中replace的用法总结
2013/12/27 Javascript
javascript数字时钟示例分享
2014/04/23 Javascript
JS实现控制表格行文本对齐的方法
2015/03/30 Javascript
input点击后placeholder中的提示消息消失
2016/01/15 Javascript
jQuery基础知识点总结(DOM操作)
2016/06/01 Javascript
node.js 动态执行脚本
2016/06/02 Javascript
深入理解vue.js双向绑定的实现原理
2016/12/05 Javascript
浅谈Vue初学之props的驼峰命名
2018/07/19 Javascript
在JavaScript中使用严格模式(Strict Mode)
2019/06/13 Javascript
JavaScript动态添加数据到表单并提交的几种方式
2019/06/26 Javascript
ES6的异步操作之promise用法和async函数的具体使用
2019/12/06 Javascript
jquery将信息遍历到界面上实例代码
2020/01/21 jQuery
[55:47]DOTA2上海特级锦标赛C组小组赛#2 LGD VS Newbee第三局
2016/02/27 DOTA
[01:11:15]VGJ.S vs Secret 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
Python列表计数及插入实例
2014/12/17 Python
解读Django框架中的低层次缓存API
2015/07/24 Python
python 多线程重启方法
2019/02/18 Python
计算Python Numpy向量之间的欧氏距离实例
2020/05/22 Python
Python基础教程(一)——Windows搭建开发Python开发环境
2020/07/20 Python
通过Python pyecharts输出保存图片代码实例
2020/11/25 Python
javascript实现用户必须勾选协议实例讲解
2021/03/24 Javascript
乡镇办公室工作决心书
2014/03/11 职场文书
关于环保的建议书
2014/05/12 职场文书
高一新生军训方案
2014/05/12 职场文书
2014年网管工作总结
2014/12/11 职场文书
人事任命通知书
2015/04/21 职场文书
2015年度电厂个人工作总结
2015/05/13 职场文书
百年校庆宣传标语口号
2015/12/26 职场文书
汉语拼音教学反思
2016/02/22 职场文书
企业管理不到位检讨书
2019/06/27 职场文书
MYSQL优化之数据表碎片整理详解
2022/04/03 MySQL