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实现爬取千万淘宝商品的方法
Jun 30 Python
python数据类型判断type与isinstance的区别实例解析
Oct 31 Python
tensorflow实现逻辑回归模型
Sep 08 Python
Python 使用Numpy对矩阵进行转置的方法
Jan 28 Python
如何用C代码给Python写扩展库(Cython)
May 17 Python
python实现在函数中修改变量值的方法
Jul 16 Python
Python解析json时提示“string indices must be integers”问题解决方法
Jul 31 Python
Pandas 缺失数据处理的实现
Nov 04 Python
python3实现往mysql中插入datetime类型的数据
Mar 02 Python
python检查目录文件权限并修改目录文件权限的操作
Mar 11 Python
Python如何执行精确的浮点数运算
Jul 31 Python
PyCharm中关于安装第三方包的三个建议
Sep 17 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 冒泡排序 交换排序法
2011/05/10 PHP
php插入中文到sqlserver 2008里出现乱码的解决办法分享
2012/07/19 PHP
PHP7 foreach() 函数修改
2021/03/09 PHP
js substr、substring和slice使用说明小记
2011/09/15 Javascript
js实现在页面上弹出蒙板技巧简单实用
2013/04/16 Javascript
JS对象转换为Jquery对象示例
2014/01/26 Javascript
js实现二代身份证号码验证详解
2014/11/20 Javascript
JavaScript中toString()方法的使用详解
2015/06/05 Javascript
浅谈node.js中async异步编程
2015/10/22 Javascript
jquery实现简单的表单验证
2015/11/17 Javascript
jQuery+CSS实现一个侧滑导航菜单代码
2016/05/09 Javascript
easyui messager alert 三秒后自动关闭提示的实例
2016/11/07 Javascript
利用iscroll4实现轮播图效果实例代码
2017/01/11 Javascript
vue之数据交互实例代码
2017/06/20 Javascript
小程序实现左滑删除功能
2018/10/30 Javascript
微信打开网址添加在浏览器中打开提示的办法
2019/05/20 Javascript
Vue 3自定义指令开发的相关总结
2021/01/29 Vue.js
基于python编写的微博应用
2014/10/17 Python
Python读取excel指定列生成指定sql脚本的方法
2018/11/28 Python
pytorch使用Variable实现线性回归
2019/05/21 Python
django多个APP的urls设置方法(views重复问题解决)
2019/07/19 Python
pytorch 模型可视化的例子
2019/08/17 Python
css3实现的多级渐变下拉菜单导航效果代码
2015/08/31 HTML / CSS
AmazeUI底部导航栏与分享按钮的示例代码
2020/08/18 HTML / CSS
很酷的小工具和电子产品商城:GearBest
2016/11/19 全球购物
俄罗斯马克西多姆家居用品网上商店:Максидом
2020/02/06 全球购物
JDO的含义
2012/11/17 面试题
旅游业大学生创业计划书
2014/01/31 职场文书
大学军训感言1000字
2014/02/25 职场文书
募捐倡议书怎么写
2014/05/14 职场文书
工资收入证明样本(5篇)
2014/09/16 职场文书
2014政府领导班子对照检查材料思想汇报(3篇)
2014/09/26 职场文书
Java中PriorityQueue实现最小堆和最大堆的用法
2021/06/27 Java/Android
mongodb的安装和开机自启动详细讲解
2021/08/02 MongoDB
Javascript设计模式之原型模式详细
2021/10/05 Javascript
Redis keys命令的具体使用
2022/06/05 Redis