当前位置:文档之家› 《面向对象的编程技术》课程设计实验报告

《面向对象的编程技术》课程设计实验报告

《面向对象的编程技术》课程设计实验报告
系计算机科学与技术
班级计114
姓名石险峰
学号119074122
指导教师胡增涛
计算机学院
2012年12月
一.应用程序的名称
设计:“坦克大战”
(1)参考(《PC游戏编程(窥门篇)》谭文洪著)中的“坦克大战”(TankWar工程),并对其进行完善、扩充,程序要能看出专业水平和商业化产品的效果。
坦克
玩家坦克
敌军坦克
奖励(金钱、经验、血)
邪恶源
通往下一关
TObject
TBonus
TSprite
TObstacle
TExpledo
TBullet
TEnemyTank
TPlayerTank
TLink
TLinkNode
TWrold
游戏开始
进入游戏
无敌模式
受到火坦克攻击后,上下血量不减
爆炸模式
敌军全灭。
bullet_type=1;
if(WGE_Input.Key()[DIK_F5])
bullet_type=2;
if(WGE_Input.Key()[DIK_F6])
bullet_type=3;
if(WGE_Input.Key()[DIK_F7])
bullet_type=4;
enum BULLET_TYPE p=LIGHT;
///增加上帝模式(无敌)。///我是通过增加按钮来改变玩家的模式:
我首先在TTank//TPlayerTank
//玩家坦克类中定义了一个私有成员private:static int N;根据N%2的值是1还是0来判断玩家是否设置为无敌状态了,我设置了F1为玩家无敌状态的快捷键,在Move里增加以下代码
二.应用程序的设计目的
面向对象的编程技术》课程设计是一门独立开设的实验课程,旨在进一步强化学生对类、封装、继承、多态等面向对象基本概念的理解和OOP(面向对象编程)实际动手能力,并进一步拓展到OOD(面向对象设计)原则、技巧和初步的OOA(面向对象分析)方法。
在中国,电子游戏曾一度被大家斥为“电子海洛因”。然而电子游戏在青年学生中大受欢迎却又是一个不争的事实。正如水能载舟,亦能覆舟一样,任何事物都有其两面性。与其千方百计地封堵,还不如让同学们从技术的角度来研究它,这样既可以掌握复杂系统的设计技巧,也可以破除对电子游戏的神秘感。我相信,一个人如果自己能制作游戏,如果能清楚地知道那个绚丽多彩的虚拟世界背后无非就是一些类、变量、函数的话,他就不可能再沉迷于打游戏———与一堆对象、内存变量和函数较劲。同时,从技术上讲,游戏程序的开发异常复杂,能充分体现面向对象的拟人化思想和面向对象设计技巧。通过游戏程序的制作,可以帮助学生真正掌握面向对象程序设计的精髓。
3.应用程序简介
设计目的:C++电脑游戏开发:侧重利用面向对象的拟人化思想解决复杂问题和OOD技巧;
运行环境:
1.本设计采用Microsoft Visual C++6.0编译,并能够在WIN98,WIN2000下运行
2.游戏基于Windows Game Engine(WGE游戏引擎,添翼虎科技)(没提供源程序,不过不用担心,你可以把它看成是利用DirectX快速处理图片、声音、键鼠的类库),该引擎需要DirectX7.0SDK支持(仅有Runtime运行库不够,必须包含开发语言需要的Header&Libs头文件和库文件)
//玩家坦克移动
int TPlayerTank::N=0;//给上帝赋初始值
void TPlayerTank::Move()
{
if(WGE_Input.Key()[DIK_F1])
N++;//增加上帝模式
在判断子弹与玩家坦克碰撞是否有效里加:
//增加无敌模式//
if(N%2==1)
return TRUE;
功能介绍:
修改案例中“子弹可以穿透石头墙”而且增加了敌军坦克子弹不能穿过箱子:无论是敌军坦克还是玩家坦克的子弹都不能穿过石头,敌军坦克子弹不能透过箱子,一旦它们相碰撞子弹会自动销毁。
增加上帝模式(无敌):玩家1通过按F1键变为上帝模式,再按一次,还原,一旦玩家进入上帝模式,敌军坦克的子弹对玩家坦克没任何损伤。
修改火坦克的性能,使之威力更大,并且将该敌军坦克改为其他图像,通过更改火坦克的一些属性,使火坦克的子弹射程、威力,坦克的移动速度、硬度(血量),都有了明显的增加。
2、基本内容:坦克大战主要是玩家坦克与敌军坦克之间的斗争,在许多敌军坦克的包围下,玩家坦克通过消灭一部分坦克,打开通完邪恶源的通道,然后摧毁邪恶源获得闯关的胜利。在这个过程中,玩家可以摧毁木箱,在木箱中获得钱、经验、血量,通过这些使得玩家坦克的威力和防御更强,为最终的胜利获得条件。在玩家坦克消灭敌军坦克时,将获得经验,当经验达到一定程度时,玩家坦克的性能将会变得更强,可以从青铜坦克变为白银、黄金坦克,大致情况如下:
:TSprite(x,y,nShield,0,CLASS_TBULLET),bullet_type(p1)
上式调用函数为自己改的子弹构造函数
TBullet(int x,int y,DIRECTION dir1,int p1,int nShield=10,int nFireRange1=100);
构造函数为
TBullet::TBullet(int x,int y,DIRECTION dir1,int p1,int nShield,int nFireRange1)
{
TLinkNode * pNode=g_world.EnemyTankLink().m_pHeader;
while(pNode)//还不到链尾
{
pNode =pNode->m_pNext;
m_nShield=-1;
if(m_nShield < 0)
{
Dead();//玩家增加经验值
g_world.Player(0)->m_nExper += 10 + m_nType * 10;
Dead();
这些代码是在TBullet类中的
//取得碰撞矩形
void TBullet::GetRect(RECT& rc)函数中添加的,在判断子弹能否穿墙与敌军坦克是否碰到障碍物有一点区别,坦克在碰到障碍物时,应该设置不能继续移动的效果,而子弹在碰到物体后得效果不应该是不能继续移动而是立刻消失,所以当有与地形障碍相碰时,全部改为Dead(),在作为判断子弹是否与障碍物碰撞的代码,这样子弹不能穿墙的效果就成功实现了。
Dead();
if(g_world.ObstacleMap(rc.right/OBSTACLE_WIDTH,rc.top/OBSTACLE_HEIGHT))
Dead();
if(g_world.ObstacleMap(rc.right/OBSTACLE_WIDTH,rc.bottom/OBSTACLE_HEIGHT))
Dead();
if(g_world.ObstacleMap(rc.left/OBSTACLE_WIDTH,rc.top/OBSTACLE_HEIGHT))
Dead();
if(g_world.ObstacleMap(rc.left/OBSTACLE_WIDTH,rc.bottom/OBSTACLE_HEIGHT))
.游戏基于Windows Game Engine(WGE游戏引擎,添翼虎科技)(你可以把它看成是利用DirectX快速处理图片、声音、键鼠的类库),该引擎需要DirectX7.0SDK支持(仅有Runtime运行库不够,必须包含开发语言需要的Header&Libs头文件和库文件)
应用程序的总体设计结构图
elseif(N%2==0)m_nShield-=pBullet->m_nShield ;
return TRUE;
但也出现一个问题,在按F1时有时候会发现上帝模式没有出现,有时需要多按几次。
///修改图片///这里比较简单,直接自己做一个图片,四个图层,四个方向的,用psd格式,再用PSD2EPG.EXE转换一个epg格式,放入data文件里替换某一种坦克,将图片名字改成相同的,再将工具三个全放入data里,用makeres.bat打包即可
switch(bullet_type)
{
case 1:p=LIGHT;break;
case 2: p=FIRE;break;
case 3: p=DMISSILE;break;
case 4: p=SMISSILE;break;
}
g_world.BulletLink().Add(NEW TBullet(m_nX,m_nY,m_dir,bullet_type,10+m_nMoney/300,100+m_nType*25));
////增加爆炸模式,所有坦克全灭//////
本来想法是想在地图上读取坦克,然后灭了,后来觉得利用坦克链表比较简单就直接使用了。
在敌军坦克移动里增加爆炸代码,使敌军所有坦克全灭
敌军坦克移动
void TEnemyTank::Move()
{
if(WGE_Input.Key()[DIK_F2])//增加爆炸模式,所有坦克全灭
Dead();
iOBSTACLE_WIDTH,rc.bottom/OBSTACLE_HEIGHT))
Dead();
if(g_world.ObstacleMap(rc.right/OBSTACLE_WIDTH,rc.bottom/OBSTACLE_HEIGHT))
剧情:“玩家坦克”打掉“邪恶源 ”即可过关。(共3关,可循环玩)
游戏规则:
1)玩家坦克
移动:4个方向箭头,和W、S、A、D,“机动力”由升级次数决定
相关主题