详解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原始套接字编程示例分享
Feb 21 Python
Python中的startswith和endswith函数使用实例
Aug 25 Python
python3简单实现微信爬虫
Apr 09 Python
python计算方程式根的方法
May 07 Python
用Python计算三角函数之atan()方法的使用
May 15 Python
利用django如何解析用户上传的excel文件
Jul 24 Python
Django添加favicon.ico图标的示例代码
Aug 07 Python
解决python "No module named pip" 的问题
Oct 13 Python
python web自制框架之接受url传递过来的参数实例
Dec 17 Python
python实现的MySQL增删改查操作实例小结
Dec 19 Python
使用Pyhton集合set()实现成果查漏的例子
Nov 24 Python
Python中的 enumerate和zip详情
May 30 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 之 没有mysql支持时的替代方案
2006/10/09 PHP
PHP开发中常用的字符串操作函数
2011/02/08 PHP
php自动给文章加关键词链接的函数代码
2012/11/29 PHP
php中serialize序列化与json性能测试的示例分析
2013/04/27 PHP
PHP中预定义的6种接口介绍
2015/05/12 PHP
JavaScript DOM 学习第九章 选取范围的介绍
2010/02/19 Javascript
javascript+mapbar实现地图定位
2010/04/09 Javascript
JS网页播放声音实现代码兼容各种浏览器
2013/09/22 Javascript
javascript中负数算术右移、逻辑右移的奥秘探索
2013/10/17 Javascript
jquery和js实现对div的隐藏和显示方法
2014/09/26 Javascript
jquery中ready()函数执行的时机和window的load事件比较
2015/06/22 Javascript
浅谈angularJS 作用域
2015/07/05 Javascript
js判断是否为空和typeof的用法(详解)
2016/10/07 Javascript
详解js中常规日期格式处理、月历渲染和倒计时函数
2016/12/28 Javascript
js清除浏览器缓存的几种方法
2017/03/15 Javascript
AngularJS前端页面操作之用户修改密码功能示例
2017/03/27 Javascript
js解决软键盘遮挡输入框的问题分享
2017/12/19 Javascript
基于VuePress 轻量级静态网站生成器的实现方法
2018/04/17 Javascript
Webpack中雪碧图插件使用详解
2018/05/25 Javascript
js监听html页面的上下滚动事件方法
2018/09/11 Javascript
使用python的chardet库获得文件编码并修改编码
2014/01/22 Python
python获取本机外网ip的方法
2015/04/15 Python
用Python将mysql数据导出成json的方法
2018/08/21 Python
Python统计分析模块statistics用法示例
2019/09/06 Python
python 图片二值化处理(处理后为纯黑白的图片)
2019/11/01 Python
python和php学习哪个更有发展
2020/06/17 Python
Tensorflow与Keras自适应使用显存方式
2020/06/22 Python
加拿大奢华时装品牌:Mackage
2018/01/10 全球购物
设计4个线程,其中两个线程每次对j增加1,另外两个线程对j每次减少1。写出程序。
2014/12/30 面试题
Java程序开发中如何应用线程
2016/03/03 面试题
道路运输企业安全生产责任书
2014/07/28 职场文书
医院岗前培训心得体会
2016/01/08 职场文书
给原生html中添加水印遮罩层的实现示例
2021/04/02 Javascript
Python 高级库15 个让新手爱不释手(推荐)
2021/05/15 Python
Golang标准库syscall详解(什么是系统调用)
2021/05/25 Golang
如何正确理解python装饰器
2021/06/15 Python