Py学习  »  Python

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

我不是秃头哆唻咪 • 3 年前 • 266 次点击  

直接上代码:

#左中右塔用一个列表存储
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()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
  • 138
  • 139
  • 140
  • 141
  • 142
  • 143
  • 144
  • 145
  • 146
  • 147
  • 148
  • 149
  • 150
  • 151
  • 152
  • 153
  • 154
  • 155
  • 156
  • 157
  • 158
  • 159
  • 160
  • 161
  • 162
  • 163
  • 164
  • 165
  • 166
  • 167
  • 168
  • 169
  • 170
  • 171
  • 172
  • 173
  • 174
  • 175
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
  • 138
  • 139
  • 140
  • 141
  • 142
  • 143
  • 144
  • 145
  • 146
  • 147
  • 148
  • 149
  • 150
  • 151
  • 152
  • 153
  • 154
  • 155
  • 156
  • 157
  • 158
  • 159
  • 160
  • 161
  • 162
  • 163
  • 164
  • 165
  • 166
  • 167
  • 168
  • 169
  • 170
  • 171
  • 172
  • 173
  • 174
  • 175

运行结果: 在这里插入图片描述
在这里插入图片描述 在这里插入图片描述

在这里插入图片描述 快来挑战一下叭!点赞支持一下哦!

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/74754
 
266 次点击