简易生态系统分析设计报告.docx

上传人:b****5 文档编号:30194542 上传时间:2023-08-07 格式:DOCX 页数:26 大小:1,000.39KB
下载 相关 举报
简易生态系统分析设计报告.docx_第1页
第1页 / 共26页
简易生态系统分析设计报告.docx_第2页
第2页 / 共26页
简易生态系统分析设计报告.docx_第3页
第3页 / 共26页
简易生态系统分析设计报告.docx_第4页
第4页 / 共26页
简易生态系统分析设计报告.docx_第5页
第5页 / 共26页
点击查看更多>>
下载资源
资源描述

简易生态系统分析设计报告.docx

《简易生态系统分析设计报告.docx》由会员分享,可在线阅读,更多相关《简易生态系统分析设计报告.docx(26页珍藏版)》请在冰豆网上搜索。

简易生态系统分析设计报告.docx

简易生态系统分析设计报告

面向对象程序设计B(C++)综合实验

 

学号:

姓名:

专业班级:

计算机0901班

目录

一、简介1

二、需求分析1

2.1主要功能列表1

2.2用例模型2

(1)简单生态仿真系统用例图2

(2)动物的捕食关系用例图2

三、概要设计3

3.1类的设计3

(1)抽象实体与类3

(2)类的关系图3

3.2程序界面的设计6

(1)系统启动界面6

(2)系统运行界面6

四、详细设计及编码7

4.1程序中主要类的详细设计7

4.2核心函数介绍及实现流程图11

(1)主程序11

(2)窗口初始化11

(3)程序逻辑部分处理12

(4)边界检测13

(5)动物体之间的碰撞检测13

五、系统功能测试15

5.1测试环境15

5.2测试用例15

5.3测试总结16

参考文献17

一、简介

纯粹的编程有时的确是一件枯燥的事,何不用其来做一些有趣的事情?

比如模拟一个简单的生态系统,模拟里面的捕食关系,不追求绝对的真实逼真,但是足以让人直观的看出动物界得朋友们的生活是多么艰难。

本设计即是旨在完成这样一个任务,模拟草原上的狮子、老虎与鹿、斑马等之间的捕食被捕食的生存规则,适者生存,自然选择的法则应得以体现,这是个弱肉强食的地方,让人类真正的深入草原考察那里动物的生存状况,无论如何都是具有危险性的,同时也相当耗费人力与财力,更重要的是的确因此会花掉很多时间,而用软件来模拟这样的环境,不是很节约成本吗?

创造具有观赏性娱乐朋友又可对自己编程能力进行锻炼不是你所追求的目标之一吗?

Comeon!

Myfriend,打开电脑,来一场“生与死”的对决吧!

本题目是采用C++面向对象的程序设计方法来实现狮子老虎与鹿群斑马等的PK过程。

二、需求分析

2.1主要功能列表

表2.1.1主要功能列表

序号

功能名称

功能说明

用例图编号

1

捕食者的捕食

捕食者将捕食靠近它的猎物

 

见2.2用例模型一节

2

动物的随机走动

任何动物都应有自己行动的能力和自由

3

捕食者的生命限制

一定时间内捕获不到猎物的捕食者必然将死亡,而鹿不一样,因为草原提供了充足的粮食

4

活动范围限制

再大的草原也有面积大小的限制,其中的动物当然不能运动超过此范围

5

诞生新动物体

鹿群和狮群都可以可以繁殖后代

6

暂停与继续模拟

模拟过程中用户可以暂停与继续

7

数据的动态更新

实时更新双方的死亡与诞生情况

2.2用例模型

(1)简单生态仿真系统用例图

图2.2.1简单生态仿真系统用例图

(2)动物的捕食关系用例图

图2.2.2.动物的捕食用例图

三、概要设计

3.1类的设计

(1)抽象实体与类

1)根据需求共抽象出4个实体,每个实体的名称是GameEngine,Bitmap,Prey,Predator。

2)根据实体共设计出5个类,类与实体的对应关系,如表所示。

表3.1.1实体与类的对应表

序号

实体

1

模拟程序的引擎

GameEngine

2

位图管理

Bitmap

3

捕食者

Predator

4

被捕食者

Prey

(2)类的关系图

Prey和Predator类都是派生自Animal类,它们的大多数属性和功能都在Animal类中加以体现,派生可以选择增加特殊需要的功能,如需求分析中要求捕食者有生命限制而对被捕食者没有此限制,被捕食者在活动过程中标识它是否被吃的标志等。

图3.1.1位图类

图3.1.2动物类

图3.1.3被捕食者类

图3.1.4捕食者类

图3.1.4游戏引擎类

3.2程序界面的设计

