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

2022-07-28,,,,

直接上代码:

#左中右塔用一个列表存储
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百行有效代码实现汉诺塔小游戏(简约版).doc》

下载本文的Word格式文档,以方便收藏与打印。