详解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实现向QQ群成员自动发邮件的方法
Nov 19 Python
python读取json文件并将数据插入到mongodb的方法
Mar 23 Python
深入解析Python编程中JSON模块的使用
Oct 15 Python
Python处理JSON数据并生成条形图
Aug 05 Python
Python应用03 使用PyQT制作视频播放器实例
Dec 07 Python
Python cookbook(数据结构与算法)字典相关计算问题示例
Feb 18 Python
python3 selenium 切换窗口的几种方法小结
May 21 Python
python dataframe 输出结果整行显示的方法
Jun 14 Python
Python中的十大图像处理工具(小结)
Jun 10 Python
python切片的步进、添加、连接简单操作示例
Jul 11 Python
解决django 新增加用户信息出现错误的问题
Jul 28 Python
python自动化之如何利用allure生成测试报告
May 02 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
自制汽车收音机天线:收听广播的技巧和方法
2021/03/02 无线电
让PHP支持页面回退的两种方法[转]
2007/02/14 PHP
关于尾递归的使用详解
2013/05/02 PHP
深入PHP获取随机数字和字母的方法详解
2013/06/06 PHP
Cookie跨域问题解决方案代码示例
2020/11/24 PHP
左右悬浮可分组的网站QQ在线客服代码(可谓经典)
2012/12/21 Javascript
Javascript 函数parseInt()转换时出现bug问题
2014/05/20 Javascript
javascript 小数取整简单实现方式
2014/05/30 Javascript
Jquery easyui开启行编辑模式增删改操作
2016/01/14 Javascript
基于javascript实现动态显示当前系统时间
2016/01/28 Javascript
Js得到radiobuttonlist选中值的两种方法(推荐)
2016/08/25 Javascript
js日期相关函数dateAdd,dateDiff,dateFormat等介绍
2016/09/24 Javascript
探讨Vue.js的组件和模板
2017/10/27 Javascript
微信小程序列表中item左滑删除功能
2018/11/07 Javascript
JS实现选项卡效果的代码实例
2019/05/20 Javascript
python列表操作使用示例分享
2014/02/21 Python
Python二分法搜索算法实例分析
2015/05/11 Python
Python常用的内置序列结构(列表、元组、字典)学习笔记
2016/07/08 Python
python读取有密码的zip压缩文件实例
2019/02/08 Python
python使用time、datetime返回工作日列表实例代码
2019/05/09 Python
Python3查找列表中重复元素的个数的3种方法详解
2020/02/13 Python
Python如何将装饰器定义为类
2020/07/30 Python
详解Python 中的 defaultdict 数据类型
2021/02/22 Python
css3和jquery实现的可折叠导航菜单适合放在手机网页的导航菜单
2014/09/02 HTML / CSS
苹果美国官方商城:Apple美国
2016/08/24 全球购物
美国全球旅游运营商:Pacific Holidays
2018/06/18 全球购物
荷兰时尚精品店:Labels Fashion
2020/03/22 全球购物
学前教育教师求职自荐信
2013/09/22 职场文书
初中生期末考试的自我评价
2013/12/17 职场文书
大学生求职工作的自我评价
2014/02/13 职场文书
程序员求职信
2014/04/16 职场文书
介绍信怎么写
2015/01/30 职场文书
公司档案管理制度
2015/08/05 职场文书
创业项目大全(适合在家创业的项目)
2019/08/15 职场文书
解决SpringBoot文件上传临时目录找不到的问题
2021/07/01 Java/Android
SQL Server 忘记密码以及重新添加新账号
2022/04/26 SQL Server