系统设计了两个功能界面,一个是程序启动界面,提供用户设置基本参数的窗口,加强了与用户的互动能力,显得更友好;另一个则是程序运行界面,实时显示整个模拟环境中生物的概况,提供图像化显示,尽量做到更形象,让用户看到整个变化过程,不至于只让用户等着看最后的模拟结果。

(1)系统启动界面

图3-2系统启动界面

(2)系统运行界面

图3-3系统运行界面

四、详细设计及编码

4.1程序中主要类的详细设计

本系统共设计出5个类,每个类的成员变量及成员函数如以下表所示

表4-1Bitmap类成员变量说明列表

序号

成员变量

成员变量说明

访问属性

1

HBITMAPm_hBitmap;

位图自身的句柄

private

2

intm_iWidth;

位图的宽度

3

intm_iHeight;

位图的高度

表4-2Bitmap类成员函数说明列表

序号

成员函数

成员函数说明

访问属性

1

Bitmap();

位图默认构造函数

 

public

2

Bitmap(HDChDC,TCHAR*lpszFileName,HINSTANCEhInstance);

位图但参数构造函数

3

virtual~Bitmap();

析构函数

4

BOOLCreate(HDChDC,TCHAR*lpszFileName,HINSTANCEhInstance);

建立位图,将被带参构造函数调用

5

voidDraw(HDChDC,intx,inty,BOOLbTrans=FALSE,COLORREFcrTransColor=RGB(255,0,255));

位图自身的绘制

表4-3Animal类成员变量说明列表

序号

成员

成员变量说明

访问属性

1

Bitmap*m_pBitmap;

动物位图

 

private

2

POINTm_ptSize;

大小

3

POINTm_ptVelo;

速度矢量

4

BOOLm_bErase;

重画标志

5

stringm_strName;

动物名字

6

RECTm_rcBound;

运动范围

7

RECTm_rcPos;

运动坐标

8

intm_iSpeed;

速度大小

9

intm_ID;

ID号

表4-4Animal类成员变量说明列表

序号

成员函数

成员函数说明

访问属性

1

Animal();

动物类默认构造函数,初始化成员变量为默认值

 

public

 

public

2

Animal(intID,RECTrcPos,RECTrcBound,intiSpeed=10,Bitmap*pBitmap=NULL);

动物类带参构造函数

3

virtual~Animal();

析构函数

4

string&GetName();

获取动物名字

5

BOOLShouldDraw();

是否需要重画

6

voidValidate(BOOLbFlag);

设置重画标志

7

voidSetID(intiID);

设置ID号

8

intGetID(void);

获取ID号

9

voidSetPosition(intx,inty);

设置位置的三种方法,方便不同情况下使用

10

voidSetPosition(POINT&ptNewPos);

11

voidSetPosition(RECT&rcPos);

12

RECT&GetPositionRect(void);

获取位置坐标

13

voidSetName(stringtheName);

设置动物名字

14

voidSetSize(POINT&ptSize);

设置动物体

15

voidSetSpeed(intiSpeed);

设置动物的速度

16

BOOLTestCollision(Animal*pAnimal);

检测是否与其它动物发生碰撞

17

voidCheckBound(POINT&ptNewPos);

检测动物运动是否碰到边界

18

voidMove();

动物的移动

19

POINTGetVelo();

获取动物的速度矢量

20

voidSetVelo(POINT&ptVelo);

设置动物的速度矢量

21

voidDraw(HDChdc,BOOLbTrans=FALSE,COLORREFcolor=RGB(0,0,0));

绘制动物自己

表4-5Deer类成员变量说明列表

序号

成员

成员变量说明

访问属性

1

BOOLbEat;

鹿是否将被吃掉的标志

private

表4-6Deer类成员函数说明列表

序号

成员函数

成员函数说明

访问属性

1

Deer();

默认构造函数,调用基类Animal的构造函数

public

2

Deer(intID,RECTrcPos,RECTrcBound,intiSpeed=5,Bitmap*pBitmap=NULL,BOOLbErase=FALSE);

带参构造函数,初始化成员变量为指定值

3

~Deer();

析构函数

4

BOOLGetEatFlag();

获取是否被吃的标志

5

voidSetEatFlag();

设置是否被吃的标志

表4-7Lion类成员变量说明列表

序号

成员

成员变量说明

访问属性

1

intm_iLife;

狮子的生命值

private

2

intm_iCapTimes;

狮子的捕食次数

表4-8Lion类成员函数说明列表

序号

成员函数

成员函数说明

访问属性

1

Lion();

默认构造函数

public

2

Lion(intID,RECTrcPos,RECTrcBound,intiSpeed=10,Bitmap*pBitmap=NULL,BOOLbErase=FALSE);

带参构造函数

3

virtual~Lion();

析构函数

4

voidSetLife(intiValue=200);

设置生命值

5

intGetLife();

获得生命值

6

voidSetCapTimes(intiTimes=0);

设置捕获次数

7

