利用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编程实现微信企业号文本消息推送功能示例
Aug 21 Python
Python2实现的LED大数字显示效果示例
Sep 04 Python
浅谈python for循环的巧妙运用(迭代、列表生成式)
Sep 26 Python
Python使用functools实现注解同步方法
Feb 06 Python
python抓取搜狗微信公众号文章
Apr 01 Python
Python下opencv图像阈值处理的使用笔记
Aug 04 Python
python通过robert、sobel、Laplace算子实现图像边缘提取详解
Aug 21 Python
python中open函数的基本用法示例
Sep 07 Python
详解python 中in 的 用法
Dec 12 Python
PyTorch安装与基本使用详解
Aug 31 Python
使用python库xlsxwriter库来输出各种xlsx文件的示例
Sep 01 Python
Python爬虫基础讲解之请求
May 13 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 变量类型的强制转换
2009/10/23 PHP
在PHP中使用FastCGI解析漏洞及修复方案
2015/11/10 PHP
JavaScript 学习笔记(十三)Dom创建表格
2010/01/21 Javascript
围观tangram js库
2010/12/28 Javascript
javascript 实现子父窗体互相传值的简单实例
2014/02/17 Javascript
jQuery拖拽插件gridster使用指南
2015/04/21 Javascript
jQuery插件bgStretcher.js实现全屏背景特效
2015/06/05 Javascript
关于js里的this关键字的理解
2015/08/17 Javascript
jquery获取easyui日期控件的值实现方法
2016/11/09 Javascript
详解如何让InstantClick兼容MathJax、百度统计等
2017/09/12 Javascript
基于Vue+element-ui 的Table二次封装的实现
2018/07/20 Javascript
[01:03:00]DOTA2上海特级锦标赛A组败者赛 EHOME VS CDEC第一局
2016/02/25 DOTA
对python中for、if、while的区别与比较方法
2018/06/25 Python
python调用java的jar包方法
2018/12/15 Python
利用anaconda保证64位和32位的python共存
2021/03/09 Python
python 函数中的内置函数及用法详解
2019/07/02 Python
快速查找Python安装路径方法
2020/02/06 Python
Keras 使用 Lambda层详解
2020/06/10 Python
详解Python设计模式之策略模式
2020/06/15 Python
Python的轻量级ORM框架peewee使用教程
2021/02/05 Python
详解使用scrapy进行模拟登陆三种方式
2021/02/21 Python
一份全面的PHP面试问题考卷
2012/07/15 面试题
警察思想汇报
2014/01/04 职场文书
生日派对邀请函
2014/01/13 职场文书
优秀团员个人事迹材料
2014/01/29 职场文书
幼儿园数学教学反思
2014/02/02 职场文书
国际贸易专业个人求职信格式
2014/02/02 职场文书
聚美优品的广告词
2014/03/14 职场文书
银行内勤岗位职责
2014/04/09 职场文书
机电专业求职信
2014/06/14 职场文书
哈姆雷特读书笔记
2015/06/29 职场文书
2015暑期社会实践通讯稿
2015/07/18 职场文书
2016年员工年度考核评语
2015/12/02 职场文书
python中urllib包的网络请求教程
2022/04/19 Python
python通过新建环境安装tfx的问题
2022/05/20 Python
Win10玩csgo闪退如何解决?Win10玩csgo闪退的解决方法
2022/07/23 数码科技