详解python百行有效代码实现汉诺塔小游戏(简约版)


Posted in Python onOctober 30, 2020

直接上代码:

#左中右塔用一个列表存储
left = list()
center = list()
right = list()
"""
初始化函数
"""
def init():
  size = input("(请友善输入整数,未写判断!)请输入层数:")
  #初始化塔列表,如5层 左边塔放 1-3-5-7-9,中间和右边放5个-1
  for i in range(1,int(size) + 1):
    left.append(i*2-1)
    center.append(-1)
    right.append(-1)
  return int(size)
"""
打印样式函数
"""
def printStyling(i,size,ta):
  if ta[i] != -1:
    # 打印前空格
    for kong in range(int(size - (ta[i] - 1) / 2)):
      print(" ", end="")
    # 打印塔元素
    for le in range(ta[i]):
      print("X", end="")
    # 打印后空格
    for kong in range(int(size - (ta[i] - 1) / 2)):
      print(" ", end="")
  # 左塔这一层为空格
  else:
    # 打印前面空格
    for kong in range(size):
      print(" ", end="")
    # 打印中间的棒棒
    print("|", end="")
    # 打印后面的空格
    for kong in range(size):
      print(" ", end="")
"""
控制台打印结果
"""
def show(size):
  #修饰
  print("-"*35)
  #循环层数等于size
  for i in range(size):
    # 打印左边塔
    printStyling(i,size,left)
    # 打印中间塔
    printStyling(i,size,center)
    # 打印右边塔
    printStyling(i,size,right)
    #每行打印一个换行
    print()
  #修饰
  print("-" * 35)
"""
判断可不可以移动
takeOff减少,putOn增加,size层数,tSize和pSize剩余空间
"""
def judge(takeOff,putOn,size,tSize,pSize,count):
  # 如果左塔的空间空的,就是没有元素可移动
  if takeOff == size:
    print("操作无效!")
    return 0
  # 如果中塔为空,可以移动
  if pSize == size:
    # 中间的最后一个元素赋上左塔的第一个元素的值
    putOn[pSize - 1] = takeOff[tSize]
    # 左塔的第一个元素赋值-1
    takeOff[tSize] = -1
    # 左塔的剩余空间+1
    tSize += 1
    # 中塔的剩余空间-1
    pSize -= 1
    #步数+1
    count += 1
    #移动成功,返回剩余空间和步数
    return tSize,pSize,count
  # 如果中塔最上方元素比左塔最上方元素大,即可以移动
  elif putOn[pSize] > takeOff[tSize]:
    # 中塔当前最上方元素的再上一个元素(-1)赋上左塔最上方元素的值
    putOn[pSize - 1] = takeOff[tSize]
    # 左塔最上方元素赋值-1
    takeOff[tSize] = -1
    # 左塔剩余空间+1
    tSize += 1
    # 中塔剩余空间-1
    pSize -= 1
    #步数+1
    count += 1
    # 移动成功,返回剩余空间和步数
    return tSize,pSize,count
  # 否则不可以移动
  else:
    print("操作无效!")
    return 0
"""
主要运行函数
"""
def main():
  #初始化游戏
  size = init()
  # 存放最初的盘剩余空间 lSize左塔 cSize中塔 rSize右塔
  lSize = 0
  cSize = size
  rSize = size
  #存放操作步数
  count = 0
  #打印游戏介绍
  print("将左塔完整地移到右塔就是胜利!")
  print("左-1 中-2 右-3 退出请输入:quit")
  print('例如输入:"1-2"就是将左塔的最上元素放到中塔')
  print("%d层的最佳步数是%d"%(size,pow(2,size)-1))
  #游戏进行
  while True:
    print("当前移动了%d步"%(count))
    #显示当前塔的状态
    show(size)
    #判断右塔是否没有剩余空间,没有即胜利,并退出游戏
    if rSize == 0:
      if count == pow(2,size)-1:
        print("恭喜你使用最少步数完成汉诺塔!")
      else:
        print("恭喜你只移动了%d步完成汉诺塔小游戏!"%(count))
      break
    #获取玩家操作
    select = input("请操作:")
    #左塔移中塔
    if select == "1-2":
      result = judge(left,center,size,lSize,cSize,count)
      if result == 0:
        continue
      else:
        lSize,cSize,count = result
    #左塔移右塔,下面同样
    elif select == "1-3":
      result = judge(left, right, size, lSize, rSize,count)
      if result == 0:
        continue
      else:
        lSize, rSize,count = result
    elif select == "2-1":
      result = judge(center, left, size, cSize, lSize,count)
      if result == 0:
        continue
      else:
        cSize, lSize,count = result
    elif select == "2-3":
      result = judge(center, right, size, cSize, rSize,count)
      if result == 0:
        continue
      else:
        cSize, rSize,count = result
    elif select == "3-1":
      result = judge(right, left, size, rSize, lSize,count)
      if result == 0:
        continue
      else:
        rSize, lSize,count = result
    elif select == "3-2":
      result = judge(right, center, size, rSize, cSize,count)
      if result == 0:
        continue
      else:
        rSize, cSize ,count= result
    #输入quit退出游戏
    elif select == "quit":
      break
    #如果输入的是其他不识别的文字,就拜拜
    else:
      print("操作有误!")
    continue
