【新手向】用Python写简单的2048小游戏

旧巷老猫 提交于 2020-05-06 17:53:47
前些天在b站上看到有个大佬用c写了一个2048小游戏,我便一下来了兴趣。心想着,我貌似也能用Python来整一波,话不多说,直接开搞。

2048的游戏规则
2048游戏共有16个格子,初始时会有两个格子上安放了两个数字2,每次可以选择上下左右其中一个方向去滑动,每滑动一次,所有的数字方块都会往滑动的方向靠拢外,系统也会在空白的地方随即出现一个数字方块,相同数字的方块在靠拢、相撞时会相加。系统给予的数字方块不是2就是4,玩家要想办法在这小小的16格范围中凑出“2048”这个数字方块

咱们可以从游戏规则里面一步一步来:

第一步:

2048游戏共有16个格子,初始时会有两个格子上安放了两个数字2
这一步比较简单,我们可以建立一个二维数组,然后随机在上面放上两个数字2
用代码就可以这么写:

list1=[[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0]]
def map1(map_list):
    count=0
    while(count<2):
        a=r.randint(0,3)
        b=r.randint(0,3)
        if map_list[a][b]==0:
            map_list[a][b]=2
            count+=1

第二步

每次可以选择上下左右其中一个方向去滑动,每滑动一次,所有的数字方块都会往滑动的方向靠拢,相同数字的方块在靠拢、相撞时会相加。

这一步就是这个游戏里,比较复杂的地方了。这里涉及到两种运算,我称之为,去0运算和合并运算

去0运算:
我们先从最简单的2—0开始写:
开始是这样:
在这里插入图片描述


我们要假设要进行上滑操作,使其变成这样:
在这里插入图片描述
这里我们可以看到在(2,1)的地方的2,上滑到了(1,1),那么我们来写代码:

def qu0(dire,list1):#去0运算,w,a,s,d分别表示各个方向
       
        if (dire=="w" or dire=="W"):
        #h表示行,s表示列
        for s in range(4):
            for h in [3,2,1]:
              elif(list1[h-1][s]==0):
                    list1[h-1][s]=list1[h][s]
                    list1[h][s]=0
        
         if (dire=="s" or dire=="S"):
        for s in range(4):
            for h in [0,1,2]:
              elif(list1[h+1][s]==0):
                    list1[h+1][s]=list1[h][s]
                    list1[h][s]=0
    
        if (dire=="a" or dire=="A"):
            for h in range(4):
                for s in [3,2,1]:
                   elif(list1[h][s-1]==0):
                        list1[h][s-1]=list1[h][s]
                        list1[h][s]=0
                        
        if (dire=="d"or dire=="D"):
            for h in range(4):
                for s in [0,1,2]:
                   elif(list1[h][s+1]==0):
                        list1[h][s+1]=list1[h][s]
                        list1[h][s]=0
            

这里我们通过看自己格子的前一个格子里的数字是否为0,如果是,那么我们就把这个格子里的数字移动到前一个格子里。

合并运算
相同数字的方块在靠拢、相撞时会相加
示意图就不给画了,你们应该都能想象,orz
先上代码


def heB(dire,list1):
     if (dire=="w" or dire=="W"):
        for s in range(4):
            for h in [3,2,1]:
              elif(list1[h][s]==list1[h-1][s] ): #合并运算
                    list1[h-1][s]=list1[h-1][s]*2
                    list1[h][s]=0
        
     if (dire=="s" or dire=="S"):
        for s in range(4):
            for h in [0,1,2]:
              elif(list1[h][s]==list1[h+1][s] ):
                    list1[h+1][s]=list1[h+1][s]*2
                    list1[h][s]=0
                    
        if (dire=="a" or dire=="A"):
            for h in range(4):
                for s in [3,2,1]:
                   elif(list1[h][s]==list1[h][s-1]):
                        list1[h][s-1]=list1[h][s-1]*2
                        list1[h][s]=0
                        
        if (dire=="d"or dire=="D"):
            for h in range(4):
                for s in [0,1,2]:
                    elif(list1[h][s]==list1[h][s+1]):
                        list1[h][s+1]=list1[h][s+1]*2
                        list1[h][s]=0

