详解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之Import 模块
Oct 13 Python
Python读写ini文件的方法
May 28 Python
详谈Python2.6和Python3.0中对除法操作的异同
Apr 28 Python
Python读取文件内容的三种常用方式及效率比较
Oct 07 Python
python实现手机通讯录搜索功能
Feb 22 Python
创建pycharm的自定义python模板方法
May 23 Python
python中csv文件的若干读写方法小结
Jul 04 Python
python3调用百度翻译API实现实时翻译
Aug 16 Python
Python 计算任意两向量之间的夹角方法
Jul 05 Python
python实现获取单向链表倒数第k个结点的值示例
Oct 24 Python
tensorflow 保存模型和取出中间权重例子
Jan 24 Python
PyQt5+Pycharm安装和配置图文教程详解
Mar 24 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
CodeIgniter生成静态页的方法
2016/05/17 PHP
PHP注释语法规范与命名规范详解篇
2018/01/21 PHP
HTML5如何适配 iPhone IOS 底部黑条
2021/03/09 HTML / CSS
jQuery 表格工具集
2010/04/25 Javascript
js jquery数组介绍
2012/07/15 Javascript
jquery select多选框的左右移动 具体实现代码
2013/07/03 Javascript
setInterval()和setTimeout()的用法和区别示例介绍
2013/11/17 Javascript
js+css简单实现网页换肤效果
2015/12/29 Javascript
原生js实现addClass,removeClass,hasClass方法
2016/04/27 Javascript
Ionic快速安装教程
2016/06/03 Javascript
浅谈javascript中的constructor
2016/06/08 Javascript
微信小程序 数据交互与渲染实例详解
2017/01/21 Javascript
JQueryMiniUI按照时间进行查询的实现方法
2017/06/07 jQuery
基于Require.js使用方法(总结)
2017/10/26 Javascript
vue-cli配置文件——config篇
2018/01/04 Javascript
详解如何在项目中使用jest测试react native组件
2018/02/09 Javascript
微信小程序实现选择地址省市区三级联动
2020/06/21 Javascript
Nodejs 微信小程序消息推送的实现
2021/01/20 NodeJs
python使用suds调用webservice接口的方法
2019/01/03 Python
python实现狄克斯特拉算法
2019/01/17 Python
Jacobi迭代算法的Python实现详解
2019/06/29 Python
一篇文章搞定Python操作文件与目录
2019/08/13 Python
python爬虫学习笔记之Beautifulsoup模块用法详解
2020/04/09 Python
Django用户登录与注册系统的实现示例
2020/06/03 Python
在python3.9下如何安装scrapy的方法
2021/02/03 Python
MATCHESFASHION.COM法国官网:英国奢侈品零售商
2018/01/04 全球购物
大专生的学习自我评价
2013/12/04 职场文书
函授教育个人学习的自我评价
2013/12/31 职场文书
医学院校毕业生自荐信范文
2014/01/01 职场文书
企业厂务公开实施方案
2014/03/26 职场文书
升职演讲稿范文
2014/05/23 职场文书
2014年文秘工作总结
2014/11/25 职场文书
关于元旦的广播稿2016
2015/12/17 职场文书
某药房的新员工入职告知书!
2019/07/15 职场文书
Ajax是什么?Ajax高级用法之Axios技术
2021/04/21 Javascript
Redis监控工具RedisInsight安装与使用
2022/03/21 Redis