python 小游戏 之 汉诺塔

来源:互联网 发布:粤贵银分析软件 编辑:程序博客网 时间:2024/06/07 03:27

一,题目:

汉诺塔游戏程序 <1> 问题描述:在平面上有三个位置A、B、C,
在A位置上有n个大小不等的圆盘、小盘压在大盘上形成圆盘堆。
要求将A位置的N个圆盘通过B位置移动到C位置上,并按同样的顺序叠放。
移动圆盘时必须遵循以下规则:
1. 每一次只能移动一个圆盘 2. 圆盘可以放在A、B、C任何一个塔座上 3. 任何时刻都不能将大圆盘压在小圆盘上

二,问题分析:

当只有一个盘子的时候,只需要从将A塔上的一个盘子移到C塔上。
当A塔上有两个盘子是,先将A塔上的1号盘子(编号从上到下)移动到B塔上,2 * 2 -1
再将A塔上的2号盘子移动的C塔上,最后将B塔上的小盘子移动到C塔上。
当A塔上有3个盘子时,先将A塔上编号1至2的盘子(共2个)移动到B塔上(需借助C塔),
然后将A塔上的3号最大的盘子移动到C塔,最后将B塔上的两个盘子借助A塔移动到C塔上。
当A塔上有n个盘子是,先将A塔上编号1至n-1的盘子(共n-1个)移动到B塔上(借助C塔),
然后将A塔上最大的n号盘子移动到C塔上,最后将B塔上的n-1个盘子借助A塔移动到C塔上。
综上所述,除了只有一个盘子时不需要借助其他塔外,其余情况均一样(只是事件的复杂程度不一样)

##----------------创建游戏----------------------#游戏列表columns = [[],[],[]]gameSize = -1def getGameSize(): #创建列表    global gameSize    while gameSize== -1 :        #判断是否是数字        try:            value = int(raw_input('请输入 2 到 9 的整数:'))            # 判断是否在2到9之间            if value >= 2 and value <= 9:                gameSize = value            # 将数列添加到columns的子列表中            for d in range(0, gameSize):                columns[0].append(d + 1)        except TypeError:            # 不是一个数字。再试一次.            gameSize = -1    print columns##--------------移动圆盘----------------------#游戏结束条件EjectNum = True#移动的步数turn = 0def doMove(fromCol, toCol):    global EjectNum    global columns    global turn    #将字符转成整数方便计算    iFrom = ord(fromCol) - ord('a')    iTo = ord(toCol) - ord('a')    # 判断该位置是否有圆盘(取)    if len(columns[iFrom]) == 0:        print '%s上没有圆盘 '%fromCol.upper()        return    # 判断该位置是否有圆盘(放)    if len(columns[iTo]) > 0:        sizeFrom = columns[iFrom][0]        sizeTo = columns[iTo][0]        if sizeTo < sizeFrom:            print '大盘不能放在小盘上'            return    # 移动圆盘    disk = columns[iFrom].pop(0)        # 弹出选中列的第一个圆盘    columns[iTo].insert(0, disk)    # 将弹出的原盘加入到目标列    turn += 1  # 步数加一    print columns,'走%d步'%turn    if len(columns[0])==0 and len(columns[1])==0:        print '恭喜你已经过关了,共用了%d步'%(turn)        EjectNum = False#命令def doInput():    print '输入要移动的列a,b,c ',    command = raw_input().lower()    if command == 'a' or command == 'b' or command == 'c':        doMoveFrom(command)def doMoveFrom(command):    print '移动到哪? ',    to = raw_input().lower()    if to == command:        print "你放回了原来的位置"    elif to == 'a' or to == 'b' or to == 'c':        doMove(command, to)#执行getGameSize()while  EjectNum:    doInput()
原创粉丝点击