利用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中尾递归用法实例详解
Apr 28 Python
python嵌套函数使用外部函数变量的方法(Python2和Python3)
Jan 31 Python
Python中json格式数据的编码与解码方法详解
Jul 01 Python
python获取当前目录路径和上级路径的实例
Apr 26 Python
python中强大的format函数实例详解
Dec 05 Python
Python Matplotlib库安装与基本作图示例
Jan 09 Python
在python中画正态分布图像的实例
Jul 08 Python
python实现FTP文件传输的方法(服务器端和客户端)
Mar 20 Python
什么是Python中的顺序表
Jun 02 Python
Python 如何展开嵌套的序列
Aug 01 Python
python 中关于pycharm选择运行环境的问题
Oct 31 Python
python3字符串输出常见面试题总结
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
ThinkPHP的常用配置选项汇总
2016/03/24 PHP
利用php输出不同的心形图案
2016/04/22 PHP
PHP之十六个魔术方法详细介绍
2016/11/01 PHP
PHP判断密码强度的方法详解
2017/05/26 PHP
js自动查找select下拉的菜单并选择(示例代码)
2014/02/26 Javascript
jquery form表单序列化为对象的示例代码
2014/03/05 Javascript
一个简单的全屏图片上下打开显示网页效果示例
2014/07/08 Javascript
JavaScript中常用的六种互动方法示例
2015/03/13 Javascript
轻量级javascript 框架Backbone使用指南
2015/07/24 Javascript
js如何实现点击标签文字,文字在文本框出现
2015/08/05 Javascript
直接拿来用的15个jQuery代码片段
2015/09/23 Javascript
通过js获取上传的图片信息(临时保存路径,名称,大小)然后通过ajax传递给后端的方法
2015/10/01 Javascript
JavaScript仿微信打飞机游戏
2020/07/05 Javascript
使用JS实现导航切换时高亮显示的示例讲解
2018/08/22 Javascript
Node.js + express实现上传大文件的方法分析【图片、文本文件】
2019/03/14 Javascript
Vue引入Stylus知识点总结
2020/01/16 Javascript
node.JS二进制操作模块buffer对象使用方法详解
2020/02/06 Javascript
[02:28]DOTA2亚洲邀请赛 LGD战队巡礼
2015/02/03 DOTA
[03:55]2016国际邀请赛中国区预选赛首日TOP10精彩集锦
2016/06/27 DOTA
pyqt4教程之实现windows窗口小示例分享
2014/03/07 Python
Python实现字典的key和values的交换
2015/08/04 Python
python 爬虫出现403禁止访问错误详解
2017/03/11 Python
Python实现的密码强度检测器示例
2017/08/23 Python
浅谈Python对内存的使用(深浅拷贝)
2018/01/17 Python
pycharm 将django中多个app放到同个文件夹apps的处理方法
2018/05/30 Python
Python 单元测试(unittest)的使用小结
2018/11/14 Python
python批量修改交换机密码的示例
2020/09/22 Python
公益广告语集锦
2014/03/13 职场文书
优秀护士演讲稿
2014/04/30 职场文书
2014教师研修学习体会
2014/07/08 职场文书
企业法人代表证明书
2014/09/27 职场文书
银行给客户的感谢信
2015/01/23 职场文书
新娘婚礼致辞
2015/07/27 职场文书
新党员入党决心书
2015/09/22 职场文书
redis使用不当导致应用卡死bug的过程解析
2021/07/01 Redis
php去除deprecated的实例方法
2021/11/17 PHP