Python:利用pygame库实现小游戏2048

2018年04月10日 3892Browse 11Like 0Comments

前言

2048这个小游戏最初在微信上玩过,游戏规则简单,大致如下:

  • 游戏面板为4*4共16格
  • 初始化时随机产生一个数字2或4,将这个数字随机放到16格的一格之中
  • 通过上、下、右、四个方向键朝一个方向移动面板中的数字使其靠拢或合并,这些数字:
    • 每次操作不能交叉移动、只能在同行或同列根据按键方向做单方向平行移动
    • 在移动的方向中,当每行/列中的数字存在相邻的重复项、或数字之前存在空格时,才可移动
    • 在一次移动中:遇空格直接移入、最先相邻的2个相同的数字直接合并成一个新数字(并消除之前2个相同的数字),该行/列中后面其他数字再按该方向移动,直至该行/列数字间没有空格
    • 在一次移动中:合并新生成的数字将不再与其他相同的数字合并消除
    • 每按方向键一次,如有数字被移动(含合并消除),则随机在某个空格中产生一个数字2或4
  • 已合并生成的最大的数字为当前游戏得分
  • 当游戏面板中布满非0数字、且不可再合并时,格子中数据将无法移动,游戏结束

准备工作

  1. 安装 python 3.6
  2. 安装第三方库 pygame
    1. Windows上在cmd中安装:py -m pip install -U pygame --user
    2. Centos上在终端中安装:yum install python3-pygame
    3. 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针对背景色、字体、游戏格子等进行调整即可。

源码示例

2048小游戏python代码

Sunflower

Stay hungry stay foolish

Comments