Python Pygame贪吃蛇游戏分析

我们之前学习了新的模块 Pygame,并尝试使用它绘制了一些图形、编写了简单的动画。在本节教程中,我们将使用 Pygame 的图形化用户界面来创建一款经典游戏——贪吃蛇。这款游戏开始运行的界面如图 1 所示。

Python贪吃蛇游戏
图 1

程序分析

贪吃蛇是一款经典的益智游戏,有 PC 和手机等多种版本,既简单又耐玩。玩家通过上下左右键控制蛇的方向,寻找食物,每吃到一次食物,就能得到一定的积分,而且蛇的身体会越来越长。随着蛇的身体变长,游戏的难度就会变大。当蛇碰到四周的墙壁,或者碰到自己的身体的某一个部位的时候,游戏就结束了。

我们来看一下用 Python 编写这款游戏的主要思路,完整代码最后给出。

地图

我们将整个游戏界面看成是由许多个小方块组成的,每个方块代表一个单位。这样一来,游戏界面就由若干个小方块形成一个地图,地图上的每个位置都可以表示为小方块的整数倍,如图 2 所示。

Python贪吃蛇地图
图 2
 
贪吃蛇的长度也用这个小方块来表示,每次吃到食物,蛇身的长度就会增加一个单位。

程序界面

这是一款完整的游戏,所以我们一共为其设计了 3 个界面,除了游戏界面以外,还包括游戏开始界面和游戏结束界面。

自定义函数

我们要创建的函数包括:main(主程序)、startGame(游戏开始)、runGame(运行游戏)、drawFood(绘制食物)、drawSnake(绘制贪吃蛇)、drawScore(绘制成绩)、moveSnake(移动贪吃蛇)、isEattingFood(是否吃到食物)、isAlive(判断贪吃蛇是否死掉了)、gameOver(游戏结束)和 terminate(终止游戏)。

事件

我们要用到的事件是键盘事件。键盘事件是玩家操控贪吃蛇移动的时候发生的事件。我们会在后面介绍的 startGame() 函数和 gameOver() 函数中监听键盘事件,并且根据事件类型,来做相应的处理。

声音

我们会在游戏开始后,调用 Sound 对象的 play() 方法,播放的背景音乐。

导入模块

首先,将在程序中用到的模块都导入。我们要使用 Pygame 的函数,因此需要导入 Pygame 模块。除此之外,我们还会用到 sys 模块和 random 模块。sys 模块负责程序与 Python 解释器的交互,用于操控 Python 运行时的环境,程序要使用 sys 模块的 exit() 函数来退出游戏。random 模块用于生成随机数。

导入这 3 个模块的语句如下所示:
import pygame
import random
import sys

初始化设置

为了进行游戏启动和运行前的准备工作,程序需要做一些初始化设置工作,包括定义程序要用到的颜色、方向变量,确定游戏窗口和地图的大小,定义游戏需要用到的一些其他变量等。先来看看这部分初始化代码。

定义颜色变量

游戏中要用到的颜色主要包括如下几种。在第12章中,我们介绍过 RGB 颜色的概念,以及用元组来设置颜色常量的方法。
WHITE = (255, 255, 255)
GREEN = (0, 255, 0)
DARKGREEN = (0, 185, 0)
YELLOW = (255,255,0)

定义方向变量

为了能够让玩家能够操控贪吃蛇的方向,我们在程序中定义了 4 个方向变量,分别和玩家操控贪吃蛇移动的上下左右相对应。
UP = 1
DOWN = 2
LEFT = 3
RIGHT = 4

定义窗口大小

我们要为贪吃蛇游戏定义一个窗口,让贪吃蛇在这个窗口中移动。我们通过两个变量来定义窗口的宽和高,这是一个宽 800 像素、高 600 像素的矩形窗口。
windowsWidth = 800
windowsHeight = 600

定义地图大小

我们使用变量 mapWidth 和 mapHeight 来表示地图的宽和高。需要注意的是,地图的宽和高都是基础单位 cellSize 的整数倍。
cellSize = 20                                #定义基础单位大小 
mapWidth = int(windowsWidth / cellSize)      #地图的宽
mapHeight = int(windowsHeight / cellSize)    #地图的高

其他变量

程序还会用到如下两个变量:
HEAD = 0              #贪吃蛇头部下标
snakeSpeed = 7        #贪吃蛇的速度