利用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 相关文章推荐
PHP魔术方法__ISSET、__UNSET使用实例
Nov 25 Python
分享一个常用的Python模拟登陆类
Mar 29 Python
Django后端接收嵌套Json数据及解析详解
Jul 17 Python
python计算n的阶乘的方法代码
Oct 25 Python
python使用HTMLTestRunner导出饼图分析报告的方法
Dec 30 Python
pytorch forward两个参数实例
Jan 17 Python
给Python学习者的文件读写指南(含基础与进阶)
Jan 29 Python
使用python采集Excel表中某一格数据
May 14 Python
Python Serial串口基本操作(收发数据)
Nov 06 Python
python 通过exifread读取照片信息
Dec 24 Python
python使用pygame创建精灵Sprite
Apr 06 Python
Python使用Opencv打开笔记本电脑摄像头报错解问题及解决
Jun 21 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
修改Zend引擎实现PHP源码加密的原理及实践
2008/04/14 PHP
使用PHP socke 向指定页面提交数据
2008/07/23 PHP
用js进行url编码后用php反解以及用php实现js的escape功能函数总结
2010/02/08 PHP
关于PHP定时发送服务的解决办法
2017/04/23 PHP
PHP大文件切割上传并带进度条功能示例
2019/07/01 PHP
支持ie与FireFox的剪切板操作代码
2009/09/28 Javascript
PHP 与 js的通信(via ajax,json)
2010/11/16 Javascript
自己实现ajax封装示例分享
2014/04/01 Javascript
详解JavaScript中的Unescape()和String() 函数
2015/11/09 Javascript
基于jQuery Tipso插件实现消息提示框特效
2016/03/16 Javascript
AngularJS入门教程之更多模板详解
2016/08/19 Javascript
JavaScript字符串对象(string)基本用法示例
2017/01/18 Javascript
javascript 中的try catch应用总结
2017/04/01 Javascript
微信扫码支付零云插件版实例详解
2017/04/26 Javascript
AngularJS实现自定义指令与控制器数据交互的方法示例
2017/06/19 Javascript
Vue实现双向绑定的原理以及响应式数据的方法
2018/07/02 Javascript
[03:06]2018年度CS GO最具人气解说-完美盛典
2018/12/16 DOTA
Python实现登录人人网并抓取新鲜事的方法
2015/05/11 Python
Python2.x与Python3.x的区别
2016/01/14 Python
详解Python中的array数组模块相关使用
2016/07/05 Python
python 中的int()函数怎么用
2017/10/17 Python
python编程嵌套函数实例代码
2018/02/11 Python
总结python中pass的作用
2019/02/27 Python
基于Python的图像数据增强Data Augmentation解析
2019/08/13 Python
python tkinter基本属性详解
2019/09/16 Python
Python语言异常处理测试过程解析
2020/01/08 Python
Python中猜拳游戏与猜筛子游戏的实现方法
2020/09/04 Python
详解Canvas 跨域脱坑实践
2018/11/07 HTML / CSS
JAVA和C++区别都有哪些
2015/03/30 面试题
上级检查欢迎词
2014/01/18 职场文书
消防安全检查制度
2014/02/04 职场文书
老人祝寿主持词
2014/03/28 职场文书
纪念九一八事变演讲稿:牢记九一八,屈辱怎能忘
2014/09/14 职场文书
2015年计算机教学工作总结
2015/07/22 职场文书
Python实现打乒乓小游戏
2021/09/25 Python
python数据处理之Pandas类型转换
2022/04/28 Python