1. 程式人生 > 程式設計 >詳解python百行有效程式碼實現漢諾塔小遊戲(簡約版)

詳解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,left)
    # 列印中間塔
    printStyling(i,center)
    # 列印右邊塔
    printStyling(i,right)
    #每行列印一個換行
    print()
  #修飾
  print("-" * 35)
"""
判斷可不可以移動
takeOff減少,putOn增加,size層數,tSize和pSize剩餘空間
"""
def judge(takeOff,putOn,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,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
    # 移動成功,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,lSize,cSize,count)
      if result == 0:
        continue
      else:
        lSize,count = result
    #左塔移右塔,下面同樣
    elif select == "1-3":
      result = judge(left,right,rSize,count = result
    elif select == "2-1":
      result = judge(center,left,count)
      if result == 0:
        continue
      else:
        cSize,count = result
    elif select == "2-3":
      result = judge(center,count = result
    elif select == "3-1":
      result = judge(right,count)
      if result == 0:
        continue
      else:
        rSize,count = result
    elif select == "3-2":
      result = judge(right,count= result
    #輸入quit退出遊戲
    elif select == "quit":
      break
    #如果輸入的是其他不識別的文字,就拜拜
    else:
      print("操作有誤!")
    continue
main()

執行結果:

在這裡插入圖片描述

在這裡插入圖片描述

在這裡插入圖片描述

在這裡插入圖片描述

到此這篇關於詳解python百行有效程式碼實現漢諾塔小遊戲(簡約版)的文章就介紹到這了,更多相關python 漢諾塔 內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!