利用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之正规地说一句话
Sep 28 Python
用Python实现一个简单的能够发送带附件的邮件程序的教程
Apr 08 Python
python比较两个列表是否相等的方法
Jul 28 Python
Python的socket模块源码中的一些实现要点分析
Jun 06 Python
python利用高阶函数实现剪枝函数
Mar 20 Python
python 递归深度优先搜索与广度优先搜索算法模拟实现
Oct 22 Python
Python小工具之消耗系统指定大小内存的方法
Dec 03 Python
详解pandas.DataFrame中删除包涵特定字符串所在的行
Apr 04 Python
Python使用sklearn库实现的各种分类算法简单应用小结
Jul 04 Python
python 怎样将dataframe中的字符串日期转化为日期的方法
Sep 26 Python
Python之Numpy的超实用基础详细教程
Oct 23 Python
如何将你的应用迁移到Python3的三个步骤
Dec 22 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动态变静态原理
2006/11/25 PHP
Zend studio for eclipse中使php可以调用mysql相关函数的设置方法
2008/10/13 PHP
封装一个PDO数据库操作类代码
2009/09/09 PHP
php实现zip压缩文件解压缩代码分享(简单易懂)
2014/05/10 PHP
php 批量添加多行文本框textarea一行一个
2014/06/03 PHP
Laravel框架之解决前端显示图片问题
2019/10/24 PHP
dwz 如何去掉ajaxloading具体代码
2013/05/22 Javascript
兼容主流浏览器的jQuery+CSS 实现遮罩层的简单代码
2014/10/14 Javascript
javascript将数字转换整数金额大写的方法
2015/01/27 Javascript
JS实现控制表格行内容垂直对齐的方法
2015/03/30 Javascript
jquery图片切换实例分析
2015/04/15 Javascript
XML文件转化成NSData对象的方法
2015/08/12 Javascript
javascript实现不同颜色Tab标签切换效果
2016/04/27 Javascript
js实现文字列表无缝滚动效果
2017/06/23 Javascript
详解JS中的柯里化(currying)
2017/08/17 Javascript
理解javascript async的用法
2017/08/22 Javascript
ReactNative 之FlatList使用及踩坑封装总结
2017/11/29 Javascript
vue数组对象排序的实现代码
2018/06/20 Javascript
JS计算两个数组的交集、差集、并集、补集(多种实现方式)
2019/05/21 Javascript
[01:08]2014DOTA2展望TI 剑指西雅图LGD战队专访
2014/06/30 DOTA
python套接字流重定向实例汇总
2016/03/03 Python
Python进阶-函数默认参数(详解)
2017/05/18 Python
python操作MySQL 模拟简单银行转账操作
2017/09/27 Python
Python中Numpy mat的使用详解
2019/05/24 Python
Jacobi迭代算法的Python实现详解
2019/06/29 Python
彻底搞懂 python 中文乱码问题(深入分析)
2020/02/28 Python
美国转售二手商品的电子商务平台:BLINQ
2018/12/13 全球购物
Silk Therapeutics官网:清洁、抗衰老护肤品
2020/08/12 全球购物
高中生家长寄语大全
2014/04/03 职场文书
机关搬迁方案
2014/05/18 职场文书
2014年领班工作总结
2014/11/25 职场文书
2014年社区民政工作总结
2014/12/02 职场文书
2015年十月一日放假通知
2015/08/18 职场文书
护士业务学习心得体会
2016/01/25 职场文书
简述Java中throw-throws异常抛出
2021/08/07 Java/Android
python实现简单的三子棋游戏
2022/04/28 Python