小白2048小游戏速成教程(python不到100行)

举报
兔老大 发表于 2021/05/07 05:06:41 2021/05/07
【摘要】 规则与效果 2048游戏共有16个格子,初始时会有两个格子上安放了两个数字2,每次可以选择上下左右其中一个方向去滑动,每滑动一次,所有的数字方块都会往滑动的方向靠拢外,系统也会在空白的地方随即出现一个数字方块,相同数字的方块在靠拢、相撞时会相加。系统给予的数字方块不是2就是4,玩家要想办法在这小小的16格范围中凑出“2048”这个数字方块。 1.游戏介绍: 《204...

规则与效果

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

1.游戏介绍:

《2048》,是一款益智小游戏,这款游戏是由年仅19岁的意大利程序员加布里勒希鲁尼(Gabriele Cirulli)开发出来的,官方版本只能在网页上或通过其移动网站运行。

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

前言

 

这些代码也是大一刚来写的,我找来,注释了一下就贴了上来,估计难免会有错误,请大佬们原谅。也并没有用python的一些神操作,比如旋转啥的,当时刚来哪知道呢,还是用基本的语法写出来比较好。

所以这种实现方法可能不是最优的,但是是萌新最好理解的。

(提示:还是先玩一玩2048,体会一下规则比较好。)

 

主体

 

2048的主体就是一个二维列表,玩家对列表元素进行操作。

梳理一下我们要写的东西:首先要有打印功能,生成数字的功能,用户上下左右操作的实现,然后判断游戏是否结束。整合以后循环操作就好了。

好,开始。

首先生成我们的游戏主体,一个二维列表

l=[[0 for i in range(4)] for i in range(4)]#生成二维列表
 

python的列表生成式[x for y in range()] ,简单介绍一下,x是要生成的元素,右边放一个循环,也就是要生成的个数。

这一行代码首先是生成一维列表,每个元素皆为0,然后把一维列表当作x,生成多个一维列表,也就是所谓的二维列表了。

(c你a[][]就好)

 

打印功能

 

主体生成好了,我们要把它打印出来

为了美观,我写了一个函数,0就不打印出来了(0代表没有数字)


  
  1. def gg(x):#显示
  2. if x>0:
  3. return x
  4. else:
  5. return ""

如果是0就返回空,然后结合打印函数


  
  1. def dayin(l):#打印函数
  2. print("\r\
  3.           ┌──┬──┬──┬──┐\n\
  4.           │%4s│%4s│%4s│%4s│\n\
  5.           ├──┬──┬──┬──┤\n\
  6.           │%4s│%4s│%4s│%4s│\n\
  7.           ├──┬──┬──┬──┤\n\
  8.           │%4s│%4s│%4s│%4s│\n\
  9.           ├──┬──┬──┬──┤\n\
  10.           │%4s│%4s│%4s│%4s│\n\
  11.           └──┴──┴──┴──┘" \
  12. %(gg(l[0][0]),gg(l[0][1]),gg(l[0][2]),gg(l[0][3]),
  13. gg(l[1][0]),gg(l[1][1]),gg(l[1][2]),gg(l[1][3]),
  14. gg(l[2][0]),gg(l[2][1]),gg(l[2][2]),gg(l[2][3]),
  15. gg(l[3][0]),gg(l[3][1]),gg(l[3][2]),gg(l[3][3]),))

打印函数请自行发挥想象力用代码画出来,我这只给出一个很简陋的界面。结合gg函数,把0去掉,并不显示。

 

随机生成数字

这样,我们的基本框架就有了,接下来我们要生成数字。下面给出生成随机位置和随机数的函数和详细注释


  
  1. import random
  2. def shengcheng(n):#生成n个随机数
  3. tt=0#记录生成了几个数
  4. qq=0#作用是循环过多次数就跳出,说明位置不够了,
  5. while 1:#循环生成
  6. if random.randrange(0,5)>1:#生成2或4的概率可以自行修改
  7. k=2#k是要生成的数
  8. else:
  9. k=4
  10. a=random.randrange(0,4)#随即坐标
  11. b=random.randrange(0,4)
  12. if l[a][b]==0:#如果这个位置没有数字
  13. l[a][b]=k#就赋值
  14. tt+=1#并且tt加1,记录个数
  15. qq+=1#无论如何都记录循环次数
  16. if tt==n or qq==10000:#达到n个或者位置不够了
  17. break#跳出循环
  18. dayin(l)#生成完了记得打印

生成完了要给用户打印出来哦。

 

核心操作

 

生成完了我们就要写最核心的部分了:用户的上下左右操作。逻辑一定要搞明白。

游戏效果就是合并相邻相同的数字,比如向左合并,2 2 4 4合并为4 8 0 0,2 4 4 2合并为2 8 2 0,2 2 4 8合并为4 4 8 0.

先给出向左的操作如何实现。

注意:这一段代码是核心思想,一定要弄懂2048的规则,并且自己实现出来,再不济也要理解贴出来的代码。

