好文档就是一把金锄头!
欢迎来到金锄头文库![会员中心]
电子文档交易市场
安卓APP | ios版本
电子文档交易市场
安卓APP | ios版本

吃金豆游戏的分析与设计.docx

6页
  • 卖家[上传人]:拖***
  • 文档编号:299821972
  • 上传时间:2022-05-28
  • 文档格式:DOCX
  • 文档大小:18.02KB
  • / 6 举报 版权申诉 马上下载
  • 文本预览
  • 下载提示
  • 常见问题
    • 本文格式为Word版,下载可任意编辑吃金豆游戏的分析与设计 三、吃金豆嬉戏的分析与设计 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又可看作是一个特殊的CellPacman和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移动算法: — 6 —。

      点击阅读更多内容
      关于金锄头网 - 版权申诉 - 免责声明 - 诚邀英才 - 联系我们
      手机版 | 川公网安备 51140202000112号 | 经营许可证(蜀ICP备13022795号)
      ©2008-2016 by Sichuan Goldhoe Inc. All Rights Reserved.