利用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 08 Python
Python中在脚本中引用其他文件函数的实现方法
Jun 23 Python
基于python进行桶排序与基数排序的总结
May 29 Python
python实现根据指定字符截取对应的行的内容方法
Oct 23 Python
浅谈Python中eval的强大与危害
Mar 13 Python
在PYQT5中QscrollArea(滚动条)的使用方法
Jun 14 Python
Python 200行代码实现一个滑动验证码过程详解
Jul 11 Python
python3使用GUI统计代码量
Sep 18 Python
python实现密码验证合格程序的思路详解
Jun 01 Python
Tensorflow之MNIST CNN实现并保存、加载模型
Jun 17 Python
详解python的super()的作用和原理
Oct 29 Python
Python性能测试工具Locust安装及使用
Dec 01 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 - Html Transfer Code
2006/10/09 PHP
php实现屏蔽掉黑帽SEO的搜索关键字
2015/04/15 PHP
深入剖析PHP中printf()函数格式化使用
2016/05/23 PHP
php检查函数必传参数是否存在的实例详解
2017/08/28 PHP
JavaScript String.replace函数参数实例说明
2013/06/06 Javascript
JS简单实现元素复制示例附图
2013/11/19 Javascript
完美兼容各大浏览器的jQuery仿新浪图文淡入淡出间歇滚动特效
2014/11/12 Javascript
Javascript毫秒数用法实例
2015/02/05 Javascript
详解JavaScript中的表单验证
2015/06/16 Javascript
浅谈jquery中delegate()与live()
2015/06/22 Javascript
深入研究jQuery图片懒加载 lazyload.js使用方法
2017/08/16 jQuery
Vue中组件之间数据的传递的示例代码
2017/09/08 Javascript
Angular入口组件(entry component)与声明式组件的区别详解
2018/04/09 Javascript
深入学习JavaScript中的bom
2019/05/27 Javascript
react koa rematch 如何打造一套服务端渲染架子
2019/06/26 Javascript
细说webpack6 Babel的使用详解
2019/09/26 Javascript
微信小程序点击view动态添加样式过程解析
2020/01/21 Javascript
JS前端面试必备——基本排序算法原理与实现方法详解【插入/选择/归并/冒泡/快速排序】
2020/02/24 Javascript
Javascript查看大图功能代码实现
2020/05/07 Javascript
JavaScript 中判断变量是否为数字的示例代码
2020/10/22 Javascript
举例详解Python中threading模块的几个常用方法
2015/06/18 Python
对Python的多进程锁的使用方法详解
2019/02/18 Python
pycharm编写spark程序,导入pyspark包的3中实现方法
2019/08/02 Python
python3读取csv文件任意行列代码实例
2020/01/13 Python
Django高并发负载均衡实现原理详解
2020/04/04 Python
Python命名空间及作用域原理实例解析
2020/08/12 Python
Python析构函数__del__定义原理解析
2020/11/20 Python
英国在线珠宝店:The Jewel Hut
2017/03/20 全球购物
iPad和Surface Pro蓝牙键盘:Brydge
2018/11/10 全球购物
Zavvi西班牙:电子游戏、极客服装、Blu-ray、Funko Pop等
2019/05/03 全球购物
人力资源专业推荐信
2013/11/29 职场文书
和平主题的演讲稿
2014/01/12 职场文书
五年级英语教学反思
2014/01/31 职场文书
记账会计岗位职责
2014/06/16 职场文书
基层党员对照检查材料
2014/08/25 职场文书
领导干部作风整顿个人剖析材料
2014/10/11 职场文书