利用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 集合(set)类型的操作——并交差
Jun 30 Python
Python+matplotlib实现计算两个信号的交叉谱密度实例
Jan 08 Python
Python多线程扫描端口代码示例
Feb 09 Python
python使用xslt提取网页数据的方法
Feb 23 Python
python实现反转部分单向链表
Sep 27 Python
Python面向对象基础入门之设置对象属性
Dec 11 Python
python 与服务器的共享文件夹交互方法
Dec 27 Python
Python实现蒙特卡洛算法小实验过程详解
Jul 12 Python
Python 操作mysql数据库查询之fetchone(), fetchmany(), fetchall()用法示例
Oct 17 Python
解决python使用list()时总是报错的问题
May 05 Python
Python接收手机短信的代码整理
Aug 02 Python
Python Django / Flask如何使用Elasticsearch
Apr 19 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 checkdate、getdate等日期时间函数操作详解
2010/03/11 PHP
php中$_REQUEST、$_POST、$_GET的区别和联系小结
2011/11/23 PHP
使用 PHPStorm 开发 Laravel
2015/03/24 PHP
thinkPHP模型初始化实例分析
2015/12/03 PHP
JavaScript 设计模式学习 Factory
2009/07/29 Javascript
javascript中substr,substring,slice.splice的区别说明
2010/11/25 Javascript
实用的Jquery选项卡TAB示例代码
2013/08/28 Javascript
新增加的内容是如何将div的scrollbar自动移动最下面
2014/01/02 Javascript
JavaScript实现简单图片滚动附源码下载
2014/06/17 Javascript
JavaScript设置表单上传时文件个数的方法
2015/08/11 Javascript
浅谈Node.js轻量级Web框架Express4.x使用指南
2017/05/03 Javascript
AngularJS实现进度条功能示例
2017/07/05 Javascript
基于vue的换肤功能的示例代码
2017/10/10 Javascript
使用js实现将后台传入的json数据放在前台显示
2018/08/06 Javascript
详解关于微信setData回调函数中的坑
2019/02/18 Javascript
js瀑布流布局的实现
2020/06/28 Javascript
js实现车辆管理系统
2020/08/26 Javascript
Python使用htpasswd实现基本认证授权的例子
2014/06/10 Python
python进阶教程之词典、字典、dict
2014/08/29 Python
玩转python爬虫之爬取糗事百科段子
2016/02/17 Python
Python基于二分查找实现求整数平方根的方法
2016/05/12 Python
Python实现的微信公众号群发图片与文本消息功能实例详解
2017/06/30 Python
python登录并爬取淘宝信息代码示例
2017/12/09 Python
Python中Proxypool库的安装与配置
2018/10/19 Python
Python I/O与进程的详细讲解
2019/03/08 Python
Python实现的微信红包提醒功能示例
2019/08/22 Python
python实现文件的分割与合并
2019/08/29 Python
python 字典有序并写入json文件过程解析
2019/09/30 Python
详解tf.device()指定tensorflow运行的GPU或CPU设备实现
2021/02/20 Python
巴西网上药房:onofre
2016/11/21 全球购物
审计工作个人的自我评价
2013/12/25 职场文书
歌唱比赛主持词
2014/03/18 职场文书
财务出纳岗位职责
2015/03/31 职场文书
负责培养人意见
2015/06/05 职场文书
公司客户答谢酒会祝酒词
2015/08/11 职场文书
浅谈Redis存储数据类型及存取值方法
2021/05/08 Redis