Python 完成2048

来源:互联网 发布:可牛拍照软件下载 编辑:程序博客网 时间:2024/06/10 08:47
__file__ = '2048.py'__author__ = 'Jerry Liu'__date__ = '2016-04-19'import random_totalscore =0v = [[0, 0, 0, 0],     [0, 0, 0, 0],     [0, 0, 0, 0],     [0, 0, 0, 0]]def display(v, score):    randomNum()    print('{0:4} {1:4} {2:4} {3:4}'.format(v[0][0], v[0][1], v[0][2], v[0][3]))    print('{0:4} {1:4} {2:4} {3:4}'.format(v[1][0], v[1][1], v[1][2], v[1][3]))    print('{0:4} {1:4} {2:4} {3:4}'.format(v[2][0], v[2][1], v[2][2], v[2][3]))    print('{0:4} {1:4} {2:4} {3:4}'.format(v[3][0], v[3][1], v[3][2], v[3][3]))    print('Total score ', score)#初始化def init(v):    '''        随机分布网格值    '''    for i in range(4):        v[i] = [random.choice([0, 0, 0, 2, 2, 4]) for x in v[i]]# 删除0def align(vList, direction):    for i in range(vList.count(0)):        vList.remove(0)    zeros = [0 for x in range(4 - len(vList))]    if direction == 'left':        vList.extend(zeros)    else:        vList[:0] = zeros# 随机2、4 添加到0的位置def randomNum():    count = getZeroCount()    if count > 0:        num = random.choice([2, 2, 2, 2, 4])        # 随即一个位置        ind = random.randrange(1, count+1)        # 将这个位置的值设置新num        n = 0        for i in range(4):            for j in range(4):                if v[i][j] == 0:                    n += 1                    if n == ind:                        v[i][j] = num                        print(i, j, num)                        return# 计算零的个数def getZeroCount():    n = 0    for q in v:        n += q.count(0)    return n# 计算def compute(vlist, direct):    align(vlist, direct)    addscore = 0    if direct == 'left':        for i in [0,1,2]:            if vlist[i] == vlist[i+1] and vlist[i+1] != 0:                vlist[i] *= 2                vlist[i+1] = 0                addscore += vlist[i]    else:        for i in [3, 2, 1]:            if vlist[i] == vlist[i - 1] and vlist[i - 1] != 0:                vlist[i] *= 2                vlist[i - 1] = 0                addscore += vlist[i]    return addscore# 左移def left():    _totalscore = 0    for row in range(4):        _totalscore += compute(v[row], 'left')# 右移def right():    _totalscore = 0    for row in range(4):        _totalscore += compute(v[row], 'right')# 上移def up():    _totalscore = 0    for col in range(4):        # 列转行,上为左        vList = [v[row][col] for row in range(4)]        _totalscore += compute(vList, 'left')        # 从处理后的列表中的数字覆盖原来矩阵中的值        for row in range(4):            v[row][col] = vList[row]# 下移def down():    _totalscore = 0    for col in range(4):        # 列转行,下为右        vList = [v[row][col] for row in range(4)]        _totalscore += compute(vList, 'right')        # 从处理后的列表中的数字覆盖原来矩阵中的值        for row in range(4):            v[row][col] = vList[row]def handler():    direct = input('enter w a s d, ')    if direct in ['W', 'w']:        up()    elif direct in ['S', 's']:        down()    elif direct in ['a', 'A']:        left()    elif direct in ['d', 'D']:        right()    else:        print('命令错误。')# 判断游戏是否结束def isGameOver():    if getZeroCount() > 0:        return False    else:        # 判断是否可以移动        for row in range(4):            result = isListOver(v[row])            if not result:                return False        for col in range(4):            # 列转行,下为右            vlist = [v[row][col] for row in range(4)]            result = isListOver(vlist)            if not result:                return False    return True# 判断数据是否可以继续移动def isListOver(vlist):    for i in [0, 1, 2]:        if vlist[i] == vlist[i + 1] and vlist[i + 1] != 0:            return False    return Trueif __name__ == '__main__':    display(v, 0)    flag = isGameOver()    while not flag:        handler()        display(v, _totalscore)        flag = isGameOver()    else:        print('game over')

0 0
原创粉丝点击