利用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 相关文章推荐
使用django-suit为django 1.7 admin后台添加模板
Nov 18 Python
浅谈Python实现2种文件复制的方法
Jan 19 Python
对django中render()与render_to_response()的区别详解
Oct 16 Python
Django生成PDF文档显示在网页上以及解决PDF中文显示乱码的问题
Jul 04 Python
Django shell调试models输出的SQL语句方法
Aug 29 Python
TensorFlow 输出checkpoint 中的变量名与变量值方式
Feb 11 Python
Python3创建Django项目的几种方法(3种)
Jun 03 Python
Python devel安装失败问题解决方案
Jun 09 Python
python中实现栈的三种方法
Dec 19 Python
用python制作个音乐下载器
Jan 30 Python
Python WSGI 规范简介
Apr 11 Python
python flask框架快速入门
May 14 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
全国FM电台频率大全 - 17 湖北省
2020/03/11 无线电
PHP中通过HTTP_USER_AGENT判断是否为手机移动终端的函数代码
2013/02/14 PHP
php检测网页是否被百度收录的函数代码
2013/10/09 PHP
php获取随机数组列表的方法
2014/11/13 PHP
thinkphp实现分页显示功能
2016/12/03 PHP
PHP命令Command模式用法实例分析
2018/08/08 PHP
javascript 得到文件后缀名的思路及实现
2020/05/09 Javascript
JS和Jquery获取和修改label的值的示例代码
2014/01/15 Javascript
JavaScript常用脚本汇总(二)
2015/03/04 Javascript
jQuery实现新消息闪烁标题提示的方法
2015/03/11 Javascript
JavaScript转换二进制编码为ASCII码的方法
2015/04/16 Javascript
jQuery ui实现动感的圆角渐变网站导航菜单效果代码
2015/08/26 Javascript
基于jQuery实现鼠标点击导航菜单水波动画效果附源码下载
2016/01/06 Javascript
jQuery动画效果图片轮播特效
2016/01/12 Javascript
jQuery头像裁剪工具jcrop用法实例(附演示与demo源码下载)
2016/01/22 Javascript
特殊日期提示功能的实现方法
2016/06/16 Javascript
Vue自定义指令使用方法详解
2017/08/21 Javascript
js截取字符串功能的实现方法
2017/09/27 Javascript
Jquery Datatables的使用详解
2020/01/30 jQuery
Django1.3添加app提示模块不存在的解决方法
2014/08/26 Python
简洁的十分钟Python入门教程
2015/04/03 Python
使用Python脚本操作MongoDB的教程
2015/04/16 Python
Python functools模块学习总结
2015/05/09 Python
在Python中使用zlib模块进行数据压缩的教程
2015/06/26 Python
一篇文章快速了解Python的GIL
2018/01/12 Python
Django使用AJAX调用自己写的API接口的方法
2019/03/06 Python
selenium跳过webdriver检测并模拟登录淘宝
2019/06/12 Python
Python 找出英文单词列表(list)中最长单词链
2020/12/14 Python
巴西最大的家电和百货零售商:Casas Bahia
2016/11/22 全球购物
英国家具、照明、家居用品网上商店:Wayfair.co.uk
2020/02/13 全球购物
Linux内核产生并发的原因
2012/07/13 面试题
实习生单位鉴定意见
2013/12/04 职场文书
大学生两会学习心得体会
2014/03/10 职场文书
开展党的群众路线教育实践活动情况汇报
2014/11/05 职场文书
2016年三严三实党课学习心得体会
2016/01/06 职场文书
springboot集成flyway自动创表的详细配置
2021/06/26 Java/Android