详解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实现随机密码字典生成器示例
Apr 09 Python
使用python编写android截屏脚本双击运行即可
Jul 21 Python
python Django模板的使用方法
Jan 14 Python
简述Python中的进程、线程、协程
Mar 18 Python
python 自动化将markdown文件转成html文件的方法
Sep 23 Python
Python编程实现双链表,栈,队列及二叉树的方法示例
Nov 01 Python
Python读取Json字典写入Excel表格的方法
Jan 03 Python
Python编程flask使用页面模版的方法
Dec 28 Python
解决pyinstaller打包发布后的exe文件打开控制台闪退的问题
Jun 21 Python
利用Python进行图像的加法,图像混合(附代码)
Jul 14 Python
调试Django时打印SQL语句的日志代码实例
Sep 12 Python
python3正则模块re的使用方法详解
Feb 11 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创建PDF中文文档
2006/10/09 PHP
探讨PHP中this,self,parent的区别详解
2013/06/08 PHP
PHP使用数组实现矩阵数学运算的方法示例
2017/05/29 PHP
PHP7扩展开发之基于函数方式使用lib库的方法详解
2018/01/15 PHP
根据分辨率不同,调用不同的css文件
2006/08/25 Javascript
js弹出div并显示遮罩层
2014/02/12 Javascript
JavaScript运行时库属性一览表
2014/03/14 Javascript
从零学jquery之如何使用回调函数
2014/05/16 Javascript
轻松学习jQuery插件EasyUI EasyUI实现拖放商品放置购物车
2015/11/30 Javascript
jQuery获取this当前对象子元素对象的方法
2016/11/29 Javascript
JavaScript中数组Array方法详解
2017/02/27 Javascript
input输入框内容实时监测(附代码)
2017/08/15 Javascript
Vue编写多地区选择组件
2017/08/21 Javascript
[03:48]DOTA2完美大师赛主赛事第二日精彩集锦
2017/11/24 DOTA
[01:18]PWL开团时刻DAY10——一拳超人
2020/11/11 DOTA
Python EOL while scanning string literal问题解决方法
2020/09/18 Python
urllib和BeautifulSoup爬取维基百科的词条简单实例
2018/01/17 Python
《与孩子一起学编程》python自测题
2018/05/27 Python
python实现换位加密算法的示例
2018/10/14 Python
Python实现常见的回文字符串算法
2018/11/14 Python
在 Linux/Mac 下为Python函数添加超时时间的方法
2020/02/20 Python
基于Pyinstaller打包Python程序并压缩文件大小
2020/05/28 Python
python线程池如何使用
2020/05/28 Python
python基本算法之实现归并排序(Merge sort)
2020/09/01 Python
pytho matplotlib工具栏源码探析一之禁用工具栏、默认工具栏和工具栏管理器三种模式的差异
2021/02/25 Python
HOTEL INFO英国:搜索全球酒店
2019/08/08 全球购物
WINDOWS域的具体实现方式是什么
2014/02/20 面试题
大学学习个人的自我评价
2014/02/18 职场文书
加入学生会演讲稿
2014/04/24 职场文书
安全生产承诺书范文
2014/05/22 职场文书
个人贷款收入证明
2014/10/26 职场文书
化工见习报告范文
2014/10/31 职场文书
向女朋友道歉的话
2015/01/20 职场文书
给上级领导的感谢信
2015/01/22 职场文书
不同意离婚答辩状
2015/05/22 职场文书
2015大一新生军训感言
2015/08/01 职场文书