本节教程通过 2048 的小游戏快速、完整地呈现了使用 Python 语言编程的过程,将之前介绍的内容有机地结合在了一起 。2048是一款流行于手机、平板等终端设备上的益智小游戏,最早于 2014 年 3 月发行,主界面如图 1 所示。
图 1:2048 小游戏的主界面
其游戏规则是:每次可以选择上下左右其中一个方向去滑动,每滑动一次,所有的数字方块都会往滑动的方向靠拢,系统也会在空白的地方随机出现一个数字方块,相同数字的方块在靠拢、相撞时会相加。系统给予的数字方块不是 2 就是 4,玩家要想办法在这小小的 16 格范围中凑出“2048”这个数字方块。
网友总结的游戏技巧有:
- 最大数尽可能放在角落;
- 数字按顺序紧邻排列;
- 首先满足最大数和次大数在的那一列/行是满的;
- 时刻注意活动较大数(32以上)旁边要有相近的数;
- 以大数所在的一行为主要移动方向;
- 不要急于“清理桌面”;
- 根据游戏规则,可以整理出游戏的流程,如图 2 所示。
图 2:2048 小游戏的主要流程
根据流程图,可以将整个游戏程序大致分为三个部分:
- 程序初始化;
- 判断用户输入;
- 进入游戏主循环。
其中第三部分可以继续细分为以下三个部分:
- 等待操作;
- 判断操作并处理;
- 重新开始或退出。
为了游戏界面效果美观,这里使用了 pygame 库。安装 pygame 库的命令如下:
1. pip install pygame
安装过程如图 3 所示。
图 3:pygame 库安装过程
下面我们继续关注 2048 小游戏。首先来看程序初始化,这里主要完成以下工作:导入所需模块,初始化棋盘和窗口界面,初始化各种组件和变量。根据游戏规则,棋盘大小为 4×4 共 16 格的正方形棋盘,简便起见我们使用二维列表存储每个格子里的数字。
定义棋盘并初始化每个格子存储的数字的语句如下:
board = [[0, 0, 0, 0]
[0, 0, 0, 0],
[0, 0, 0, 0],
[0, 0, 0, 0]]
以下语句用于初始化窗口的相关属性:
#每个格子的边长,单位:像素(下同)
box_size = 50
#格子之间的间距
box_gap = 5
#中心棋盘区域上边缘离窗口顶部的距离
top_of_window = 100
#中心棋盘区域下边缘离窗口底部的距离
bottom_of_window = 30
#中心棋盘区域左边缘离窗口左边的距离
left_of_window = 2 0
#窗口宽度
window_width = box_size * 4 + box_gap * 5 + left_of_window * 2
#窗口高度
window_height = top_of_window + box_gap * 5 + box_size * 4 + left_of_window + bottom_of_window
#初始化窗口
window = pygame.display.set_mode((window_width, window_height), 0, 32)
#窗口标题
pygame.display.set_caption("2048")
#得分
score = 0
#使用 pygame 内置颜色值定义一些颜色常量
OLDLACE = pygame.color.THECOLORS["oldlacen"]
IVORY = pygame.color.THECOLORS["ivory3"]
BLACK = pygame.color.THECOLORS["black"]
RED = pygame.color.THECOLORS["red"]
RED2 = pygame.color.THECOLORS["red2"]
DARKGOLD = pygame.color.THECOLORS["darkgoldenrodl"]
GOLD = pygame.color.THECOLORS["gold"]
GRAY = pygame.color.THECOLORS["gray41"]
CHOCOLATE = pygame.color.THECOLORS["chocolate"]
CHOCOLATE1 = pygame.color.THECOLORS["chocolate1"]
CORAL = pygame.color.THECOLORS["coral"]
CORAL2 = pygame.color.THECOLORS["coral2"]
ORANGED = pygame.color.THECOLORS["orangered"]
ORANGED2 = pygame.color.THECOLORS["orangered2"]
DARKORANGE = pygame.color.THECOLORS["darkorange"]
DARKORANGE2 = pygame.color.THECOLORS["darkorange2"]
FORESTGREEN = pygame.color.THECOLORS["forestgreen"]
#界面字体
FONTNAME = "SimHei"
绘制棋盘格子主要由 Box 类和 draw_box( ) 函数完成:
class Box:
def __init__(self, topleft, text, color):
self.topleft = topleft
self.text = text
self.color = color
def render(self, surface):
x, y = self.topleft
#绘制棋盘格
pygame.draw.rect(surface, self.color, (xz y, box_size, box_ size))
#定义棋盘格中数字的高度
text_height = int(box_size * 0.35)
#设置棋盘格中数字使用的字体
font_obj = pygame.font.SysFont(FONTNAME, text_height)
text_surface = font_obj.render(self.text, True, BLACK)
text_rect = text_surface.get_rect()
text_rect.center = (x + box_size / 2, y + box_size / 2)
surface.blit(text_surface, text_rect)
def draw_box():
giobal board
#定义棋盘上每个格子中不同数字的颜色
colors = {
0 : (192, 192, 192) , 2 : (176, 224, 230