利用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程序员鲜为人知但你应该知道的17个问题
Jun 04 Python
Python使用htpasswd实现基本认证授权的例子
Jun 10 Python
Python学习小技巧之列表项的拼接
May 20 Python
python itchat实现微信好友头像拼接图的示例代码
Aug 14 Python
Tensorflow 利用tf.contrib.learn建立输入函数的方法
Feb 08 Python
详解安装mitmproxy以及遇到的坑和简单用法
Jan 21 Python
Python日期时间Time模块实例详解
Apr 15 Python
python 对字典按照value进行排序的方法
May 09 Python
详细整理python 字符串(str)与列表(list)以及数组(array)之间的转换方法
Aug 30 Python
详解Python3 pickle模块用法
Sep 16 Python
如何基于Python实现自动扫雷
Jan 06 Python
Python常用类型转换实现代码实例
Jul 28 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生成二维码不保存服务器还有下载功能的实现代码
2018/08/09 PHP
PHP+百度AI OCR文字识别实现了图片的文字识别功能
2019/05/08 PHP
script标签的 charset 属性使用说明
2010/12/04 Javascript
javascript伸缩菜单栏实现代码分享
2015/11/12 Javascript
javaScript事件学习小结(四)event的公共成员(属性和方法)
2016/06/09 Javascript
浅谈window.onbeforeunload() 事件调用ajax
2016/06/29 Javascript
js中小数向上取整数,向下取整数,四舍五入取整数的实现(必看篇)
2017/02/13 Javascript
基于Bootstrap漂亮简洁的CSS3价格表(附源码下载)
2017/02/28 Javascript
js学习心得_一个简单的动画库封装tween.js
2017/07/14 Javascript
angular4 如何在全局设置路由跳转动画的方法
2017/08/30 Javascript
swiper动态改变滑动内容的实现方法
2018/01/17 Javascript
JS实现碰撞检测的方法分析
2018/01/19 Javascript
Django+vue跨域问题解决的详细步骤
2019/01/20 Javascript
vue样式穿透 ::v-deep的具体使用
2020/06/04 Javascript
vue中移动端调取本地的复制的文本方式
2020/07/18 Javascript
python根据开头和结尾字符串获取中间字符串的方法
2015/03/26 Python
Anaconda多环境多版本python配置操作方法
2017/09/12 Python
Python数据结构与算法之列表(链表,linked list)简单实现
2017/10/30 Python
python基础之包的导入和__init__.py的介绍
2018/01/08 Python
python3+PyQt5重新实现QT事件处理程序
2018/04/19 Python
python发送邮件脚本
2018/05/22 Python
如何利用Python开发一个简单的猜数字游戏
2019/09/22 Python
基于Python实现ComicReaper漫画自动爬取脚本过程解析
2019/11/11 Python
Python turtle库绘制菱形的3种方式小结
2019/11/23 Python
Python如何输出警告信息
2020/07/30 Python
中国专业的综合网上购物商城:京东
2016/08/02 全球购物
新西兰珠宝品牌:Michael Hill
2017/09/16 全球购物
事业单位请假制度
2014/01/13 职场文书
酒店员工职业生涯规划
2014/02/25 职场文书
求职自我评价范文100字
2014/09/23 职场文书
初中家长评语和期望
2014/12/26 职场文书
父亲节寄语大全
2015/02/27 职场文书
2015年惩防体系建设工作总结
2015/05/22 职场文书
大学三好学生主要事迹范文
2015/11/03 职场文书
python urllib库的使用详解
2021/04/13 Python
Python list列表删除元素的4种方法
2021/11/01 Python