python2048小游戏极简代码

该游戏用面向对象的思想编写代码,每一个功能都用一个函数实现

该代码为个人原创

import random


#该函数将二维列表显示在4x4的方格中
def init(v, score):
    print("总分:", score, "分")
    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]))


#该函数将列表中非零的元素按制定方向紧挨排列
def layout(v, direction):
    if direction == "left":
        for l in v:
            zero = []
            for i in range(l.count(0)):
                l.remove(0)
                zero.append(0)
            for j in zero:
                l.append(j)
    else:
        for l in v:
            zero = []
            for i in range(l.count(0)):
                l.remove(0)
                zero.append(0)
            l[0:0] = zero


#该函数将相邻且相同元素相加后计入总分
def addsum(v, direction, score):
    score = score
    if direction == "left":
        for l in v:
            for i in range(0, 3):
                if l[i] == l[i+1] != 0:
                    l[i] *= 2
                    l[i+1] = 0
                    score += l[i]
                    break
        return score
    else:
        for l in v:
            for i in range(0, 3):
                if l[i] == l[i+1] != 0:
                    l[i+1] *= 2
                    l[i] = 0
                    score += l[i+1]
                    break
        return score


#该函数处理上下相加前的列表重新排列,先将二维列表中每个列表的第一个元素取出组成一个新列表,
#然后取每个列表的第二个元素组成一个新列表,以此类推,将4个新的列表醉成一个新的二维列表
def listchange(v):
    vchange = []
    for i in range(4):
        l1 = []
        for l in v:
            l1.append(l[i])
        vchange.append(l1)
    return vchange


#该函数处理上下相加后的列表按照原来的方式排列
def initchange(vchange):
    l2 = []
    for i in range(4):
        l3 = []
        for l in vchange:
            l3.append(l[i])
        l2.append(l3)
    return l2
#该函数在列表重新排列后随机将某个0元素替换程2或4
def randomlist(v,score):
    #判断有多少个0元素
    n = 0
    for l in v:
        n += l.count(0)
    #当列表中没有0元素时,返回一个数值,在该函数外进行退出和打印总成绩
    if n == 0:
        return 1
    #当列表中存在0元素时,将2或4随时替换某个0元素
    number = random.choice([2,2,2,4])
    k = random.randrange(1,n+1)
    m = 0
    for i in v:
        for j in range(4):
            if i[j] == 0:
                m += 1
                if m == k:
                    i[j] = number
                    print(k)
                    break
    return 2


def main():
    v = [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]
    for i in range(4):
        v[i] = [random.choice([0, 0, 0, 2, 2, 4]) for x in v[i]]
    score = 0
    init(v, score)


    while True:
        print("a(左),d(右),w(上),s(下)")
        n = input("请输入方向:")
        if n == "a":
            direction = "left"
            layout(v, direction)
            sum = addsum(v, direction, score)
            score = sum
            game = randomlist(v,score)
        elif n == "d":
            direction = "right"
            layout(v, direction)
            sum = addsum(v, direction, score)
            score = sum
            game = randomlist(v,score)
        #将w按照a处理
        elif n == "w":
            direction = "left"
            vchange = listchange(v)
            layout(vchange, direction)
            sum = addsum(vchange, direction, score)
            score = sum
            v = initchange(vchange)
            game = randomlist(v,score)
        #将s按照d处理
        elif n == "s":
            direction = "right"
            vchange = listchange(v)
            layout(vchange, direction)
            sum = addsum(vchange, direction, score)
            score = sum
            v = initchange(vchange)
            game = randomlist(v,score)
        elif n == "Q":
            print("总分:", score, "分")
            print("谢谢使用")
            break
        else:
            print("您的输入有误,请重新输入")
            print("总分:", score, "分")
            continue


        if game == 1:
                print("总分:", score, "分")
                print("游戏结束,谢谢使用")
                break
        else:
            init(v, sum)
        
        
        if score >= 2048:
            print("顺利通关,恭喜您")
            print("按任意键继续游戏,按Q退出游戏")
            nb = input("请输入:")
            if nb == "Q":
                continue
            else:
                print("游戏结束,谢谢使用")
                break






        
if __name__ == "__main__":
    main()
  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值