吃金豆游戏的分析与设计

更新时间:2023-10-21 11:12:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

三、吃金豆游戏的分析与设计

1、游戏功能分析

(1) 游戏基本功能:

游戏屏幕是一个 NxN 的网格,其中某些格子是固定的墙壁,其他网格是可以通行的,开始的时候放满了金豆。游戏开始后,玩家通过键盘的方向键控制游戏主角PACMAN移动,经过的地方,金豆被吃掉,同时加分。游戏屏幕上还有一个怪物,它会随机地移动。PACMAN如果碰到怪物,游戏失败。如果吃掉了全部金豆,则游戏成功。

(2) 游戏场景(即墙壁和金豆的位置,PACMAN与怪物的初始位置等信息)是从文件 scene.txt 中读到的。格式如下:

10,10 //(10,10)代表场景总的行,列数

1111111111 //第一行,10列,其中1表示墙;0表示金豆 1A11100001 //第二行中’A’代表PACMAN的初始位置 1000101101 1110101101 1000000101 1011011101 1011010001 1011000101

1M000100M1 //这一行中的’M’代表一个MONSTER的初始位置,二个M代表两个妖怪 1111111111

数据文件对应的游戏场景如下图所示:

2、游戏出现的各个对象:

Empty Scene Pacman Bean Monster Wall

分析:一个场景分成N 行N列的小Cell,每个Cell有行,列等属性。 Pacman,Monster,Bean,Wall,Empty又可看作是一个特殊的Cell。Pacman和Monster是可运动的,而Bean和Wall是静止的,此外它们场景在绘出来的图像也各不相同。

2.1数据结构的定义:

(1)静止的Cell,分为三种类型,定义如下: #define EMPTY 0 #define WALL 1 #define BEAN 2 #defien CELL_SIZE 32

typedef struct{

int kind; /*Cell的类型*/ int row; int col; }Cell;

与Cell相关的函数定义:

void drawCell(Cell t){ /*画出一个Cell*/ switch(t.kind){

case EMPTY: draw_empty(t);break; case WALL: draw_wall(t);break; case BEAN: draw_bean(t);break; } }

void draw_empty(Cell t); void draw_wall(Cell t); void draw_bean(Cell t);

(2)场景是由M*N个Cell构成的,场景定义如下: #define MAX_ROLS 30 /*最大行数*/ #define MAX_COLS 30 /*最大列数*/ int rols; /*实际总行数*/ int cols; /*实际总列数*/

int scene_left; /*场景左上角的坐标*/ int scene_top;

Cell scene[MAX_ROLS][MAX_COLS]; /*用一个元素为Cell的二维数组代表场景*/

与场景相关的函数定义:

void loadScene(char *fileName); /*从文件加载场景至scene数组*/ void drawScene(void); /*画出场景*/

(3) Pacman和Monster都游戏中可运动的的角色(Actor),其结构定义如下:

#define RIGHT 0 #define UP 1 #define LEFT 2 #define DOWN 3 #define TRUE 1 #define FALSE 0 typedef struct{ int row; int col;

int direction; /*运动的方向*/ int isLive; /*是否活着*/ }Actor;

与Actor相关的函数定义: 1)角色pacman

void drawPacman(void); /*画pacman*/

void turn_pacman(int key_code); /*根据玩家方向按键调整pacman的运动方向*/ void move_pacman(); /*pacman移动*/ 2)角色monster

void drawMonster(void); /*画妖怪*/ void move_monster(void); /*妖怪移动*/

3、功能模块的划分

使用自顶向下、逐步求精的模块法设计该程序,可以将问题分解为3个部分: (1)游戏初始化 (2)开始玩游戏 (3)结束处理

每个方面包括一个模块,根据上述思路,我们可以划分程序结构如下: void main(){

init(); //初始化

gamePlay(); //游戏循环 closeGame(); //结束处理 }

1)初始化游戏 void init(){

.初始化图形模式

.初始化随机数发生器(作用见后述) .游戏场景加载(从文件中读取) .计算场景左上角的坐标 .画场景 }

2)结束处理

void closeGame(){

closegraph(); /*关闭图形模式*/

}

3)玩游戏的算法(核心) void gamePlay(){

while(游戏未结束时){ if(如果没有键按下){ draw_pacman(); draw_monster();

判断pacman所在的位置有没有金豆,有则吃掉; if(金豆全吃完) break;

delay(500); //延时一段时间; move_pacman();

if(pacman被吃) break; move_monster();

if(pacman被吃) break;

}else{

捕获按下的键;

根据按键调整pacman的运动方向 } } }

4、功能模块逐步求精

1、游戏场景加载(从文件中读取) void loadScene(char *fileName){ 打开记录场景的文件; 逐行读取数据,完成:

场景rows,cols的记录 scene数组的初始化 金豆数量的统计等等

}

2、pacman移动算法: void move_pacman(){ if(下一位置可达){

清除掉当前位置pacman;

将下一位置做为pacman的新位置; } }

求精:下一位置是否可达?

int is_forwardable(Actor *actor){ Cell t;

t = nextCell(actor); //求actor下一个要去的Cell

return is_reachable(t.row,t.col); //指定行和列的位置是否可达 }

int is_reachable(int row,int col){

if(行或列超出范围)

return FALSE;

switch(scene[row][col].kind){ case BEAN: case EMPTY:

return TRUE; default:

return FALSE; } }

3、画pacman和monster

void draw_pacman(void); //略 void draw_monster(void); //略

4、monster移动算法:

本文来源:https://www.bwwdw.com/article/yrpf.html

Top