前些天在b站上看到有个大佬用c写了一个2048小游戏,我便一下来了兴趣。心想着,我貌似也能用Python来整一波,话很少说,直接开搞。
2048的游戏规则:
2048游戏共有16个格子,初始时会有两个格子上安放了两个数字2,每次能够选择上下左右其中一个方向去滑动,每滑动一次,全部的数字方块都会往滑动的方向靠拢外,系统也会在空白的地方随即出现一个数字方块,相同数字的方块在靠拢、相撞时会相加。系统给予的数字方块不是2就是4,玩家要想办法在这小小的16格范围中凑出“2048”这个数字方块
python
我们能够从游戏规则里面一步一步来:数组
第一步:框架
2048游戏共有16个格子,初始时会有两个格子上安放了两个数字2
这一步比较简单,咱们能够创建一个二维数组,而后随机在上面放上两个数字2
用代码就能够这么写:
spa
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
第二步:code
每次能够选择上下左右其中一个方向去滑动,每滑动一次,全部的数字方块都会往滑动的方向靠拢,相同数字的方块在靠拢、相撞时会相加。orm
这一步就是这个游戏里,比较复杂的地方了。这里涉及到两种运算,我称之为,去0运算和合并运算blog
去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,若是是,那么咱们就把这个格子里的数字移动到前一个格子里。input
合并运算:
相同数字的方块在靠拢、相撞时会相加
(示意图就不给画了,大家应该都能想象,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!