零基础入门Python游戏
上QQ阅读APP看书,第一时间看更新

3.2 项目规划

了解了游戏的效果以及功能后,现在分析它的设计思路和整体规划。

1. 状态模型

由于将要实现的《飞机大战》游戏有四个不同的界面,那么如何在同一个窗口且只有一个Display Surface的情况下实现这四个不同的界面呢?

这里使用状态模型。把不同的界面用不同的状态表示,每种状态下所做的事情和向屏幕绘制的内容是不同的。这里涉及的状态有WELCOME、RUN、GAMEOVER、PAUSE,它们分别对应于开始界面、游戏界面、结束界面和暂停界面。

不同状态下所做的事情分别如下。

WELCOME:

·绘制背景图、飞机大战Logo、Start按钮;

·响应处理Start按钮。

RUN:

·绘制背景图、我方飞机、子弹、敌方飞机、Pause/Resume按钮、分数;

·移动背景图、我方飞机、子弹、敌方飞机;

·碰撞检测;

·响应处理Pause/Resume按钮。

GAMEOVER:

·绘制背景图、提示方框、分数、Restart按钮、Exit按钮;

·响应处理Restart/Exit按钮。

PAUSE:

·绘制背景图、我方飞机、子弹、敌方飞机、Pause/Resume按钮、分数;

·响应处理Pause/Resume按钮。

其中,各个状态之间的转换关系如图3-5所示。

图3-5 状态模型之间的转换关系

游戏开始执行时,首先进入的是WELCOME状态。在WELCOME状态下,单击Start按钮进入RUN状态。在RUN状态下,单击Pause/Resume按钮进入PAUSE状态,我方飞机碰撞到敌方飞机则进入GAMEOVER状态。在GAMEOVER状态下,单击Restart按钮进入RUN状态。在PAUSE状态下,单击Pause/Resume按钮进入RUN状态。

该状态模型将在本程序中起到主线的作用,编写代码时,几乎在做任何事情之前都要确认当前所处的状态。

2. 目录结构

除了上面提到的状态模型,该程序的整体结构并不复杂,都只是对前面所介绍的Pygame理论知识的运用。

本章我们所要实现的飞机大战游戏的目录结构如图3-6所示。

图3-6的左侧为工程目录结构,右侧为各个py文件所包含的类。

在工程目录中,res目录存储的是资源相关的文件,包含字体、图片以及音频文件;source目录包含所有py源文件。下面介绍其中每个py文件的用途及其所包含的类。

·background.py:定义了背景类Background。

图3-6 《飞机大战》工程目录结构

·bullet.py:定义了子弹类Bullet。

·button.py:定义了按钮类Button。

·enemy.py:定义了敌机相关的类Enemy、EnemySmall、EnemyMiddle、EnemyBig;其中,Enemy类是其他三个类的基类。

·game.py:定义了游戏类Game,它是对游戏显示和控制起主要作用的类。

·hero.py:定义了我方飞机类Hero。

·image.py:定义了Image类,用来集中加载游戏所用到的全部图片。

·sound.py:定义了声音类Sound,用来控制音乐与音效的播放。

·stats.py:定义了Stats类,用来记录游戏状态。

·widgets.py:定义了游戏界面上用到的一些小部件类,其中Logo类用来显示“飞机大战”Logo,EndPrompt类用来显示结束界面上的提示方框,Scoreboard类用来显示记分牌,PauseResume类用来显示和控制暂停/恢复按钮。

·plane_wars.py:定义了整个程序的入口。

接下来就让我们按照这里给出的设计思路,从零开始一步步地实现《飞机大战》游戏。