利用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 实现插入排序算法
Jun 05 Python
Python编码爬坑指南(必看)
Jun 10 Python
Python正规则表达式学习指南
Aug 02 Python
对python字典过滤条件的实例详解
Jan 22 Python
Django高级编程之自定义Field实现多语言
Jul 02 Python
python二分法查找算法实现方法【递归与非递归】
Dec 06 Python
Python编程快速上手——PDF文件操作案例分析
Feb 28 Python
django中url映射规则和服务端响应顺序的实现
Apr 02 Python
装上这 14 个插件后,PyCharm 真的是无敌的存在
Jan 11 Python
Python pandas读取CSV文件的注意事项(适合新手)
Jun 20 Python
手把手教你实现PyTorch的MNIST数据集
Jun 28 Python
PYTHON InceptionV3模型的复现详解
May 06 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实现通过正则表达式替换回调的内容标签
2015/06/15 PHP
Extjs学习笔记之七 布局
2010/01/08 Javascript
jquery 学习之二 属性(类)
2010/11/25 Javascript
js change,propertychange,input事件小议
2011/12/20 Javascript
jquery live()重复绑定的解决方法介绍
2014/01/03 Javascript
JS中判断字符串中出现次数最多的字符及出现的次数的简单实例
2016/06/03 Javascript
json实现添加、遍历与删除属性的方法
2016/06/17 Javascript
jquery css实现邮箱自动补全
2016/11/14 Javascript
js微信支付实现代码
2016/12/22 Javascript
jquery仿京东侧边栏导航效果
2017/03/02 Javascript
vue2的todolist入门小项目的详细解析
2017/05/11 Javascript
基于angular实现三级联动的生日插件
2017/05/12 Javascript
几种响应式文字详解
2017/05/19 Javascript
vue快捷键与基础指令详解
2017/06/01 Javascript
vue2.0中vue-cli实现全选、单选计算总价格的实例代码
2017/07/18 Javascript
详解SPA中前端路由基本原理与实现方式
2018/09/12 Javascript
JavaScript设计模式之责任链模式实例分析
2019/01/16 Javascript
vue实现自定义H5视频播放器的方法步骤
2019/07/01 Javascript
JS实现可用滑块滑动的缓动图代码
2019/09/01 Javascript
Vue解决移动端弹窗滚动穿透问题
2020/12/15 Vue.js
[59:30]完美世界DOTA2联赛PWL S3 access vs LBZS 第二场 12.20
2020/12/23 DOTA
Python实现调度算法代码详解
2017/12/01 Python
替换python字典中的key值方法
2018/07/06 Python
Python的iOS自动化打包实例代码
2018/11/22 Python
python爬虫获取新浪新闻教学
2018/12/23 Python
Python3 Post登录并且保存cookie登录其他页面的方法
2018/12/28 Python
python装饰器练习题及答案
2019/11/01 Python
Python并发concurrent.futures和asyncio实例
2020/05/04 Python
详解Python openpyxl库的基本应用
2021/02/26 Python
python源文件的字符编码知识点详解
2021/03/04 Python
智利最大的网上商店:Linio智利
2016/11/24 全球购物
葡萄牙鞋子品牌:Fair
2016/12/10 全球购物
亚历山大·王官网:Alexander Wang
2017/06/23 全球购物
意大利和国际奢侈品牌购物网站:Suitnegozi.com
2021/01/15 全球购物
高二美术教学反思
2014/01/14 职场文书
清洁工个人工作总结
2015/03/05 职场文书