intGetCapTimes();

获取捕获次数

表4-9GameEngine类成员变量说明列表

序号

成员

成员变量说明

访问属性

1

staticGameEngine*m_pGameEngine;

程序模拟引擎

public

2

HINSTANCEm_hInstance;

程序实例句柄

private

3

HWNDm_hwnd;

主窗口句柄

4

TCHARm_szWindowClass[50];

窗口类名

5

TCHARm_szTitle[50];

标题

6

WORDm_wSmallIcon;

程序小号图标

7

WORDm_wIcon;

程序大号图标

8

intm_iFrameDelay;

程序循环间隔延时

9

intm_iHeight;

窗口高度

10

intm_iWidth;

窗口宽度

11

intm_iLionNum,

捕食者数量

12

intm_iDeerNum;

被捕食者数量

13

intm_iSimulateTime;

模拟时间

14

BOOLm_bSleep;

是否暂停标志

15

BOOLm_bFullScreen;

全屏模式标志

16

vectorm_vLions;

管理捕食者的容器类

17

vectorm_vDeers;

管理被捕食者容器类

表4-10GameEngine类成员函数说明列表

序号

成员函数

成员函数说明

访问属性

public

1

GameEngine(HINSTANCEhInstance,LPTSTRszWindowClass,LPTSTRszTitle,WORDwIcon,WORDwSmallIcon,BOOLbFullScreen,

intiWidth=800,intiHeight=600);

引擎类构造函数,初始化与程序框架相关的主要参数

2

staticGameEngine*GetEngine();

提供获取主程序实例指针的方法

3

BOOLInitialize(intiCmdShow);

完成对窗口的风格初始化和创建

4

LRESULTHandleEvent(HWNDhwnd,UINTmsg,WPARAMwParam,LPARAMlParam);

响应消息

5

voidAddLion(Lion*pLion);

添加捕食者

6

voidDeleteLion();

释放捕食者占有资源

7

voidAddDeer(Deer*pDeer);

添加被捕食者

8

voidDeleteDeer();

释放被捕食者占有资源

9

voidCheckAnimalCollision(Animal*pAnimal);

检测是否有碰撞发生

10

voidDrawAnimals(HDChdc);

画出动物图像

11

voidMoveAnimals();

动物移动

12

voidShowInfo(HDChdc);

显示当前捕食者和被捕食者的相关数据

13

voidCollisionAction(Animal*pHitter,Animal*pHittee);

碰撞时应发生的动作

14

HINSTANCEGetInstance();

获取程序的实例句柄

15

HWNDGetGameWindow();

获取窗口句柄

16

LPTSTRGetTitle();

获取窗口标题

17

WORDGetIcon();

获取应用程序图标资源

18

WORDGetSmallIcon();

同上

19

intGetWidth();

获取窗口客户区宽度

20

intGetHeight();

获取窗口客户区高度

21

intGetFrameDelay();

获取游戏帧延时

22

voidSetFrameRate(intiFramRate);

设置游戏帧频

23

BOOLIsSleep();

是否暂停

24

voidSetSleep(BOOLbSleep);

设置游戏状态

25

intGetDeerNum();

获取被捕食者数量

26

intGetLionNum();

获取捕食者数量

27

intGetSimulateTime();

获取模拟时间

28

voidSetSimulateTime(inttime=120);

设置模拟时间

29

voidSetDeerNum(intDeerNum=20);

设置被捕食者数量

30

voidSetLionNum(intLionNum=2);

设置捕食者数量

4.2核心函数介绍及实现流程图

(1)主程序

主程序主要完成对各主要初始化函数的调用,进行资源的载入准备,成功后控制程序的消息循环,暂停的判断,系统状态的更新。

图4-1主程序流程图

(2)窗口初始化

该函数对于程序的初始阶段极为重要,主要完成对程序窗口参数的设定,根据目标机的显示参数进行窗口大小、风格的设定,通常默认时是创建为全屏,否则是800*600像素的窗口。

图4-2窗口建立流程图

(3)程序逻辑部分处理

该函数完成对程序循环中的逻辑处理,更新画面、碰撞检测、捕食功能、是否结束等判断,是程序中的核心函数,其功能处理的好与坏直接影响到程序运行的逻辑正确性。

图4-3程序逻辑处理流程图

(4)边界检测

边界检测就是在动物每前进一步都判断它是否已经运动出规定范围,包括对上、下、左、右四个方向的检测,这很重要,否则会出现动物运动出屏幕外的现象,导致看起来好像动物突然消失了样,很明显这是不合理的,边界检测就是要避免这样的情况发生,当检测到动物碰到边界时,不移动动物,改变其速度的方向,让它向反方向运动,这样处理后看起来会更自然和逼真,因为它自然的实现了碰撞后反弹的效果。

图4-4边界检测流程图

