前言
2048这个小游戏最初在微信上玩过,游戏规则简单,大致如下:
- 游戏面板为4*4共16格
- 初始化时随机产生一个数字2或4,将这个数字随机放到16格的一格之中
- 通过上、下、右、四个方向键朝一个方向移动面板中的数字使其靠拢或合并,这些数字:
- 每次操作不能交叉移动、只能在同行或同列根据按键方向做单方向平行移动
- 在移动的方向中,当每行/列中的数字存在相邻的重复项、或数字之前存在空格时,才可移动
- 在一次移动中:遇空格直接移入、最先相邻的2个相同的数字直接合并成一个新数字(并消除之前2个相同的数字),该行/列中后面其他数字再按该方向移动,直至该行/列数字间没有空格
- 在一次移动中:合并新生成的数字将不再与其他相同的数字合并消除
- 每按方向键一次,如有数字被移动(含合并消除),则随机在某个空格中产生一个数字2或4
- 已合并生成的最大的数字为当前游戏得分
- 当游戏面板中布满非0数字、且不可再合并时,格子中数据将无法移动,游戏结束
准备工作
- 安装 python 3.6
- 安装第三方库 pygame
- Windows上在cmd中安装:py -m pip install -U pygame --user
- Centos上在终端中安装:yum install python3-pygame
- Ubuntu上在终端中安装:python3 -m pip install -U pygame --user
编程思路
用python编写游戏算法类,实现游戏数据操作:cls2048.py
- 用二维列表(4*4数组/矩阵)来操作游戏数据
- 将游戏面板中的空格单元在列表元素中的数据值设为0
- 每按键一次对应所有行/列的数据单方向移动
- 以单行和列移动为最小操作单元
- 如对应的数据在该按键方向上不能产生移动或数据合并,那么不随机产生新的数据
- 当有数据合并产生或者数据移动位置时,随机在空格处产生一个数据
- 向左移动或向右移动是对行数据操作、向上或向下移动是对列数据进行操作
- 向上移动等价于将二维列表先转置后的向左移动、然后再将数组转置还原的效果
- 向下移动等价于将二维列表先转置后的向右移动、然后再将数组转置还原的效果
- 在空格单元中随机生成2或4的数据:需要选择随机的位置和随机产生的值
- 当列表4*4全部非0值,且无相邻两个数值相同时,游戏结束
用pygame绘制游戏棋盘界面、控制按键操作、数据展示:pygame2048.py
- 初始化游戏棋盘,分为两个区域:标题游戏状态区(得分、计时),游戏棋盘区
- 利用pygame.event捕获按键、操作游戏数据
- 显示游戏数据:画线用 pygame.draw,写字用pygame.font,渲染图形至界面用surface.bilt()、刷新surface上新数据pygame.display.update()
利用pygame库编写游戏主程序的最小框架流程如下
pygame.init() #所有图形显示均依赖于这个界面实体surface(可以理解成画板) surface = pygame.display.set_mode(width, height) pygame.display.set_caption("window_caption") while True game_interation_process #刷新窗口数据显示:调用该函数后图形元素和数据才在surface上更新 pygame.display.update()
实现效果(UI有点太丑)
- Windows上在IDLE中打开pygame2048.py,按F5运行
- 或在cmd中执行:py pygame2048.py
- Linux中(该截图来自Ubuntu 14.04)在Terminl里执行:python3 pygame2048.py
说明:如想UI更好看,设计UI后用pygame针对背景色、字体、游戏格子等进行调整即可。
Comments