python实现汉诺塔游戏

highlighter- python
lt = list() #左边的空列表
rt = list() #右边的空列表
ct = list() #中间的空列表

#初始化函数
def init():
    size = int(input("请输入你要挑战的高度:"))
    # 建立左边的汉诺塔
    for i in range(1,size+1):
        lt.append(i*2-1);
        ct.append(-1)
        rt.append(-1)
        #这里我们是一个倒放,后续需要处理一下
    return size #最后我们将层数返回



def Rule():
    print("将最左边的塔完整的移动到右边就是胜利")
    print("操作方式为:")
    print("left-1,right-3,center-2,退出就输出quit")
    print("例子:如果想将左边最上面的元素移动到最右边就输入1-3")


#显示函数
def Show(size):
    print("-"*20)
    for i in range(size):
        Print(i,size,lt)
        Print(i,size,ct)
        Print(i,size,rt)
        print()
    print("-"*20)

# 打印函数
def Print(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 Judge(tk,pt,size,tsize,psize,ans):
    if tsize == size:
        print("已经空了!!!")
        return 0
    if psize == size:
        x = tk[tsize]
        pt[psize-1] = x
        tk[tsize] = -1
        tsize += 1 #多了一个剩余空间
        psize -= 1 #少了一个空间
        ans += 1
        return tsize,psize,ans
    elif pt[psize] >tk[tsize]:
        x = tk[tsize]
        pt[psize - 1] = x
        tk[tsize] = -1
        tsize += 1  # 多了一个剩余空间
        psize -= 1  # 少了一个空间
        ans += 1
        return tsize,psize,ans
    else:
        print("不可执行的操作")
        return 0




# main函数(主函数)
def main():
    size = init()
    #存放剩余层数
    lsize = 0
    rsize = size
    csize = size
    #存放操作步数
    ans = 0
    #游戏规则
    Rule()
    print(lsize,rsize,csize)

    #输入最佳游戏步数
    print(f"{size}层的最佳步数是{pow(2,size)-1}")
    print("挑战开始")

    while True:
        print(f"当前移动了{ans}步")
        Show(size)
        if rsize == 0:
            if ans ==pow(2,size)-1:
                print("恭喜你挑战成功")
            else:
                print(f"虽然不是最优方案,但是您仍然用了{ans}步来完成")
            break

        operater = input("请输入你的操作:")
        if operater =='1-2':
            result = Judge(lt,ct,size,lsize,csize,ans)
            if result == 0:
                continue
            else:
                lsize,csize,ans = result
        elif operater =='1-3':
            result = Judge(lt,rt,size,lsize,rsize,ans)
            if result == 0:
                continue
            else:
                lsize,rsize,ans = result
        elif operater =='2-1':
            result = Judge(ct,lt,size,csize,lsize,ans)
            if result == 0:
                continue
            else:
                csize,lsize,ans = result
        elif operater =='2-3':
            result = Judge(ct,rt,size,csize,rsize,ans)
            if result == 0:
                continue
            else:
                csize,rsize,ans = result
        elif operater =='3-1':
            result = Judge(rt,lt,size,rsize,lsize,ans)
            if result == 0:
                continue
            else:
                rsize,lsize,ans = result
        elif operater =='3-2':
            result = Judge(rt,ct,size,rsize,csize,ans)
            if result == 0:
                continue
            else:
                rsize,csize,ans = result
        elif operater =='quit':
            x=input("你确定要退出吗(Y/N)")
            break
            if x=='Y':
                print("已经成功退出")
            else:
                continue

        else:
            print("无效指令,请重试")
            continue


#主函数运行
if __name__ == '__main__':
    main()
PYTHON 复制 全屏

__EOF__

 
 

 

【出处】:https://www.cnblogs.com/du463/p/17930820.html

=======================================================================================

posted on 2023-12-27 16:48  jack_Meng  阅读(191)  评论(0编辑  收藏  举报

导航