这里我们仍然还是看格子的前一个数字,如果格子里的前一个数字跟格子里的数字相同,那么就要把原来的格子里的数字变为0,格子里的前一个数字翻倍(相加)。

了解完2048的这两种运算,我们就要开始研究判定顺序了,研究判定顺序需要拿出一个极端的例子比如下面这个:
在这里插入图片描述
我们使这个这个二维数组往上相加,它经历的过程如下:
第一步:
在这里插入图片描述
第二步:
在这里插入图片描述
第三步:
在这里插入图片描述
由上可见,即使是最极端的例子也只进行了2次合并运算,所以我们可以得出结论,在2048进行运算时的顺序是 去0运算——合并运算——去0运算——合并运算
所以我们可以写出下面的代码:









def move(dire,list1):             # h表示行 s表示列       
    qu0(dire,list1)
    heB(dire,list1)
    qu0(dire,list1)
    heB(dire,list1)

那么,最繁琐的移动过程就这么结束喽(鼓掌,啪啪啪),接下来就是产生随机数了

第三步

系统会在空白的地方随即出现一个数字方块,系统给予的数字方块不是2就是4
这玩意儿挺简单的,我们可以让系统随机生成一个坐标地址,然后我们再检验这个坐标地址内的数字是否为0。如果为0,就随机填一个2或4进去,如果不为0,那咱们就再随机生成一个坐标地址,然后接着检验,直到这个坐标内的数字为0

代码如下:

def mainmap(map_list):
    count = 0
    while (count < 1):
        a = r.randint(0, 3)
        b = r.randint(0, 3)
        if map_list[a][b] == 0:
            c = r.choice([2, 4])
            map_list[a][b] = c
            count += 1

写到这,一个基本的框架就差不多完成了,接下来就是判定游戏胜负的时候了

第四步

玩家在这小小的16格范围中凑出“2048”这个数字方块,就能判定为游戏的胜利。如果这个16格的范围内,已经没有空间(0)可以移动了,那么游戏就判定为失败。

这其实我们只需要遍历每个表格中的数字,如果有一个数字为2048,就判定胜利,所有表格中,没有一个表格里的数字为0,就判定失败。
代码如下:

def panding(list1):
        panding = 0
        count = 0
        for i in list1:
            for b in i:
                if (b == 2048):
                    panding = 1
                if (b == 0):
                    count = 1
        if (panding == 1):
            print("恭喜您,挑战成功")
            input()
            break

        if (count == 0):
            print("真遗憾,挑战失败")
            input()
            break

到这边,2048的游戏已经可以正常的玩耍了,但是浪漫的人不能满足于此, 我们来给表格添上一个好看 的框框

def kuangkuang(list1):
     print("+----+----+----+----+")
    for i in list1:
        a=i[0]
        b=i[1]
        c=i[2]
        d=i[3]
        print("|    |    |    |    |")
        print("| {0}  |  {1} |  {2} |  {3} |".format(a,b,c,d))
        print("+----+----+----+----+") 

终于,我们终于把它给攻占完了(撒花)
最后让我们把它们拼接在一起吧

def main():
    print("哇呼,你发现了一个2048,要不要进行游戏")
    input()
    print("1.好的 2.没问题 3.棒极了")
    input()
    print("请使用wasd进行操作,w为往上滑,s为往下滑,a为往左滑,d为往右滑")
    input()

    print("那么,游戏开始喽。")
    map1(list1)
    while True:
        dire = input("请输入方向:")
        if dire == "abc":
            break
        move(dire, list1)
        mainmap(list1)
        kuangkuang(list1)
        panding(list1)

Nice!结束喽,下次见,88!

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!