详解python百行有效代码实现汉诺塔小游戏(简约版)

直接上代码:

#左中右塔用一个列表存储
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 汉诺塔 内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • python益智游戏计算汉诺塔问题示例

    汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具.大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘.大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上.并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘. 复制代码 代码如下: times = 0def test(num,a,b,c):    globaltimes    ifnum==1:       print (a,b)       times+=1 else

  • 使用python实现递归版汉诺塔示例(汉诺塔递归算法)

    利用python实现的汉诺塔.带有图形演示 复制代码 代码如下: from time import sleep def disp_sym(num, sym):        print(sym*num, end='') #recusiondef hanoi(a, b, c, n, tray_num): if n == 1:  move_tray(a, c)  disp(tray_num)  sleep(0.7) else:  hanoi(a, c, b, n-1, tray_num)  move

  • Python递归实现汉诺塔算法示例

    本文实例讲述了Python递归实现汉诺塔算法.分享给大家供大家参考,具体如下: 最近面试题,面试官让我5分钟实现汉诺塔算法(已然忘记汉诺塔是啥). 痛定思痛,回来查了一下汉诺塔的题目和算法.题干与实现如下: A基座有64个盘子,大在下小在上,每次移动一个盘子,每次都需要大在下小在上,全部移动到B基座,C基座为辅助基座. # -*- coding:utf-8 -*- # 汉诺塔回溯递归实现 # 假设参数中初始杆为a,借助杆为c,阶段终止杆为b # 第一步,a状态借助b移动到c # 第二步,a移动到

  • python求解汉诺塔游戏

    本文实例为大家分享了python求解汉诺塔游戏的具体代码,供大家参考,具体内容如下 一.问题定义 百度百科定义:汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具.据说大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照从小到大顺序摞着64片黄金圆盘.大梵天命令婆罗门借助其中一根柱子,把64片黄金圆盘重新摆放到第三个根柱子上.并且规定,在小黄金圆盘上不能放大的黄金圆盘,在三根柱子之间一次只能移动一个圆盘. 例如,如果黄金圆盘只有3片,则为了满足游戏规则,那么必须按照如下图所示的

  • python实现的汉诺塔算法示例

    本文实例讲述了python实现的汉诺塔算法.分享给大家供大家参考,具体如下: 规则: 圆盘从下面开始按大小顺序重新摆放在另一根柱子上.并且规定 在小圆盘上不能放大圆盘 在三根柱子之间一次只能移动一个圆盘. 算法思路:[三阶的移动思路] python实现:[注意实参和形参] 用python方法调用,实现输入圆盘数,打印移动的过程 def move(n,a,b,c): if n==1: print(a,'-->',c) else: move(n-1,a,c,b) #将前n-1个盘子从a移动到b上 m

  • Python基于递归算法实现的汉诺塔与Fibonacci数列示例

    本文实例讲述了Python基于递归算法实现的汉诺塔与Fibonacci数列.分享给大家供大家参考,具体如下: 这里我们通过2个例子,学习python中递归的使用. 1. 找出Fibonacci数列中,下标为 n 的数(下标从0计数) Fibonacci数列的形式是这样的:0,1,1,2,3,5,8,13-- ① 使用while循环,python2代码如下: def fib(n): a,b=0,1 count=0 while count<n: a,b=b,a+b count=count+1 pri

  • python实现汉诺塔算法

    题目: 汉诺塔给出最优解,如果对汉诺塔的定义有不了解,请翻看数据结构教材. 除了最基本的之外,还有一题,给定一个数组,arr=[2,3,1,2,3],其含义是这是一个有5个圆盘的汉诺塔,每一个数字代表这个圆盘所在的位置,1代表左边的柱子,2代表中间,3代表右边.给出这个序列代表了汉诺塔移动的第几步,如果该步骤是错误的,则返回-1,所谓错误,是指该步骤不是最简便的得到汉诺塔序列的操作步骤. 分析: 1. 算法当然还是递归解了,即把n个汉诺塔盘子分解成 n - 1 个盘子的移动和一个底层盘子的移动,

  • python实现汉诺塔递归算法经典案例

    学到递归的时候有个汉诺塔的练习,汉诺塔应该是学习计算机递归算法的经典入门案例了,所以本人觉得可以写篇博客来表达一下自己的见解.这markdown编辑器还不怎么会用,可能写的有点格式有点丑啦,各位看官多多见谅. 网上找了一张汉诺塔的图片,汉诺塔就是利用用中间的柱子把最左边的柱子上的圆盘依次从大到小叠上去,说白了就是c要跟原来的a一样 废话少说,先亮代码 def move(n, a, buffer, c): if(n == 1): print(a,"->",c) return mov

  • python实现汉诺塔方法汇总

    学习python遇到的第一个问题:汉诺塔问题的实现.首先是不知道什么是汉诺塔问题,然后是不知道怎么实现.于是百度了下,结果如下: 汉诺塔:汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具.大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘.大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上.并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘 方法一: def move(n,a,b,c) # n=2 if n==1 :

  • 详解python百行有效代码实现汉诺塔小游戏(简约版)

    直接上代码: #左中右塔用一个列表存储 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

  • 详解Python之unittest单元测试代码

    前言 编写函数或者类时,还可以为其编写测试.通过测试,可确定代码面对各种输入都能够按要求的那样工作. 本次我将介绍如何使用Python模块unittest中的工具来测试代码. 测试函数 首先我们先编写一个简单的函数,它接受姓.名.和中间名三个参数,并返回完整的姓名: names.py def get_fullname(firstname,lastname,middel=''): '''创建全名''' if middel: full_name = firstname + ' ' + middel

  • 详解Python命令行解析工具Argparse

    最近在研究pathon的命令行解析工具,argparse,它是Python标准库中推荐使用的编写命令行程序的工具. 以前老是做UI程序,今天试了下命令行程序,感觉相当好,不用再花大把时间去研究界面问题,尤其是vc++中尤其繁琐. 现在用python来实现命令行,核心计算模块可以用c自己写扩展库,效果挺好. 学习了argparse,在官方文档中找到一篇toturial,简单翻译了下. http://docs.python.org/2/howto/argparse.html#id1 Argparse

  • 20行js代码实现的贪吃蛇小游戏

    前言 最近在csdn上看到一位大神用20行代码就写出了一个贪吃蛇的小游戏,感觉被惊艳到了,就试着读了一下这段代码,阅读过程中不断为作者写法的巧妙而叫绝,其中我发现自己对运算符优先级和一些js的技巧不是很清楚,所以看完之后决定把思路分享出来,方便和我一样的小白学习. 我对代码稍稍做了些修改,并添加了一些注释,方便理解. 示例代码 <!DOCTYPE html> <html lang="en"> <head> <meta charset="

  • C语言实现汉诺塔(图文详解)

    目录 思路: 当n=1时: 当n=2时: 当n=3时: 当n=4时: 见代码 运行截图 总结 汉诺塔的游戏规则: 有三根金刚石柱子A.B.C,在A柱子上从下往上按照大小依次减小的顺序摞着64片黄金环.大梵天命令婆罗门把环从下面开始按大小顺序重新摆放在另一根柱子上.并且规定,在任何一个柱子上,小环上不能放大环,在三根柱子之间一次只能移动一个环. 即将A柱子上全部的环通过中间柱子B(B柱子作为中介)移动到C柱子上 当A只有一个环的时候: A->C 当A只有两个环的时候: A->B A->C

  • Pygame代码 制作一个贪吃蛇小游戏

    目录 用到的 Pygame 函数 创建屏幕 创建 snake 使 snake 动起来 处理 Game Over 增加食物 snake 的成长 展示得分 用到的 Pygame 函数 贪吃蛇小游戏用到的函数 功能 描述 init() 初始化 pygame display.set_mode() 以元组或列表为参数创建窗口 update() 更新屏幕 quit() 用于取消初始化的 pygame set_caption() 在屏幕的顶部设置文字 event.get() 返回所有事件的列表 Surface

  • 详解python中的三种命令行模块(sys.argv,argparse,click)

    Python作为一门脚本语言,经常作为脚本接受命令行传入参数,Python接受命令行参数大概有三种方式.因为在日常工作场景会经常使用到,这里对这几种方式进行总结. 命令行参数模块 这里命令行参数模块平时工作中用到最多就是这三种模块:sys.argv,argparse,click.sys.argv和argparse都是内置模块,click则是第三方模块. sys.argv模块(内置模块) 先看一个简单的示例: #!/usr/bin/python import sys def hello(name,

  • 详解Python如何优雅地解析命令行

    目录 1. 手动解析 2. getopt模块 总结 如何优雅地解析命令行选项 随着我们编程经验的增长,对命令行的熟悉程度日渐加深,想来很多人会渐渐地体会到使用命令行带来的高效率. 自然而然地,我们自己写的很多程序(或者干脆就是脚本),也希望能够像原生命令和其他程序一样,通过运行时输入的参数就可以设定.改变程序的行为:而不必一层层找到相应的配置文件,然后还要定位到相应内容.修改.保存.退出…… 想想就很麻烦好吗 1. 手动解析 所以让我们开始解析命令行参数吧~ 在以前关于模块的文章中我们提到过sy

  • python百行代码自制电脑端网速悬浮窗的实现

    前言 看到某60的网速悬浮球有点心动,但是又不想装这个流氓软件,就自己用python加PyQt5自制了一个,实测还行,关键不占用电脑一点资源,已将软件打包,可自行下载使用. 预览 观看直播时实时网速. 文件结构 运行管理 开始运行时内存消耗18.3m,cpu,磁盘,网络不占用. 运行一天后内存稳定于6.4m,cpu,磁盘,网络不占用. 整体思路 使用psuti.net_io_counters 监控电脑网卡IO 将流量数据格式化,统计每次数据总和保存在本地<流量使用情况.txt>(这个是个缺陷,

随机推荐