详解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判断IP地址合法性的方法实例
Mar 13 Python
Python入门篇之面向对象
Oct 20 Python
python从网络读取图片并直接进行处理的方法
May 22 Python
使用python3+xlrd解析Excel的实例
May 04 Python
Django Rest framework之权限的实现示例
Dec 17 Python
django解决跨域请求的问题详解
Jan 20 Python
python实现大学人员管理系统
Oct 25 Python
Python使用正则实现计算字符串算式
Dec 29 Python
Python 实现opencv所使用的图片格式与 base64 转换
Jan 09 Python
Python面向对象魔法方法和单例模块代码实例
Mar 25 Python
python如何支持并发方法详解
Jul 25 Python
如何用Python提取10000份log中的产品信息
Jan 14 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产生随机数的两种方法实例代码 输出随机IP
2011/04/08 PHP
PHP变量赋值、代入给JavaScript中的变量
2015/06/29 PHP
实现变速回到顶部的JavaScript代码
2011/05/09 Javascript
JavaScript高级程序设计(第3版)学习笔记7 js函数(上)
2012/10/11 Javascript
使用JavaScript 实现对象 匀速/变速运动的方法
2013/05/08 Javascript
如何获取select下拉框的值(option没有及有value属性)
2013/11/08 Javascript
Bootstrap的fileinput插件实现多文件上传的方法
2016/09/05 Javascript
Bootstrap的class样式小结
2016/12/01 Javascript
jQuery使用Layer弹出层插件闪退问题
2016/12/22 Javascript
微信小程序实战之轮播图(3)
2017/04/17 Javascript
ES6中Array.copyWithin()函数的用法实例详解
2017/09/16 Javascript
使用javaScript实现鼠标拖拽事件
2020/04/03 Javascript
JS+canvas画一个圆锥实例代码
2017/12/13 Javascript
json前后端数据交互相关代码
2018/09/19 Javascript
原生js实现日历效果
2020/03/02 Javascript
vue video和vue-video-player实现视频铺满教程
2020/10/30 Javascript
Python3读取文件常用方法实例分析
2015/05/22 Python
Python使用matplotlib绘制正弦和余弦曲线的方法示例
2018/01/06 Python
Python BS4库的安装与使用详解
2018/08/08 Python
python实现烟花小程序
2019/01/30 Python
python 通过邮件控制实现远程控制电脑操作
2020/03/16 Python
CSS3转换功能transform主要属性值分析及实现分享
2012/05/06 HTML / CSS
英国网上香水店:Fragrance Direct
2016/07/20 全球购物
Orvis官网:自1856年以来,优质服装、飞钓装备等
2018/12/17 全球购物
Yahoo-PHP面试题3
2012/01/14 面试题
说出ArrayList,Vector, LinkedList的存储性能和特性
2015/01/04 面试题
Java的接口和C++的虚类的相同和不同处
2014/03/27 面试题
歌唱比赛获奖感言
2014/01/21 职场文书
《沙漠中的绿洲》教学反思
2014/04/24 职场文书
开展创先争优活动总结
2014/08/28 职场文书
小英雄雨来观后感
2015/06/09 职场文书
小学语文教师研修日志
2015/11/13 职场文书
关于艺术节的开幕致辞
2016/03/04 职场文书
检讨书怎么写?
2019/06/21 职场文书
虚拟机linux端mysql数据库无法远程访问的解决办法
2021/05/26 MySQL
python 远程执行命令的详细代码
2022/02/15 Python