注释已经尽量详细了。


  
  1. def left():#向左
  2. for i in range(4):#遍历每一行
  3. for j in range(3):#遍历每一行的每个元素
  4. for k in range(j+1,4):#遍历j右边的元素
  5. if l[i][k]!=0:#如果不是零,进行操作。
  6. #是零就可以遍历下个k,因为0不会对本个j和下面的k的合并产生影响。
  7. #注意2048不能跨过一个数进行合并,比如242,2和2不能合并
  8. if l[i][j]==0:#本个j是0
  9. l[i][j]=l[i][k]#把j赋值为k
  10. l[i][k]=0#k为0
  11. #其实就相当于移动了那个元素
  12. #比如:0 2 x x,无论如何先把2移到0那里,也就是2 0 x x
  13. elif l[i][j]==l[i][k]:#如果相等
  14. l[i][j]=2*l[i][j]#合并
  15. l[i][k]=0#k位置就是0
  16. break
  17. #合并后跳出循环,因为本个j位置不能再和其他位置合并了
  18. #比如:2 2 2 x,变为4 2 x 0,2 2 4 x变为4 4 x 0而不是合并为8
  19. else:
  20. break#都不为零,而且不相同,相当于2 4 x x,就算x是2也不能合并
  21. #直接排除本个j位置。

其它三个方向思想类似,直接贴出来了。

向下:


  
  1. def down():#向下的操作
  2. for i in range(4):
  3. for j in range(3,0,-1):
  4. for k in range(j-1,-1,-1):
  5. if l[k][i]!=0:
  6. if l[j][i]==0:
  7. l[j][i]=l[k][i]
  8. l[k][i]=0
  9. elif l[j][i]==l[k][i]:
  10. l[j][i]=2*l[j][i]
  11. l[k][i]=0
  12. break
  13. else:
  14. break

向上:


  
  1. def up():#向上
  2. for i in range(4):
  3. for j in range(3):
  4. for k in range(j+1,4):
  5. if l[k][i]!=0:
  6. if l[j][i]==0:
  7. l[j][i]=l[k][i]
  8. l[k][i]=0
  9. elif l[j][i]==l[k][i]:
  10. l[j][i]=2*l[j][i]
  11. l[k][i]=0
  12. break
  13. else:
  14. break

向左是第一个

向右:


  
  1. def right():#向右
  2. for i in range(4):
  3. for j in range(3,0,-1):
  4. for k in range(j-1,-1,-1):
  5. if l[i][k]!=0:
  6. if l[i][j]==0:
  7. l[i][j]=l[i][k]
  8. l[i][k]=0
  9. elif l[i][j]==l[i][k]:
  10. l[i][j]=2*l[i][j]
  11. l[i][k]=0
  12. break
  13. else:
  14. break

检查是否结束

 

核心写完了,我们还要写检查是否继续的函数

逻辑也很好想,就是相邻上下左右是否有一样的或者有0.


  
  1. def jiancha():#检查是否输了
  2. q=0
  3. for i in range(4):
  4. for j in range(3):
  5. if l[i][j]==0 or l[i][j+1]==0 or l[i][j]==l[i][j+1] or l[j][i]==l[j+1][i]:
  6. q=1
  7. return q
  8. return q

一检查到可以继续就立刻停了就好。一直到最后都没有满足条件就是无法继续了

 

整合功能

功能写的差不多了就可以整合在一起了啊


  
  1. def main():#主体
  2. print("欢迎大家来玩我滴2048小游戏哈,感觉比以前的更人性化,因为能力有限,如果发现bug赶紧告诉我哈")
  3. print("规则不介绍了,wsad控制方向")
  4. n=int(input("想玩什么难度?简单扣1,中等扣2,困难扣3"))
  5. shengcheng(n)#先生成n个数
  6. while 1:#循环操作
  7. if jiancha()==0:#先检查是否结束
  8. print("完蛋,笨")
  9. break
  10. k=input("输入操作")#接受上下左右操作
  11. if k=="w":
  12. up()
  13. elif k=="s":
  14. down()
  15. elif k=="a":
  16. left()
  17. elif k=="d":
  18. right()
  19. shengcheng(n)#操作完后再次生成

结束了以后可以算个分数:


  
  1. def ftz():#最后得分
  2. main()
  3. h=0
  4. for i in range(4):
  5. for j in range(4):
  6. h+=l[i][j]
  7. print("得分",h)

最后调用函数

ftz()
 

简陋的2048就完成啦。

心里有点浮躁,还有别的事,就是拿以前的代码瞎写上一写。

如果有错误,那简直太好了,赶紧告诉我。

如果用js可能更好,以后再更

玩法攻略

 

最后送给大家攻略

2048朝代版这类以数字游戏为原型的游戏是肯定有规律的,新手玩家们不要随意乱移,这款游戏最佳的模式是按照升序或者降序的方式来排列合并,最左上角是最大的格子,其次是次大的,按序列递减,这样的排列效率较高,且省去一些麻烦的思考与计算。

那么我们再来看看如果是自己肆意排列会产生什么样的效果,在自己随意移动,排列无序的情况下,很容易出现最大数格子位置不稳定,而周围同样的格子也很分散,难以使用,成为白白占用空间而无作用的格子。入下图中显示,这样移动一下宋在中间,一下在左下角,周围的要合并的汉,秦也难以凑到一起。于是就要另外再合过秦,汉来合并,这样又造成不必要的浪费。

文章来源: fantianzuo.blog.csdn.net,作者:兔老大RabbitMQ,版权归原作者所有,如需转载,请联系作者。

原文链接:fantianzuo.blog.csdn.net/article/details/81663648

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。