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 Django连接MySQL数据库做增删改查
Nov 07 Python
使用python编写批量卸载手机中安装的android应用脚本
Jul 21 Python
python中字典dict常用操作方法实例总结
Apr 04 Python
在Python中执行系统命令的方法示例详解
Sep 14 Python
Python绘制正余弦函数图像的方法
Aug 28 Python
python3.4爬虫demo
Jan 22 Python
为何人工智能(AI)首选Python?读完这篇文章你就知道了(推荐)
Apr 06 Python
详解Python绘图Turtle库
Oct 12 Python
PyQt5如何将.ui文件转换为.py文件的实例代码
May 26 Python
Matplotlib.pyplot 三维绘图的实现示例
Jul 28 Python
教你怎么用Python实现多路径迷宫
Apr 29 Python
matlab xlabel位置的设置方式
May 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的memcached客户端memcached
2011/06/14 PHP
php接口与接口引用的深入解析
2013/08/09 PHP
9个经典的PHP代码片段分享
2014/12/18 PHP
PHP实现中文圆形印章特效
2015/06/19 PHP
py文件转exe时包含paramiko模块出错解决方法
2016/08/12 PHP
PHP 常用时间函数资料整理
2016/10/22 PHP
jquery ajax实现下拉框三级无刷新联动,且保存保持选中值状态
2013/10/29 Javascript
将list转换为json失败的原因
2013/12/17 Javascript
基于jQuery实现文本框缩放以及上下移动功能
2014/11/24 Javascript
javascript中call,apply,bind函数用法示例
2016/12/19 Javascript
js实现简单的获取验证码按钮效果
2017/03/03 Javascript
原生JS实现图片懒加载(lazyload)实例
2017/06/13 Javascript
JS中使用textPath实现线条上的文字
2017/12/25 Javascript
JS实现的邮箱提示补全效果示例
2018/01/30 Javascript
JavaScript实现获取select下拉框中第一个值的方法
2018/02/06 Javascript
nodeJs实现基于连接池连接mysql的方法示例
2018/02/10 NodeJs
layui获取多选框中的值方法
2018/08/15 Javascript
解决vuecli3.0热更新失效的问题
2018/09/19 Javascript
Vue 页面状态保持页面间数据传输的一种方法(推荐)
2018/11/01 Javascript
vue循环数组改变点击文字的颜色
2019/10/14 Javascript
JavaScript使用百度ECharts插件绘制饼图操作示例
2019/11/26 Javascript
Python随机生成手机号、数字的方法详解
2017/07/21 Python
Python+OpenCV感兴趣区域ROI提取方法
2019/01/10 Python
jupyter notebook 多行输出实例
2020/04/09 Python
sklearn和keras的数据切分与交叉验证的实例详解
2020/06/19 Python
html2canvas生成的图片偏移不完整的解决方法
2020/05/19 HTML / CSS
美国知名户外用品畅销中心:Sierra Trading Post
2016/07/19 全球购物
财务会计专业个人求职信范本
2014/01/08 职场文书
《蚂蚁和蝈蝈》教学反思
2014/02/24 职场文书
学雷锋月活动总结
2014/04/25 职场文书
八一建军节演讲稿
2014/09/10 职场文书
2014年宣传工作总结
2014/11/18 职场文书
培训学校2015年度工作总结
2015/07/20 职场文书
2016廉洁从业学习心得体会
2016/01/19 职场文书
写作技巧:怎样写好一份优秀工作总结?
2019/08/14 职场文书
SQL Server 忘记密码以及重新添加新账号
2022/04/26 SQL Server