(5)动物体之间的碰撞检测

当两个动物相遇时肯定不能互相穿过这是肯定的,但如果程序中不检测动物相碰的情况,那么就会发现它们会互不影响的按照既定路线继续前进,这显然不合现实。

那么,当两个动物体相遇时,会发生什么呢?

如果是同种生物,其中之一可能会“绕道而行”,也可能两个动物改变方向往其它地方走;如果是不同种生物,特别是当鹿遇到狮子时,很明显的是,不可避免,鹿将被狮子吃掉(当然也有逃跑的可能,不过狮子也没那么容易躲过啊要知道),那鹿就该消失了,同时狮子应该恢复一些体力了,这便是本程序中所默认处理的碰撞动作。

考虑如何知道两个动物发生碰撞了?

方法有很多,在这里没有必要使用那些高级算法,我考虑的是依据动物图片自身的大小,规定它有一个对应于自身大小的矩形(称之为对象矩形,图4-5,对于用户不可见),程序内部默认以该矩形的左上角来指示它当前在屏幕上的坐标位置,并以此为基础检测两个动物是否相撞。

图4-5四种碰撞情况

如图4-5所示,动物的碰撞可分为上面四种情况,第一种情况满足如下关系式:

X2Y1,

X2+对象2的宽度>X1,Y1+对象1的高度>Y2

注意,在此参考坐标系中,y轴向下,x轴向右。

考察其它三种情况,可以发现类似的关系,因此程序中可以以此来判断两者是否相碰,程序流程图如图4-6。

.

图4-6动物体碰撞检测流程图

(r1,r2表示两个对象)

五、系统功能测试

5.1测试环境

硬件环境:

Pentium(R)Dual-CoreCPUT4200,2.00GHz;2.00GB的内存,无网络环境

软件环境:

WindowsXPProfessionalServicePack3及以上(除了Vista)的操作系统

5.2测试用例

表5.2.1系统测试用例列表

序号

功能描述

操作

备注

预期输出

测试结果

1

游戏过程的逻辑处理

运行此程序

看是否正常运行,动物是否随机出现,运动是否合理,是否实现捕食功能

开始动物体位置随机产生,然后系统开始正常的模拟

与预期结果相同

2

大数据量的测试,检测系统是否能承担,不会崩溃,是否够健壮

开始游戏时输入捕食者数量为99,被捕食者数量为999

按照该数据运行此程序

正常的模拟结束,不出现提前结束或崩溃

没有出现问题,只是整个屏幕塞满了图片看不清,但是测试成功

3

长时间的模拟

测试时间为9999秒

对系统功能不存在影响

提前结束,因为捕食者到最后难以捕食到猎物而死亡,测试成功

4

测试过程中随机增加动物的功能

程序运行时一直按下增加动物的键

来不及响应而崩溃

没有崩溃,但系统提示“被捕食者已全部被吃”而提前结束,发现BUG

5

测试暂停与继续模拟的功能

程序运行期间随机的暂停然后随机的继续,中间隔任意时间

响应的实现暂停模拟与继续模拟

与预期的相符,测试成功

5.3测试总结

经过测试,本软件已达到需求说明书的要求。

的确还存在一定的不足,但是不影响软件的正常运行,现给出以下意见和建议

1、环境中动物的种类有限,可以在增加一些,并且模拟的功能太单一,如鹿和斑马没有草可吃,只有狮子或老虎在捕食它们,也没有天气、水、黑夜等,这种情况在现实中是不太可能的;

2、可以提供重复模拟的功能,及本次模拟完后可以不退出程序而开始新一轮模拟;

3、程序启动界面设计不是很美观,需要再仔细考量,怎样让用户看起来心情更好;

4、程序采用面向对象的思路设计,基于win32的API接口来实现界面的图形化显示,这对后期的升级增加了难度,考虑换用MFC进行改进,方便以后增加功能而不至于改乱现有代码;

5、添加更多的能与用户交互的功能,让软件更加“人性化”,更易于得到用户的认可。

参考文献

[1]CharlesPetzold.Windows程序设计.第5版.北京:

人民邮电出版社,2009.

[2]WalterSavitch.C++面向对象程序设计.第6版.北京:

清华大学出版社,2009.

[3]MikeMcShaffry.游戏编程全接触.北京:

人民邮电出版社,2006.

[4]MichaelMorrisoon.游戏编程入门.北京:

人民邮电出版社,2005.

[5]高焕堂.UML+OOPC嵌入式C语言开发精讲.北京:

电子工业出版社,2008.

[6]叶思义,宋昀璐.游戏设计全方位学习.北京:

中国铁道出版社,2006.

[7]EllisHorowitz,SartajSahni,SusanAnderson-Freed.数据结构基础(C语言版).第2版.北京:

清华大学出版社,2009.

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 求职职场 > 面试

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1