main()

运行结果:

详解python百行有效代码实现汉诺塔小游戏(简约版)

详解python百行有效代码实现汉诺塔小游戏(简约版)

详解python百行有效代码实现汉诺塔小游戏(简约版)

详解python百行有效代码实现汉诺塔小游戏(简约版)

到此这篇关于详解python百行有效代码实现汉诺塔小游戏(简约版)的文章就介绍到这了,更多相关python 汉诺塔 内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
python基础入门学习笔记(Python环境搭建)
Jan 13 Python
Mac中Python 3环境下安装scrapy的方法教程
Oct 26 Python
Python数据分析之双色球基于线性回归算法预测下期中奖结果示例
Feb 08 Python
python与C、C++混编的四种方式(小结)
Jul 15 Python
Django ORM多对多查询方法(自定义第三张表&ManyToManyField)
Aug 09 Python
命令行运行Python脚本时传入参数的三种方式详解
Oct 11 Python
关于Python 常用获取元素 Driver 总结
Nov 24 Python
Python文件操作函数用法实例详解
Dec 24 Python
jupyter note 实现将数据保存为word
Apr 14 Python
3分钟看懂Python后端必须知道的Django的信号机制
Jul 26 Python
Java Unsafe类实现原理及测试代码
Sep 15 Python
Python Web项目Cherrypy使用方法镜像
Nov 05 Python
python boto和boto3操作bucket的示例
Oct 30 #Python
python 多进程和协程配合使用写入数据
Oct 30 #Python
python打包生成so文件的实现
Oct 30 #Python
pytorch 移动端部署之helloworld的使用
Oct 30 #Python
把Anaconda中的环境导入到Pycharm里面的方法步骤
Oct 30 #Python
Python模拟登录和登录跳转的参考示例
Oct 30 #Python
python中watchdog文件监控与检测上传功能
Oct 30 #Python
You might like
一些常用的php简单命令代码集锦
2007/09/24 PHP
探讨Smarty中如何获取数组的长度以及smarty调用php函数的详解
2013/06/20 PHP
免费的ip数据库淘宝IP地址库简介和PHP调用实例
2014/04/08 PHP
PHP中如何使用session实现保存用户登录信息
2015/10/20 PHP
网页右下角弹出窗体实现代码
2014/06/05 Javascript
js代码实现随机颜色的小方块
2015/07/30 Javascript
cocos2dx骨骼动画Armature源码剖析(一)
2015/09/08 Javascript
Js获取图片原始宽高的实现代码
2016/05/17 Javascript
javascript如何定义对象数组
2016/06/07 Javascript
AngularJS使用ng-Cloak阻止初始化闪烁问题的方法
2016/11/03 Javascript
Node.JS使用Sequelize操作MySQL的示例代码
2017/10/09 Javascript
JS实现的input选择图片本地预览功能示例
2018/08/29 Javascript
Puppet的一些技巧
2018/09/17 Javascript
NProgress显示顶部进度条效果及使用详解
2019/09/21 Javascript
layui点击按钮页面会自动刷新的解决方案
2019/10/25 Javascript
Jquery ajax书写方法代码实例解析
2020/06/12 jQuery
nodejs处理tcp连接的核心流程
2021/02/26 NodeJs
python 解析html之BeautifulSoup
2009/07/07 Python
python实现查找excel里某一列重复数据并且剔除后打印的方法
2015/05/26 Python
Python2.x版本中基本的中文编码问题解决
2015/10/12 Python
Python2.X/Python3.X中urllib库区别讲解
2017/12/19 Python
Python数据结构之双向链表的定义与使用方法示例
2018/01/16 Python
django获取from表单multiple-select的value和id的方法
2019/07/19 Python
python中利用numpy.array()实现俩个数值列表的对应相加方法
2019/08/26 Python
python文字转语音实现过程解析
2019/11/12 Python
pycharm 激活码及使用方式的详细教程
2020/05/12 Python
python爬虫使用正则爬取网站的实现
2020/08/03 Python
美国最流行的男士时尚网站:Touch of Modern
2018/02/05 全球购物
监督检查工作方案
2014/05/28 职场文书
2014年乡镇个人工作总结
2014/12/03 职场文书
就业指导讲座心得体会
2016/01/15 职场文书
七年级英语教学反思
2016/02/15 职场文书
详解PHP用mb_string处理windows中文字符
2021/05/26 PHP
pytorch锁死在dataloader(训练时卡死)
2021/05/28 Python
多线程Spring通过@Scheduled实现定时任务
2022/05/25 Java/Android
Java代码规范与质量检测插件SonarLint的使用
2022/08/05 Java/Android