利用python实现汉诺塔游戏


Posted in Python onMarch 01, 2021

本文实例为大家分享了python实现汉诺塔游戏的具体代码,供大家参考,具体内容如下

一.汉诺塔

汉诺塔问题是一个经典的递归问题,对于这个问题,我们可以把它简单的去看成是如何用n-1去表示n。
在A,B,C三个柱子上,我们先假设A柱上只有两个盘子,那么很简单,只需要把最上面的那个盘子移到B柱上,再把A柱上最下面的盘子移到C柱上,最后把B柱的盘子移到C柱就可以了。
假设我们有n个盘子,那么可以把最下面的盘子看成是第n个盘子,而我们要做的是把上面n-1个盘子移到B柱上,再把第n个盘子移到C柱。我们可以把B柱视为主中转站。
在将n-1个盘子移到B柱的过程中,我们需要借助C柱作为分中转站,当完成n-1个盘子的移动时,此时B柱上存在n-1个盘子,而我们接下来要做的,和之前类似,就是借助把n-2个盘子移动到A柱,把第n-1个盘子移动到C柱。在移动n-2个盘子到A柱时,我们同样要借助C作为分中转站。

二.实例代码

import turtle
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_3():#画出汉诺塔的poles
 t = turtle.Turtle()
 t.hideturtle()
 def drawpole_1(k):
  t.up()
  t.pensize(10)
  t.speed(100)
  t.goto(400*(k-1), 100)
  t.down()
  t.goto(400*(k-1), -100)
  t.goto(400*(k-1)-20, -100)
  t.goto(400*(k-1)+20, -100)
 drawpole_1(0)#画出汉诺塔的poles[0]
 drawpole_1(1)#画出汉诺塔的poles[1]
 drawpole_1(2)#画出汉诺塔的poles[2]
def creat_plates(n):#制造n个盘子
 plates=[turtle.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的栈
 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=turtle.Screen()
drawpole_3()
n=int(input("请输入汉诺塔的层数并回车:\n"))
plates=creat_plates(n)
poles=pole_stack()
for i in range(n):
 poles[0].push(i)
moveTower(plates,poles,n,0,2,1)
myscreen.exitonclick()

三.结果显示

1.首先,会显示出如下页面:

利用python实现汉诺塔游戏

因此,我们输入汉诺塔层数。

利用python实现汉诺塔游戏

2.turtle库演示结果

利用python实现汉诺塔游戏

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python类属性的延迟计算
Oct 22 Python
python+mongodb数据抓取详细介绍
Oct 25 Python
PyCharm在win10的64位系统安装实例
Nov 26 Python
python实现一组典型数据格式转换
Dec 15 Python
Python multiprocessing多进程原理与应用示例
Feb 28 Python
matplotlib命令与格式之tick坐标轴日期格式(设置日期主副刻度)
Aug 06 Python
Python基础之字符串操作常用函数集合
Feb 09 Python
Python进行特征提取的示例代码
Oct 15 Python
用python对oracle进行简单性能测试
Dec 05 Python
python os.rename实例用法详解
Dec 06 Python
python如何利用cv2模块读取显示保存图片
Jun 04 Python
python实现A*寻路算法
Jun 13 Python
python绘制汉诺塔
Mar 01 #Python
彻底解决pip下载pytorch慢的问题方法
Mar 01 #Python
Python 里最强的地图绘制神器
Mar 01 #Python
Python的collections模块真的很好用
Mar 01 #Python
Python  Asyncio模块实现的生产消费者模型的方法
Mar 01 #Python
Python创建自己的加密货币的示例
Mar 01 #Python
python 实现网易邮箱邮件阅读和删除的辅助小脚本
Mar 01 #Python
You might like
配置php.ini实现PHP文件上传功能
2014/11/27 PHP
php实现数据库的增删改查
2017/02/26 PHP
PHP实现的自定义图像居中裁剪函数示例【测试可用】
2017/08/11 PHP
PHP单元测试配置与使用方法详解
2019/12/27 PHP
jQuery 选择器详解
2015/01/19 Javascript
JavaScript中的普通函数与构造函数比较
2015/04/07 Javascript
Jquery幻灯片特效代码分享--打开页面随机选择切换方式(3)
2015/08/15 Javascript
Highcharts使用简例及异步动态读取数据
2015/12/30 Javascript
简单的分页代码js实现
2016/05/17 Javascript
微信小程序 引用其他js文件实现代码
2017/02/22 Javascript
react实现pure render时bind(this)隐患需注意!
2017/03/09 Javascript
Vue插件写、用详解(附demo)
2017/03/20 Javascript
JS去掉字符串中所有的逗号
2017/10/18 Javascript
js+canvas实现滑动拼图验证码功能
2018/03/26 Javascript
JS遍历DOM文档树的方法实例详解
2018/04/03 Javascript
React Hooks的深入理解与使用
2018/11/12 Javascript
JS为什么说async/await是generator的语法糖详解
2019/07/11 Javascript
Win7上搭建Cocos2d-x 3.1.1开发环境
2014/07/03 Python
Linux下将Python的Django项目部署到Apache服务器
2015/12/24 Python
python编程实现随机生成多个椭圆实例代码
2018/01/03 Python
Centos7 Python3下安装scrapy的详细步骤
2018/03/15 Python
Python通过cv2读取多个USB摄像头
2019/08/28 Python
Python turtle画图库&&画姓名实例
2020/01/19 Python
tensorflow ckpt模型和pb模型获取节点名称,及ckpt转pb模型实例
2020/01/21 Python
python 解决pycharm运行py文件只有unittest选项的问题
2020/09/01 Python
Python 实现集合Set的示例
2020/12/21 Python
python爬虫利用代理池更换IP的方法步骤
2021/02/21 Python
美国创意之家:BulbHead
2017/07/12 全球购物
EJB2和EJB3在架构上的不同点
2014/09/29 面试题
教师个人自我鉴定
2014/02/08 职场文书
护士长2014年度工作总结
2014/11/11 职场文书
董事长年会致辞
2015/07/29 职场文书
土木工程生产实习心得体会
2016/01/22 职场文书
决心书格式及范文
2019/06/24 职场文书
创业计划书之小型广告公司
2019/10/22 职场文书
vue中 this.$set的使用详解
2021/11/17 Vue.js