文档库 最新最全的文档下载
当前位置:文档库 › funcodec++课程设计_坦克大战

funcodec++课程设计_坦克大战

funcodec++课程设计_坦克大战
funcodec++课程设计_坦克大战

课程设计一坦克大战

一、游戏介绍

相信大部分同学都玩过或看过“坦克大战”这款经典游戏。现在,就由我们自己动手来开发它。只要大家具备了C++语言和面向对象的基础知识,然后按照实验指南的指导一步一步进行下去,相信我们每个同学都能把这款经典游戏做出来。

、实验目标

综合运用C++及其面向对象的知识开发一款小游戏。

三、实验内容

在一个战场上,玩家控制坦克,消灭敌方坦克,并防止敌方坦克摧毁我方基地。游戏的具体要求如下:

1、游戏有一个初始页面,如下图。

2、按下任意键开始游戏,玩家控制坦克在战场上穿梭,碰到墙时,不能通过。

3、敌方坦克自由移动,每隔 2 秒改变一个方向,每隔 3 秒发射一发子弹。

4、敌方坦克每隔 5 秒出现一辆,从屏幕上方的左、中、右三个位置依次出现。

5、当玩家被消灭或者我方基地被摧毁或者游戏时间大于30 秒的时候,游戏结束。

游戏开始前

进入游戏

四、游戏的整体框架

五、实验指南

实验准备

打开FunCode,创建一个新的C++项目。注意:项目名称必须为英文和数字,且不能有

空格。

点击“项目”→“导入地图模板” ,从对话框中选取名称为TankWar 的模板导入。导入成功后,界面如下:

实验一游戏开始

【实验内容】

1、设置游戏标题

2、按空格键, 提示图片消失, 游戏进入开始状态.

【实验运行结果】

游戏开始前

按下空格键后

【实验思路】

按下空格键是键盘按下事件, 可在CSystem::OnKeyDown 函数中编写响应代码。为了保证程序结构的清晰、一致,更好的办法是在CGameMain类中添加一个相应的键盘按下事件处理函数,然后在CSystem::OnMouseClick 函数中进行调用。

g_GameMain是CGameMain类的对象,它是全局变量,在程序运行时最先被创建。

【实验指导】

1、C++程序的执行入口是主函数。FunCode 的主函数名称叫WinMain,写在文件中。

CSystem::SetWindowTitle 是设置程序运行窗口标题的函数,修改如下:

CSystem::SetWindowTitle(" 坦克大战");

2、参考CSystem::OnKeyDown 函数,为CGameMain 类创建一个OnKeyDown函数。

CGameMain类的头文件是文件,实现代码写在文件中。因此,先在文件对函数进行声

明。函数的返回值和参数列表都与CSystem::OnKeyDown 函数保持一致。访问权限应

该是public 。代码如下:void OnKeyDown( const int iKey, const bool bAltPress, const bool

bShiftPress, const bool bCtrlPress );

3、接着,在文件中对该函数进行定义:

void CGameMain::OnKeyDown( const int iKey, const bool bAltPress, const bool bShiftPress, const bool bCtrlPress )

{

}

4、在CSystem::OnKeyDown 函数(文件中)调用CGameMain::OnKeyDown函数,并将自

己的参数传递给该函数。g_GameMain是是CGameMain类的对象,它是全局变量,

在程序运行时最先被创建。因此,我们可以用g_GameMain 调用自己的成员函数

OnKeyDown。

(iKey, bAltPress, bShiftPress, bCtrlPress);

5、FunCode 程序运行时,当发生键盘按下事件,程序首先调用并

执行CSystem::OnKeyDown 函数,然后由CSystem::OnKeyDown 函数调用

并执行CGameMain::OnKeyDown 函数。因此,键盘按下事件的响应

代码我们在CGameMain::OnKeyDown函数中编写即可。

6、我们要处理的两个精灵如下图,它们的名称分别是splash 和start 。我们需要创建

两个CSprite 类对象与这两个精灵绑定。

7、在CGameMain类中声明两个CSprite* 类型,根据面向对象的封装性原理,成员变量

的访问权限应该是private 。代码应该写在哪个文件,请参看前面的实验步骤。CSprite* m_pSplash;

CSprite* m_pStart;

在CGameMain类的构造函数中,对上面两个指针变量进行初始化。通过调用

CSprite 的构造函数,将精灵和精力对象绑定在一起。

m_pSplash= new CSprite("splash");

m_pStart= new CSprite("start");

8、最后,我们在CGameMain::OnKeyDown函数中处理空格键按下事件。

if( 0 ==GetGameState() )

{

if(iKey ==KEY_SPACE)

{

m i GameState = 1;

}

}

KEY_SPACE是枚举变量KeyCodes 的成员,表示空格键。KeyCodes 定义在文件中。

该枚举变量定义了全部的键盘值。注意:必须将m_iGameState 的值改为1。当

GameMainLoop函数再次执行时,根据m_iGameState 的值调用并执行GameInit 函

数,游戏进入开始状态。

进入游戏开始状态时,调用CSprite 类的SetSpriteVisible 函数将精灵图片设置为不可

见。

在GameInit 函数中添加代码:

m_pSplash->SetSpriteVisible(false); m_pStart->SetSpriteVisible(false);

9、程序执行完CGameMain::GameInit 函数后,执行CGameMain:: SetGameState(2) ,将

m_iGameState 的值改为 2 ,游戏进入运行状态。

10、在CGameMain类的析构函数中delete 本实验创建的指针对象,以释放分配的内存。

CGameMain::~CGameMain()

{

delete m_pSplash;

delete m_pStart;

}

11、编译并运行程序,然后按下空格键,看看运行效果。

实验二坦克运动

【实验内容】

1、创建坦克类CTankPlayer ;

2、游戏开始时,将坦克放置于(0,0) 的坐标上;

3、通过按键WSAD控制坦克上下左右运动;

4、坦克运行到黑色区域边界时不能继续前进。

实验运行结果】

在区域内运动

运动到区域边界

【实验思路】坦克也是精灵,但是它具备一些自己独特的功能,比如通过键盘控制运动、开炮等。因此我们可以创建一个新的类CTankPlayer 类,并让它继承CSprite 类。

通过WASD键,控制坦克做相应的的上左下右运动。按下某个键,给坦克设置相应方向

的运动速度;松开时,将该方向的速度设为0,表示停止运动。

屏幕上最内部的黑色区域为玩家坦克的活动区域,左上角坐标为(-26,-22) ,右下角坐标为(26,22) 。当坦克运动到该区域边界时,坦克不能继续前进。

【实验指导】

1、通过类向导创建CTankPlayer 类,其继承于CSprite 类。以VC++ 为例:第一步、点

击菜单“插入” - 〉“新建类”。

第二步、在“ New Class ”对话框中输入类名和父类名。

第三步、点击“ Change”按钮,在新对话框中修改CTankPlayer 类的头文件和cpp 文件的路径。将头文件保存到项目文件夹的\SourceCode\Header 文件夹中,将cpp 文件保存到项目文件夹下的\SourceCode\Src 文件夹中。

这里需要特别注意的是创建文件路径的问题,所有的.h 头文件应该在项目文件夹

\SourceCode\Header 中,所有的.cpp 源文件应该放在项目文件夹下

的\SourceCode\Src 文件夹中。

2、为CTankPlayer 类添加m_iDir,m_fSpeedX,m_fSpeedY ,m_iHp 四个成员变量(成员变

量。用来表示坦克在X 轴和Y 轴方向上的速度以及运行的方向,并且在构造函数中

初始化为0。这里规定,m_iDir 的值为0、1、2、3,分别表示上、右、下、左。成员函数的声明和定义如何添加,访问权限是什么,可参考实验一,下文不再继续提

示),分别表示运动方向、X轴、Y 轴速度以及血量值。本文档的命名采用匈牙利

命名法,m_表示类成员变量,i 表示整型, f 表示float 型,sz 表示字符指针,g_

表示全局变量等。

同时需要在public 权限下定义获取和设置这些变量的Get 和Set 方法://set 方法

void SetHp(int hp) {m_iHp = hp;}

void SetDir(int dir) {m_iDir = dir;}

void SetSpeedX(float speedX) { m_fSpeedX = speedX;}

void SetSpeedY(float speedY) { m_fSpeedY = speedY;}

//get 方法

int GetHp() {return m_iHp;}

int GetDir() { return m_iDir;}

float GetSpeedX() { return m_fSpeedX;}

float GetSpeedY() {return m_fSpeedY;}

3、CTankPlayer 的父类是CSprite 类(具体声明查看) ,构造函数为CSprite( const char

*szName ) 。

4、所以通过上边方法自动生成的类,如果系统自动生成构造函数CTankPlayer(void) ,删

除掉它以及在中自动生成的对构造函数实现的代码:

CTankPlayer::CTankPlayer(void)

{

}

再为CTankPlayer 类添加新的构造函数:CTankPlayer(const char* szName) 。

CTankPlayer::CTankPlayer(const char* szName):CSprite(szName) // 对构造函数进

行实现

{

m iDir=0; m_fSpeedX=; m_fSpeedY=; m_iHp=2;

} 子类对象创建时,要先调用父类的构造函数完成父类部分的构造。如果父类没有默认构造函数,子类的构造函数必须显示调用父类的构造函数。CTankPlayer 构造函数调

用CSprite 类构造函数,并将参数szName的值传递给它,从而将名称为szName 的精灵图片与CTankPlayer 对象绑定起来。

5、为CTankPlayer 类添加Init 函数,该函数主要用来完成该类的初始化工作。这里,先调

用setHp 方法设置血量。然后调用父类的SetSpritePosition 函数将坦克精灵设置在屏幕中央(0,0) 处。接下来给坦克精灵设置时间边界的大小,与世界边界的碰撞模式为

WORLD_LIMIT_NUL,L表示精灵与世界边界碰撞的响应由代码完成,同时

设置坦克碰撞模式为发送碰撞和接收碰撞。

void CTankPlayer::Init()

{

SetHp(2);

SetSpritePosition,; SetSpriteWorldLimit(WORLD_LIMIT_NULL, -26, -22, 26, 22);

SetSpriteCollisionActive(1,1);// 设置为可以接受和发生碰撞SetSpriteVisible(true);

6、在CGameMain类中增加一个私有成员变量m_pTankplayer ,类型为CTankPlayer* 。

注意在添加头文件:

7、按下空格键后,程序会调用键盘按下事件响应函数,将m_iGameState 的值改为1,

游戏进入开始状态(见实验一)。程序再次执行CGameMain::GameMainLoop 函数

时,根据m_iGameState 的值调用并执行CGameMain::GameInit 函数。因此,可以在该函数中创建我方坦克,并调用CTankPlayer::Init 函数来完成该类对象的初始化工

}

}

作。

m_pTankPlayer=new CTankPlayer("myplayer");// 新建一个名字是 myPlayer 的我方坦

克对象

m pTankPlayer->CloneSprite("player");//

我方坦克克隆在 funcode 模板中存在的名

字为 player 的坦克,表示新建的坦克对象有现在精灵的所有属性

m_pTankPlayer->Init();

8、接下来,我们为 CTankPlayer 类添加 OnMove 函数,参数 iKey 、

bPress 分别表示按

下的是哪个按键和按键是否按下。首先声明该函数,访问权限为 public : void

OnMove(int iKey, bool bPress);

9、接着,完成 OnMove 方法。

void CTankPlayer::OnMove(int iKey, bool bPress)

{

switch (iKey)

{

SetSpeedX(0); SetSpeedY(8); break;

case KEY_A: SetDir(3); SetSpeedX(-8); SetSpeedY(0); break;

SetSpriteRotation(float(90*GetDir())); // 转度数

用方向值乘于90 得到精灵旋SetSpriteLinearVelocity(GetSpeedX(),GetSpeedY()); } else

{

if(iKey == KEY_W || iKey == KEY_D || iKey == KEY_S || iKey == KEY_A) {

SetSpeedX(0); SetSpeedY(0);

}

}

用参数bPress 来判断键盘是按下还是弹起。如果bPress 为false ,表示键盘弹起,且弹起的键是WASD键时,设置坦克的X 轴和Y轴移动速度都为0。如果bPress 为true ,表示键盘按下,根据按下的键,为m_iDir,m_fSpeedX,m_fSpeedY 赋予相应的值。SetSpriteRotation 和SetSpriteLinearVelocity 函数用来设置精灵的角度和线性速度,具体含义参考文件。

10、在CGameMain类的OnKeyDown函数中,通过调用CTankPlayer 类的OnMove方

法,根据按下的键,控制坦克朝指定方向运动。只有游戏进入开始状态,按键才有效。

注意:OnMove参数bPress 的值为true 。在OnKeyDown函数中添加代码如下:if(m iGameState == 2)

{

11、编译并运行程序。按空格键开始,按WASD键,坦克会向规定的方向运动。但是松

开按键后,坦克继续前进,不会停止下来。

12、参考CSystem::OnKeyUp 函数,给CGameMain类声明并定义一个OnKeyUp函数,用

来处理按键弹起事件,然后在CSystem::OnKeyUp 函数中调用它。关于这个函数如何声明、定义以及调用参考实验一。

13、在CGameMain::OnKeyUp函数中调用CTankPlayer 的OnMove方法,参数bPress 的

值为false 。

{

}

14、编译并运行程序,按下WASD键,坦克运行;松开按键,坦克停止。接下来,我们来

实现坦克运行到黑色区域边界停止运动的效果。

15、参考CSystem::OnSpriteColWorldLimit 函数,给CGameMain类声明并定义一个

OnSpriteColWorldLimit 函数,用来处理精灵与世界边界的碰撞事件,然后在

CSystem:: OnSpriteColWorldLimit 函数中调用它。关于这个函数如何声明、定义以及调用参考实验一。

16、当坦克精灵碰到边界时,将精灵的速度都设为0,精灵停止运动。

用字符串处理函数strstr() 来判断碰到世界边界的精灵是否为我方坦克。当碰到世界边界的精灵名字中含有” player ”的时候,strstr 会返回一个非空值。因此代码如下:

void CGameMain::OnSpriteColWorldLimit( const char *szName, const int iColSide ) { if(strstr(szName,"player") != NULL) // 判断碰到世界边界的坦克是否为我方坦克

{ m_pTankPlayer->SetSpriteLinearVelocity(0,0);

}

}

实验三坦克开炮

【实验内容】

1、创建子弹类CBullet ;

2、通过按键J 控制坦克开炮;【实验运行结果】

【实验思路】

创建子弹类,该类应具备子弹的运动方向、起始位置、X 轴速度、Y轴速度等属性,其中运动方向和起始位置由坦克的方向和位置决定。

通过按键控制坦克发射子弹,因此在CGameMain类的OnKeyDown方法中实现该需求。此时我们为CTankPlayer 类添加发射子弹的方法OnFire 。当按下J 键后,坦克发射子弹,在OnFire 方法中,我们需要告诉子弹的方向和初始位置。而创建子弹我们由CGameMain类来完成。这样减少了类之间的耦合。

【实验指导】

1、通过类向导创建CBullet 类,其继承于CSprite 类,具体做法参考实验一;

2、为CBullet 类添加m_iDir,m_fSpeedX,m_fSpeedY,m_iHp ,m_iOwner 五个成员,分别

表示方向、X 轴、Y 轴速度、子弹血量以及发射子弹归属坦克,0表示地方坦克, 1 表示我方坦克,并参考实验二添加变量的get 和set 方法。

3、为CTankPlayer 类添加构造函数和析构函数。参照实验二,把构造函数中将所有变量

进行初始化。

4、为CBullet 类添加OnMove方法,参数为iDir 表示子弹的运动方向。

5、完成OnMove方法。根据方向m_iDir ,首先设置m_fSpeedX,m_fSpeedY 的值,然后

设置根据方向设置旋转角度,最后设置子弹的运动速度。

void CBullet::OnMove(int iDir)

{

SetDir(iDir);

switch(GetDir())

{

}

SetSpeedY(10); break;

case 3:

SetSpeedX(-10); SetSpeedY(0); break;

}

SetSpriteRotation(90*GetDir());

SetSpriteLinearVelocity(GetSpeedX(),GetSpeedY());

}

6、在 CGameMain 类中添加表示子弹数目的成员变量 m_iBulletNum( 注意初始化为 0) 。

然后添加 AddBullet 方法。方法中有 iDir 、fPosX 、fPosY 、 iOwner 四个参数分别 表示子弹方向、子弹初始位置的

X 轴

Y 轴坐标以及子弹所属坦克。由于地图上只有

一个子弹模板,所以我们需要先复制这个模板,然后设置该精灵的世界边界。

void CGameMain::AddBullet( int iDir,float fPosX,float fPosY ,int iOwner)

{

char* szName = CSystem::MakeSpriteName("bullet",m_iBulletNum);// 创建坦克 名字 CBullet* pBullet = new CBullet(szName); pBullet->CloneSprite("bullet");

pBullet->SetSpriteWorldLimit(WORLD_LIMIT_NULL,-26, -22, 26, 22); // 设置

世界边界

pBullet->SetSpritePosition(fPosX,fPosY); pBullet->SetSpriteCollisionSend(true); // 设置接收碰撞

pBullet->OnMove(iDir);

m_iBulletNum++; // 子弹个数加 1 if(iOwner == 1)

{

}

7、为 CTankPlayer 类增加 OnFire 方法,实现发射子弹的功能。 在根据坦克的运动状态,

得到子弹的相关属性后,通过 AddBullet 方法在游戏中增加一发子弹。 void

CTankPlayer::OnFire()

{

y = GetSpritePositionY(); switch(GetDir())

{

case 1:

x=x+GetSpriteWidth()/2+1; break; case 2:

y=y+GetSpriteHeight()/2+1;

}

(GetDir(),x,y,1);

}

因为用到 g_GameMain 这个全局对象,所以需要在中声明头文件: #include ””

8、

按 J 键发射子弹。在 CGameMain 类的 OnKeyDown 函数 if(m_iGameState == 2) 下添

加if(iKey == KEY_J)//

判断按下键是够为 J 键

{

}

实验四 敌方坦克

【实验内容】

1、创建 CTankEnemy 类;

2、创建一个敌方坦克实例,实现坦克从上方左中右三个位置随机出现。

3、实现坦克隔 2 秒,随机改变一个方向。

4、实现坦克隔 5 秒发射一发子弹;

5、当坦克与世界边界碰撞时,改变方向;

【实验运行结果】

实验思路】

同我方坦克一样,敌方坦克运动,也需要有运动方向、 X 轴 Y 轴速度三个基本属性。为 了实现坦克能自由运动, 即坦克运动一段时间后改变方向, 需增加一个改变方向的时间间隔。 同时为了实现坦克自动发射子弹,需增加一个发射子弹的时间间隔。

然后为敌方坦克增加移动和发射子弹的方法。

最后我们在CGameMain类的GameRun方法中调用敌方坦克移动和发射子弹的方法。

【实验指导】

1、通过类向导创建CTankEnemy类;

2、为类CTankEnemy添加m_iDir,m_fSpeedX,m_fSpeedY,m_iHp 四个成员,分别表示方

向、X轴、Y轴速度和血量;

3、参照前面的实验,为CTankEnemy类添加构造函数和析构函数。

4、为类CTankEnemy添加Init 方法初始化敌方坦克。设置血量为2,位置坐标为上方

左中右的随机位置,然后函数中给坦克精灵设置时间边界的大小,与世界边界的碰撞模式为WORLD_LIMIT_NUL,L表示精灵与世界边界碰撞的响应由代码完成。最后设

置方向和速度代码如下:

int iPos = CSystem::RandomRange(0,2);

float fPosX;

SetDir(2);

SetHp(2);

switch (iPos)

{

case 0:

}

SetSpritePosition(fPosX,; SetSpriteLinearVelocity,;

SetSpriteCollisionActive(1,1); // 设置可以接受和发送碰撞

SetSpriteRotation(float(90*GetDir()));

SetSpriteWorldLimit(WORLD_LIMIT_NULL,-26, -22, 26, 22);

5、为类CTankEnemy添加OnMove方法,实现坦克顺时针旋转90 度运动。然后根据方

向设置子弹的运动速度m_fSpeedX,m_fSpeedY 的值。与CTankPlayer 类的OnMove方法类似。

设置速度方向与原来方向旋转90 度的代码如下:

int iDir=0; if(GetDir()==0 || GetDir()==1 || GetDir()==2)

{

iDir = GetDir()+1;

}

Else // 如果方向值等于3, 设为0

{

通过方向设置速度参考前边实验。

6、为类CTankEnemy添加带参的OnMove方法,参数fDeltaTime ,为游戏的时间差,实

现隔一段时间随机改变方向。在CTankEnemy类中添加成员变量m_fChangeDirTime

在构造函数中初始化为0,并添加get 和set 方法。

if(m_fChangeDirTime>

{

}

7、为类CTankEnemy添加OnFire 方法,参数也为fDeltaTime ,实现隔一段时间自动发

射子弹。在CTankEnemy类中添加成员m_fBulletCreateTime 变量并在构造函数中初

始化为0。

m_fBulletCreateTime+=fDeltaTime;

if(m_fBulletCreateTime>

{

m_fBulletCreateTime = ;

float x,y;

x = GetSpritePositionX();

y = GetSpritePositionY();

switch(GetDir())

{

case 1:

x=x+GetSpriteWidth()/2+1;

break;

case 3:

x=x-GetSpriteWidth()/2-1; break;

} (GetDir(),x,y,0);

}

} 因为用到全局对象G_GameMain,所以需要在中声明头文件:#include""

8、在CGameMain类中添加CTankEnemy类指针变量m_pTankEnemy。注意在中声明头文

件:

#include""

然后在GameInit 中创建并初始化。m_pTankEnemy = new CTankEnemy("enemy");

m_pTankEnemy->Init();

9、在CGameMain类的GameRun方法中实现敌方坦克自由移动和发射子弹。void

CGameMain::GameRun( float fDeltaTime )

{ if(m_pTankEnemy)

{

m pTankEnemy->OnMove(fDeltaTime); m_pTankEnemy->OnFire(fDeltaTime);

}

}

10、在CGameMain类的OnSpriteColWorldLimit 方法中添加敌方坦克与世界边界碰撞的

检测。

if(m_pTankEnemy&&strcmp(m_pTankEnemy->GetName(),szName)==0)

{ m_pTankEnemy->OnMove();

}

实验五加载地图

【实验内容】

1、加载游戏地图;

【实验运行结果】

【实验思路】

在CGameMain类中添加方法LoadMap 实现地图加载。地图数据是已知的,数据中的0 表示此处为空; 1 表示的是地图中此处为墙; 2 表示此处为玩家指挥部。每块墙大小为4*4 。

实验指导】

1、首先在中定义一个表示地图的二维数组来表示地图,其中

0 表示没有墙块, 1 表示

有墙块:

int g_iMap[11][13]=

{

{0,0,0,0,0,0,0,0,0,0,0,0,0},

{0,0,0,0,0,0,0,0,0,0,0,0,0},

{0,1,0,0,0,1,0,1,0,0,0,1,0},

{1,1,1,1,1,1,1,1,1,1,1,1,1},

{0,0,0,1,0,1,0,1,0,1,0,0,0},

{0,0,0,1,0,0,0,0,0,1,0,0,0},

{0,0,0,1,0,1,0,1,0,1,0,0,0},

{1,1,1,1,1,1,1,1,1,1,1,1,1},

{0,1,0,1,0,0,0,0,0,1,0,1,0},

{0,0,0,0,0,1,1,1,0,0,0,0,0}, {0,0,0,0,0,1,0,1,0,0,0,0,0}

};

2、在CGameMain类中添加LoadMap方法,实现加载地图。在方法中用for 循环遍历地

图二维数组,当二维数组中的某个值为 1 时表示该处是一堵墙。

void CGameMain::LoadMap()

{

char* szName;

int i,j;

float x,y;

for(i=0;i<11;i++)

{

for(j=0;j<13;j++)

{

if(g_iMap[i][j]==1)

{

// 设置为接受碰撞

pWall->SetSpriteCollisionResponse(COL_RESPONSE_CUSTOM); x =float(-

24+4*j);

y =float(-20+4*i); pWall->SetSpritePosition(x,y);

}

}

}

}

3、在GameInit 中调用加载地图的函数:

LoadMap();

实验六创建父类-CWeapon类

实验内容】

1、添加CWeapon类,使CBullet 、CTankPlayer 、CTankEnemy类继承CWeapon类。

2、将三个子类OnFire 和OnMove方法中相同的功能抽取出来,在父类中创建相应方法。

子类调用父类方法进行改进。

3、创建一个容器,用来存放所有精灵。

实验运行结果】

【实验思路】

1、CBullet 、CTankPlayer 、CTankEnemy类中有许多共同的属性和方法,或者为了方便管

理,我们添加父类CWeapo。n

2、把所有创建的精灵存入到容器中,增加从容器中查找和删除精灵的函数。在此基础上,对整

个项目进行大改。

注意此步骤对于下方实验非常重要,需要理解继承的用法,根据自己的理解把该删除和更改的地方做好。此实验会创建一个包含内容为CWeapon* 的容器,把创建的我方坦克,

敌方坦克,墙块,子弹,全部存入到这个容器中进行管理。

【实验指导】

1、通过类向导添加CWeapon类,其继承于CSprite 类。

2、根据分析为CWeapon类添加表示方向、血量、X 轴Y轴速度、四个变量。

int m_iDir;

int m_iHp;

float m_fSpeedX;

float m_fSpeedY;

添加get 和set 方法;

3、仿照前面的实验添加构造函数,在构造函数中对这些数值初始化,其中m_iHp 初始

化为2,其他初始化为0;

4、添加函数以及虚函数:

bool IsDead(); // 判断精灵是否死亡

virtual void Init(){}; // 初始化函数

virtual void OnMove(float fDeltaTime){}; // 敌方坦克移动函数

virtual void OnMove(){};

virtual void OnFire(float deltaTime){}; // 发射子弹函数

virtual void OnSpriteColSprite(CWeapon* pSprite){}; // 精灵与精灵碰撞时

处理函数

在CWeapon类中实现IsDead() 函数,此函数的作用是判断精灵是否死亡,在游戏运

行时,会根据这个函数的返回值来确定是否此精灵:

boolCWeapon::IsDead()

{

if(m_iHp == 0)

{

return true;

} return false;

}

5、将CBullet 、CTankPlayer 、CTankEnemy类的父类改为CWeapon。例如在中把class

CTankPlayer :public CSprite 改为class CTankPlayer :public CWeapon 注意需要、、包含头文件:

#include""

6、注意同时修改构造函数。把继承类的名称由CSprite 改为Cweapon。删除与CWeapon

定义重复的变量声明,原来的get 和set 方法,以及在构造函数中对这些变量赋初值的代码。特别主要要设置Hp=2。

7、在CGameMain类中添加一个成员变量m_vWeapon,用来存储所有精灵:

vector m_vWeapon;

注意用到容器,添加头文件声明和命名空间:

#include

using namespace std;

8、然后声明和定义查找和删除容器成员的两个函数

FindWeaponByName 和DeleteWeaponByName:

CWeapon* CGameMain::FindWeaponByName(const char* szName)// 根据名字查找

到对象

{

for(int i=0; i<(); i++) {

if(strcmp(szName,m_vWeapon[i]->GetName()) == 0)

{

return m_vWeapon[i];

}

}

}

void CGameMain::DeleteWeaponByName(const char* szName)// 根据名字把精灵从容器中删除

{

for(vector::iterator it=();it!=();)

{

CWeapon* cw =*it;

if(strcmp(szName,cw->GetName()) == 0) {

(it);

cw->DeleteSprite();

delete cw;

}

else

{

it++;

}

}

}

9、在前边创建子弹、我方坦克、以及地图的地方用() 函数把精灵添加到容器中。

1) 我方精灵添加容器中方法为,在GameInit() 函数中创建我方坦克的代码:

m_pTankPlayer=new CTankPlayer("myplayer"); m_pTankPlayer->CloneSprite("player");

m_pTankPlayer->Init();

下边添加如下代码:

(m_pTankPlayer);

2) 子弹添加到容器,在AddBullet 函数最后添加一行代码:

(pBullet);

3) 地图添加容器,在LoadMap()函数中,把CSprite* pWall = new CSprite(szName);

改为:

CWeapon* pWall = new CWeapon(szName);

然后在pWall->SetSpritePosition(x,y); 下添加:

实验七游戏整体正常运行

【实验内容】

1、创建敌方坦克每隔 5 秒出现一辆,从屏幕上方的左、中、右三个位置随机出现。

2、当子弹与游戏中的任何东西碰撞时,双方都消失;

3、当我方坦克与敌方坦克碰撞时,我方坦克静止不动,敌方坦克改变方向;

4、当我方坦克被消灭或者我方军营被击中时,游戏结束。

【实验运行结果】

【实验思路】

3、创建一个函数生成坦克的函数产生坦克。

4、在OnSpriteColSprite 方法中添加碰撞检测。

5、更改在OnSpriteColWorldLimit 中与世界边界的碰撞检测。

【实验指导】

1、注释掉实验四中,在CGameMain类中添加的声明和创建一个敌方坦克对象的代码。中:

//CTankEnemy* m_pTankEnemy;

在文件GameInit 函数:

//m_pTankEnemy = new CTankEnemy("enemy");

//m_pTankEnemy->Init();

同时注释在GameRun函数中添加的使敌方坦克运动的代码。

/*if(m_pTankEnemy)

{

m_pTankEnemy->OnMove(fDeltaTime); m_pTankEnemy->OnFire(fDeltaTime);

}*/

2、在CGameMain中创建一个不断产生地方坦克的函数AddTankEnemy。

先在CGameMain中添加一个成员变量m_fTankEnemyTime和m_iTankEnemyNumber 分别代表创建坦克时间,以及坦克数量(注意将两数进行初始化)。当时间m_fTankEnemyTime 大于5时,创建敌方坦克,设置属性,并进行调用初始化函数init 来设置敌方坦克的初始位

置以及碰撞模式等内容。

voidCGameMain::AddTankEnemy(float fDeltaTime)

{

m fTankEnemyTime += fDeltaTime;

if(m_fTankEnemyTime > 5)

{

char* szName = CSystem::MakeSpriteName("enemy",m_iTankEnemyNumber);

CTankEnemy* m_pTankEnemy = new CTankEnemy(szName);

m pTankEnemy->CloneSprite("enemy");

}

}

在CGameMain类的GameRun函数中调用增加敌方坦克的函数:

AddTankEnemy(fDeltaTime);

此时运行游戏可以看到,每五秒有一辆敌方坦克从下方随机生成并向下运动。

3、在GameRun中添加代码遍历容器,调用精灵移动以及发射函数(子弹和墙没有对这两个函

数进行实现,因此不会产生效果) ,把已死亡的精灵进行删除,使游戏运行正常。for(int i=0;i<();i++)

{

if(!m_vWeapon[i]->IsDead())

{

m vWeapon[i]->OnMove(fDeltaTime); m_vWeapon[i]->OnFire(fDeltaTime);

}

{

}

}

4、更改精灵世界边界碰撞时间函数中的代码,更改判断敌方坦克与世界边界碰撞和子弹与世界

边界碰撞的代码:

{

else if(strstr(szName,"enemy") != NULL) {

CWeapon* pEnemy = FindWeaponByName(szName); pEnemy->SetSpriteLinearVelocity,; pEnemy->OnMove();

{

CWeapon* pBullet = FindWeaponByName(szName); pBullet->SetHp(0);

}

在 CGameMain 中添加对 CWeapon * 类型对象 m_pAim_nor 表示我方军营

在 GameInit 中创建我方军营精灵,把军营精灵插入到容器中,设置接收碰撞以及坐标。

m_pAim_nor = new CWeapon("myaim_nor"); m pAim nor->CloneSprite("aim nor"); (m_pAim_nor);

m_pAim_nor->SetSpriteCollisionReceive(true); m_pAim_nor->SetSpritePosition,;

6、在 CTankPlayer 类中添加我方坦克与其他精灵碰撞的处理函数, 使我方坦克碰到子弹后,

血量设为 0,碰到墙后,设置速度为 0:

void CTankPlayer::OnSpriteColSprite(CWeapon* pSprite)

if(pSprite == NULL) {

return;

}

else if(strstr(pSprite->GetName(),"bullet") != NULL) {

SetHp(0);

}

else if(strstr(pSprite->GetName(),"wall") != NULL) {

SetSpeedX(0);

CBullet 类中添加子弹与其他精灵碰撞后的判断代码,判断子弹与其他精灵碰撞发生

的反应,当我方子弹与军营发生碰撞,地方坦克发射的子弹与敌方坦克发送碰撞时,只 设置子弹血量为 0,其他不做处理。其他情况,设置被碰撞精灵血量为 0:

void CBullet::OnSpriteColSprite(CWeapon* pSprite)

{

if(pSprite == NULL)

5、 }

7、在

return;

}

SetHp(0);

if(GetOwner() == 1 && strstr(pSprite->GetName(),"aim_nor") != NULL) // 我方

坦克子弹与军营发生碰撞

{

return;

}

if(GetOwner() == 0 && strstr(pSprite->GetName(),"enemy") != NULL) // 敌方坦

克子弹打中地方坦克

{

return;

}

pSprite->SetHp(0);

}

8、在CTankEnemy类中添加地方坦克与其他精灵碰撞的处理函数,设置速度为0,并设置转

换方向的时间m_fChangeDirTime 为,在CGameMain类GameRun函数中,当

m_fChangeDirTime>2 时,敌方坦克转向。所以在秒之后,这个坦克会自动转向。void CTankEnemy::OnSpriteColSprite(CWeapon* pSprite)

{

if(pSprite == NULL)

{

return;

}

SetSpriteLinearVelocity,; m_fChangeDirTime = ;

}

9、在CGameMain中添加事件函数OnSpriteColSprite ,表示精灵与精灵碰撞事件。然后

OnSpriteColSprite 中添加碰撞检测。进行的检测顺序是,首先判断发送碰撞方为谁,然后调用发送碰撞对象的碰撞处理函数,代码如下:voidCGameMain::OnSpriteColSprite(const char *szSrcName, const char *szTarName) {

CWeapon* tarSprite = FindWeaponByName(szTarName);

if(strstr(szSrcName,"bullet") != NULL)// 发送碰撞为子弹

{

CBullet *tmpBullet = (CBullet*)FindWeaponByName(szSrcName);

tmpBullet->OnSpriteColSprite(tarSprite);

}

else if(strcmp(szSrcName,"myplayer")==0) // 发送碰撞为我方坦克

{

m_pTankPlayer->OnSpriteColSprite(tarSprite);

}

else if(strstr(szSrcName,"enemy") != NULL)// 发送碰撞为敌方坦克

坦克大战 实验报告

本科实验报告 课程名称:Java语言程序设计 实验项目:TankWar 实验地点:致远楼B403 专业班级:软件工程1219 学号:2012005496 学生姓名:柴丁方 指导教师:任少斌 2014年 1 月7 日

import java.awt.*; import java.awt.event.*; public class TankWarClient extends Frame { //构造游戏开始的界面 public void KaiShiJieMian() { this.setLocation(400,200); //游戏窗口的左上点在屏幕的位置 this.setSize(800, 600);//游戏窗口的尺寸 //使按窗口的“X”时,可以关闭程序

较上一次实验添加的代码段为: public void paint (Graphics g) { Color c = g.getColor();//color类是 java。awt 中的,因此可以直接 color c g.setColor(Color.green);// 类 java.awt.Graphics 中的方法,将此图形上下文的当前颜色设置为指定颜色。 g.fillOval(50, 50, 30, 30);//int x, int y,int width,int height,分别为坐标与椭圆的长宽 g.setColor(c); }

变更2: 较上一次实验添加的代码段为: 1.更改如下代码段中的“常量值”为“x”“y”,使所填充的椭圆位置可以随值改变,为静态的图形动起来打下了基础。 static int x=50,y=50;

项目坦克大战设计报告

《JA V A程序开发课程设计》项目设计 项目名称:TankWar 软件 专业:软件工程班级:13软工1班姓名:毛晨光学号:24 一、需求分析: 基本功能: 1.玩家控制的坦克能够四处移动并且打击敌方坦克; 2.敌方坦克能够随机四处移动并且打击玩家控制的坦克; 3.玩家控制的坦克拥有血量,而敌方坦克没有; 4.坦克受到攻击时血条会缩短; 5.敌方坦克被消灭完之后,提示游戏胜利; 6.用户方坦克被消灭后提示游戏结束; 特色功能: 1.坦克具有图片,不单单只是个圈圈。 2.增加了血包功能,地图上会随机出现一个血包,我方坦克开过会增加 血量。 二、系统设计: 类:实现游戏界面地图的初始化。 类:绘制和重绘功能。 :监听用户的键盘输入。 类:实现坦克的初始化,绘制,移动,发射等功能。 :实现敌方坦克的初始化,绘制,移动,发射等功能。 类:实现炮弹的初始化,绘制,移动,攻击功能。 类:实现爆炸的初始化。绘制功能,爆炸效果由绘制半径从小到大再到小的圆实现。 类:包含枚举。 类:用于实现血包的功能。 三、功能实现。 一.绘制地图功能: public class TankMap extends Frame{ tart(); }

制坦克功能:public class Tank { 方坦克的绘制方法 public class EnemyTank extends Tank{ 弹绘制方法public class Shell { ntersects())){

ntersects())){ "hittanks"); (false); =false; Explor ex=new Explor(x-3,y-3,; return true; } } return true; } }

funcode C++课程设计坦克大战

课程设计一坦克大战 一、游戏介绍 相信大部分同学都玩过或看过“坦克大战”这款经典游戏。现在,就由我们自己动手来开发它。只要大家具备了C++语言和面向对象的基础知识,然后按照实验指南的指导一步一步进行下去,相信我们每个同学都能把这款经典游戏做出来。 二、实验目标 综合运用C++及其面向对象的知识开发一款小游戏。 三、实验内容 在一个战场上,玩家控制坦克,消灭敌方坦克,并防止敌方坦克摧毁我方基地。游戏的具体要求如下: 1、游戏有一个初始页面,如下图。 2、按下任意键开始游戏,玩家控制坦克在战场上穿梭,碰到墙时,不能通过。 3、敌方坦克自由移动,每隔2秒改变一个方向,每隔3秒发射一发子弹。 4、敌方坦克每隔5秒出现一辆,从屏幕上方的左、中、右三个位置依次出现。 5、当玩家被消灭或者我方基地被摧毁或者游戏时间大于30秒的时候,游戏结束。 游戏开始前 进入游戏

四、游戏的整体框架 五、实验指南 实验准备 打开FunCode,创建一个新的C++项目。注意:项目名称必须为英文和数字,且不能有空格。 点击“项目”→“导入地图模板”,从对话框中选取名称为TankWar的模板导入。导入成功后,界面如下: 实验一游戏开始 【实验内容】 1、设置游戏标题 2、按空格键,提示图片消失,游戏进入开始状态. 【实验运行结果】 游戏开始前 按下空格键后 【实验思路】

按下空格键是键盘按下事件,可在CSystem::OnKeyDown函数中编写响应代码。为了保证程序结构的清晰、一致,更好的办法是在CGameMain类中添加一个相应的键盘按下事件处理函数,然后在CSystem::OnMouseClick函数中进行调用。 g_GameMain是CGameMain类的对象,它是全局变量,在程序运行时最先被创建。【实验指导】 1、C++程序的执行入口是主函数。FunCode的主函数名称叫WinMain,写在Main.cpp 文件中。CSystem::SetWindowTitle是设置程序运行窗口标题的函数,修改如下:CSystem::SetWindowTitle("坦克大战"); 2、参考CSystem::OnKeyDown函数,为CGameMain类创建一个OnKeyDown函数。 CGameMain类的头文件是LessonX.h文件,实现代码写在LessonX.cpp文件中。因此,先在LessonX.h文件对函数进行声明。函数的返回值和参数列表都与 CSystem::OnKeyDown函数保持一致。访问权限应该是public。代码如下: voidOnKeyDown(constintiKey,constboolbAltPress,constboolbShiftPress,cons tboolbCtrlPress); 3、接着,在Lesson.cpp文件中对该函数进行定义: voidCGameMain::OnKeyDown(constintiKey,constboolbAltPress,constboolbShif tPress,constboolbCtrlPress) { }

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

《面向对象的编程技术》课程设计实验报告 系计算机科学与技术 班级计114 姓名石险峰 学号119074122 指导教师胡增涛 计算机学院 2012年12月

一.应用程序的名称 设计:“坦克大战” (1)参考(《PC游戏编程(窥门篇)》谭文洪著)中的“坦克大战”(TankWar工程),并对其进行完善、扩充,程序要能看出专业水平和商业化产品的效果。 (2)要求:修改案例中“子弹可以穿透石头墙”的错误;增加上帝模式(无敌);修改一种敌军坦克,使之威力更大(要求坦克画面采用学生自己的头像)(需要重新编译资源包;之所以“改”而不是“增”,是因为同学们无法修改地图编辑器,另一个办法是在程序运行后动态加入);回答“坦克大战”指导书.doc(或pdf)和TankWar剖析.doc(或pdf)中带有蓝色《….?》标记的问题。 二.应用程序的设计目的 面向对象的编程技术》课程设计是一门独立开设的实验课程,旨在进一步强化学生对类、封装、继承、多态等面向对象基本概念的理解和OOP(面向对象编程)实际动手能力,并进一步拓展到OOD(面向对象设计)原则、技巧和初步的OOA(面向对象分析)方法。 在中国,电子游戏曾一度被大家斥为“电子海洛因”。然而电子游戏在青年学生中大受欢迎却又是一个不争的事实。正如水能载舟,亦能覆舟一样,任何事物都有其两面性。与其千方百计地封堵,还不如让同学们从技术的角度来研究它,这样既可以掌握复杂系统的设计技巧,也可以破除对电子游戏的神秘感。我相信,一个人如果自己能制作游戏,如果能清楚地知道那个绚丽多彩的虚拟世界背后无非就是一些类、变量、函数的话,他就不可能再沉迷于打游戏———与一堆对象、内存变量和函数较劲。同时,从技术上讲,游戏程序的开发异常复杂,能充分体现面向对象的拟人化思想和面向对象设计技巧。通过游戏程序的制作,可以帮助学生真正掌握面向对象程序设计的精髓。 三.应用程序简介 设计目的:C++电脑游戏开发:侧重利用面向对象的拟人化思想解决复杂问题和OOD技巧; 运行环境: 1.本设计采用Microsoft Visual C++6.0编译,并能够在WIN98,WIN2000下运行 2.游戏基于Windows Game Engine(WGE游戏引擎,添翼虎科技)(没提供源程序,不过不用担心,你可以把它看成是利用DirectX快速处理图片、声音、键鼠的类库) ,该引擎需要DirectX7.0 SDK支持(仅有Runtime运行库不够,必须包含开发语言需要的Header&Libs 头文件和库文件) 功能介绍: ○1修改案例中“子弹可以穿透石头墙”而且增加了敌军坦克子弹不能穿过 箱子:无论是敌军坦克还是玩家坦克的子弹都不能穿过石头,敌军坦克子弹不能透过箱子,一旦它们相碰撞子弹会自动销毁。 ○2增加上帝模式(无敌):玩家1通过按F1键变为上帝模式,再按一次,还原,一旦玩家进入上帝模式,敌军坦克的子弹对玩家坦克没任何损伤。 ○3修改火坦克的性能,使之威力更大,并且将该敌军坦克改为其他图像,通过更改火坦克的一些属性,使火坦克的子弹射程、威力,坦克的移动速

坦克大战课程设计论文

坦克大战游戏设计 1.课程设计的目的 随着手机的日益普及,java功能在移动设备上的实现及java 应用程序产生的影响力,对丰富人们的生活内容,提供便捷的咨询起着不可忽视的作用。本项目介绍了坦克大战的基本构建方法、java的相关技术及本程序的结构分析和具体功能的实现。游戏是在Eclipse3.2环境下编程。本项目重点运用了图形化用户界面GUI,Thread多线程的有关知识,其中涉及了绘图工具的运用,事件处理操作以及图形的碰撞检测等知识点。通过此课程设计,使学生巩固所学知识、培养学生动手能力,了解Java的面向对象的体系结构。学生用Java语言设计一个完整的应用程序,综合应用所学知识完成软件的分析、设计、调试和总结,提高学生对Java语言的综合应用能力和解决问题的能力。 2.设计方案论证 2.1设计思路 本项目介绍了坦克大战的基本构建方法、java的相关技术及本程序的结构分析和具体功能的实现。游戏是在Eclipse3.2环境下编程。 一、游戏基本元素:坦克,炮管,子弹,墙壁,地雷 二、它的主要功能: (1)能够朝四个方向移动:上、下、左、右键。 (2) 按下鼠标左键发射普通子弹;按下鼠标右键发射散弹;子 弹爆炸的效果,普通子弹和炮弹的效果 (3)敌人能够移动

(4)能够模拟爆炸 (5)能够产生障碍 (6)能够增长生命 玩家控制主坦克(上方有血条的)的移动以及炮弹的发射。若玩家将敌方坦克全部打掉则玩家胜;若期间由玩家控制的主坦克被打掉则视为玩家失败。游戏中只有普通墙作为障碍物,玩家无法穿越它们并且普通子弹不能将墙打穿 ;但是玩家可以用炮弹将普通墙打掉。桃心可以将坦克的血加满。 2.2简要的设计流程: 键盘监听器 2.2设计方法 2.2.1构建游戏主类

程序设计实训坦克大战实验报告材料

程序设计实训报告 坦克大战 专业班级:装控1401 实习时间:2015年7月10日至7月14日实习地点:微401 成员 1:赵振华 成员 2:许晨欢 成员 3:蒋绪涛

一、作品概述 1.1 创新点: 1、自定义并命名树林和钢板精灵,设置树林属性为不接受碰撞可以自由穿梭,钢板为接受任何碰撞但不做任何处理(即子弹和坦克均不能摧毁钢板)。 2、添加坦克发炮、击中目标和坦克移动的特殊声效。 1.2 概述: 这款游戏是我们QWER小组以经典90版坦克大战为背景制作的坦克大战的改编款,玩家通过控制坦克摧毁敌方坦克来保卫主基地不被摧毁。当敌我双方坦克相碰或己方基地被子弹摧毁时游戏结束(敌我双方子弹均可摧毁基地),每隔3秒钟出现一辆敌方坦克,游戏最大时长为100秒。此款游戏与经典90版坦克大战较为相似,操作简单,能唤起我们对童年的回忆。 二、功能设计 玩家坦克与敌方坦克在街道中进行巷战,玩家坦克被击中或与敌方坦克相撞、玩家指挥部被击中或游戏时间到,一局游戏结束。 按下空格键后游戏开始,“空格开始”消失,载入地图,100秒倒计时开始,并把玩家坦克设置在指挥部左侧。 游戏时间到,玩家坦克被敌方坦克摧毁,与敌方坦克相撞,或者玩家指挥部被摧毁,一局游戏结束,游戏回到初始界面,并显示上一局的分数。 玩家用W、A、S、D键控制坦克上、下、左、右运行,按J键开炮。坦克行进过程中有特殊声效,坦克发射或击中目标都有相应的声效。玩家坦克碰到墙和钢板就停下来,需要调转方向才能继续前进。玩家坦克开炮,一炮就能摧毁一块墙或者一辆敌方坦克,但不能摧毁钢板,玩家可穿梭于树林中。玩家每摧毁一辆敌方坦克,加1分。 玩家指挥部被坦克或者炮弹(不管玩家还是敌方)碰上,都会被摧毁。 每隔3秒钟,就会产生一辆敌方坦克。敌方坦克每隔一段时间,就自动开炮。敌方坦克遇到墙就会停下来。停下来的坦克,前方的墙如果被摧毁了,又能继续前进。每隔几秒钟,敌方坦克就会顺时针变换一个方向前进。每局最大时长为100秒。

java开发坦克大战

j a v a开发坦克大战 IMB standardization office【IMB 5AB- IMBK 08- IMB 2C】

坦克大战游戏演示为什么选择这个项目 1、好玩 2、涉及到java各个方面的技术 1、java面向对象编程; 2、界面编程; 3、绘图技术; 4、多线程; 5、文件i/o操作; 6、数据库 3、巩固旧知识,学习新知识 java绘图坐标体系 绘图坐标本系--介绍 坐标原点位于左上角,以像素为单位。像素是计算机屏幕上最小的显示单位。在java的坐标系中,第一个是X坐标,表示当前位置为水平方向,距离坐标原点X个像素;第二个是Y坐标,表示当前位置为垂直方向,距离坐标原点Y个像素。 坐标体系--像素 计算机在屏幕上显示的内容都是由屏幕上的每一个像素组成的。例如,计算机显示器的分辨率是800×600,表示计算机屏幕上的每一行由800个点组成,共有600行,整个计算机屏幕共有480000个像素。现在的计算机可以支持更高的分辨率,也就是说,屏幕上可以显示更多的像素。因此,像素是一个密度单位,而厘米是长度单位,两者无法比较。 绘图原理(1)[] Component类提供了两个和绘图相关最重要的方法: 1、paint(Graphicsg)绘制组件的外观 2、repaint()刷新组件的外观

当组件第一次在屏幕显示的时候,程序会自动的调用paint()方法来绘制组件 .*; .*; publicclassWindow013extendsJFrame{ ; 7、画字符串drawString(Stringstr,intx,inty); 8、设置画笔的字体setFont(Fontfont); 9、设置画笔的颜色setColor(Colorc); ; .*; publicclassWindow014extendsJFrame{ ; .*; publicclassWindow015extendsJFrame{ ; .*; import publicclassWindow016extendsJFrameimplementsActionListener{ quals("黑色")){ 点击了黑色按钮"); ; }elseif().equals("红色")){ 点击了红色按钮"); ; }else{ 不知道"); } } } classCatimplementsActionListener{ publicvoidactionPerformed(ActionEventarg0){ if().equals("黑色")){ 也知道你按下了黑色按钮");

项目-坦克大战-设计报告

《JAVA程序开发课程设计》项目设计 项目名称:TankWar 软件 专业:软件工程班级:13软工1班姓名:毛晨光学号:1322120124 一、需求分析: 基本功能: 1.玩家控制的坦克能够四处移动并且打击敌方坦克; 2.敌方坦克能够随机四处移动并且打击玩家控制的坦克; 3.玩家控制的坦克拥有血量,而敌方坦克没有; 4.坦克受到攻击时血条会缩短; 5.敌方坦克被消灭完之后,提示游戏胜利; 6.用户方坦克被消灭后提示游戏结束; 特色功能: 1.坦克具有图片,不单单只是个圈圈。 2.增加了血包功能,地图上会随机出现一个血包,我方坦克开过会增加 血量。 二、系统设计: 1.TankMap类:实现游戏界面地图的初始化。 2.PainTread类:绘制和重绘功能。 3.DirectionHandler:监听用户的键盘输入。

4.Tank类:实现坦克的初始化,绘制,移动,发射等功能。 5.EnemyTank:实现敌方坦克的初始化,绘制,移动,发射等功能。 6.Shell类:实现炮弹的初始化,绘制,移动,攻击功能。 7.Explor类:实现爆炸的初始化。绘制功能,爆炸效果由绘制半径从小到 大再到小的圆实现。 8.Direction类:包含枚举。 9.Blood类:用于实现血包的功能。 三、功能实现。 一.绘制地图功能: public class TankMap extends Frame{ //定义地图的尺寸。 public static final int MAPWIDTH=800; public static final int MAPHEIGHT=600; //我方坦克 Tank t=null; //定义随机出现的血包 Random r=new Random(); Image bufferImage=null; public static java.util.Listshells=new ArrayList(); //地方坦克集合 public static java.util.List-> enemys=new ArrayList();

坦克大战系统《Java程序开发实训》综合实训报告

《Java程序开发实训》综合实训报告 题目:坦克大战系统 姓名:方庆 学号:2010203206 班级:10软件(2)班

一、系统实现的主要功能及运行结果截图 选择的语言的原因 游戏本身是一种娱乐方式,带给人无尽的乐趣,而且游戏行业的发展也将是带动周边行业的发展。同样对做出游戏的人的要求也会越来越高一满足游戏爱好者的要求。本次期末设计就是设计一种娱乐性较强的小游戏坦克大战,说到大战其实是不敢当的。但游戏基本拥有可玩性。java语言是一种跨平台,适合与分布计算环境的面向对象编程语言,java主要用在web开发,手机游戏及一些平台游戏的开发,他有很好的跨平台性。所以本次的设计坦克游戏选择的是java。 系统软件的软件环境 1.网络服务器操作系统:Window是 XP以上 2.开发工具:Eclipse 3运行环境:J2sdk 4.编程语言:java语言。 人机对战模式功能 1.能够发射子弹打击敌人 2.敌人能够移动 3.能够模拟爆炸 4.能够产生障碍 5能够增长生命6.能够使用超级子弹 坦克可以发射子弹

玩家坦克被击中血量减少。 被击中的坦克发生爆炸并且吃血块可以加血量。

玩家坦克可以从把方向发射超级子弹 自己的TankHealth为<=0时,。说明玩家坦克已死亡。游戏结束

本系统的坦克大战是基于java语言设计的开发,具有较高的人工智能和相对的图形处理。游戏可一人作战每次电脑方有10辆坦克, 此一举消灭全部的敌方坦克为目的。在这过程中坦克有机会得到血块来添加自己的生命值。从而变得强大。也利用wall来形成阻击敌人。 游戏拥有开挂的功能。可以穿过墙体来攻击敌方坦克。还给玩家坦克 置了超级炮弹。从八个方向同时射出炮弹来摧毁敌方坦克。主要功能 简单罗列如下: 1.屏幕左上方显示游戏的状态,当玩家方坦克全数为0是游戏结束 2.敌方坦克只在空地上行走,不可通过Wall 3.游戏打坏敌方坦克后,可随机位置随机出现血块奖励。坦克经过该 位置可获得相应的生命值加成。 4.玩家坦克的游戏资格和电脑坦克不同。 TankClient类设计流程 游戏系统类关联图

坦克大战游戏程序课程设计

《程序设计应用基础》课程设计计划书

坦克大战游戏 1引言 学习了C语言程序设计之后,我们粗略的掌握了程序设计的基本思路和要求,为了更加熟练的掌握这门计算机语言,我们选择编译一个经典小游戏——坦克大战。通过课程设计提高我们的动手能力,把理论知识运用到实践当中。在课程设计中,C语言的语法和逻辑严谨,对于初学者而言,有时忘记一个逗号或者分号整个程序便运行不了,经过了反复的调试,修改,最终形成可执行的程序。在这个过程中,通过不断的练习,我们对C语言的掌握程度有明显的提高,同时,也锻炼了我们的头脑,使我们的思维更加科学严谨。 2设计方案 2.1设计思路 坦克大战游戏,一共两关。不同的关卡,游戏地图、敌方坦克出现的种类不一样。敌方坦克地图上最多存在4辆,击杀后会出现新坦克直至补足4个,当击杀坦克一定数值则敌方新坦克不会再增加。击杀完所有坦克则胜利过关。己方坦克也有复活次数,用完则失败。另地图正下方有己方老家,若被敌方坦克攻破则游戏失败。 3程序设计与实施 3.1程序的主要模块 整个程序分为里表两大部分。 里部分由41*41的int地图数组组成,每个元素代表了该以该数组元素行列下标为地图坐标y,x那个单元的情况,不同的地图障碍物在该数组有不同的值,坦克在地图上占3*3个单元,在地图数组内相应坐标的3*3个元素内也对应特殊的值。由地图数组值可以读出该坦克信息。 表部分则是根据里部分的地图数组通过gotoxy和printf函数在命令行界面打印出相应字符以构成游戏界面的。 程序中的每个函数操作都是通过里部分(地图数组)判定,然后对里部分(地图数组)操作,再由里部改变外部,由gotoxy和printf函数将可视化界面呈现给玩家。也就是游戏主体函数内里表部分是一起操作的,不分开。 对于函数分类,程序又可分为三大类。一类游戏辅助函数。一个子弹系统,一个坦克系统。子弹和坦克分别都是独立运作的系统,有少量信息交换。 3.2 主函数及其流程图 主函数包括打印地图,实现游戏内置调节游戏速度的功能,判断坦克类型,判断敌我坦克是否存活,判断游戏胜负。 3

实习成果

毕业实习是学生学完教学计划规定的全部课程后,在进行毕业论文之前的一个重要的教学环节,是一个理论联系实际,锻炼和提高学生组织管理能力,培养分析、解决实际问题能力的教学过程。通过实习使我加深对所学专业课程的理解,增强综合运用专业知识的能力。熟悉专业工作的内容,提高运用理论知识解决实际问题的能力。根据所学课程的理论知识,结合企业的运营实际,同时提高观察问题、分析问题、解决问题的能力。 我实习的时间为2013年9月2日——2013年10月8日,长沙卓京信息有限公司。长沙卓京信息技术有限公司位于湖南林业科学院林培楼二楼,由来自华为、金蝶、百度、中国移动、中国大唐电力等知名IT公司的骨干、管理人才创办,直接引进国际先进IT技术,结合中国本土IT企业需求,培养高端IT人才。 卓京信息致力于为IT企业培养并输送基于Java、Android、企业级软件开发、手机软件开发、3G/4G开发人才。公司于国内多家优秀企业深入合作,由企业提供实习基地、设备资源,并指派专业人员参与学校的专业教学。 卓京信息推出国内面向移动互联网行业最权威的3G职业教育品牌,公司已获得工业和信息化部通信行业职业技能鉴定指导中心的认可,学生入学签订就业保障协议,毕业及即可就业。实现招聘和岗前实训同步、教学与研发同步,学院就业率及平均就业薪资稳居国内同类机构领先水平,教学质量有口皆碑。公司具备强大的产品开发、产品推广、项目运营和创业卵化能力。随着3G数据业务的普及,“3G”带来大量的就业机会,卓京3G移动方向的培训产品正是在这种背景应运而生。 在一月的时间内,我学习Java的相关知识,参加培养职业素养课,参与Java项目的制作。根据权威机构赛迪智库的分析结果,自2010年以来,我国移动互联网用户,也就是手机上网人数呈爆炸式增长。 Java是现在全球最时髦的开发工具之一,它拥有一套庞大且完善的类库,内置了其他语言需要靠库甚至是操作系统才能支持的功能,拥有一个虚拟机,总之,Java的出现,确实给整个程序界带来了巨大的冲击,也许现在还无法准确评估Java为整个IT业带来的影响,但是有一点却毋庸置疑---Java将不可避免地影响一代程序员. Java在可以预见的一段时间里带给自己的影响. 在美国,起来越多的应用是基于Java开发的.Java在企业的应用中的日臻完美,打消了许多人对Java无法应用于大型企业级应用的顾虑.而在国内,Java也已如火如荼.据调查,在未来几年内,将会出现20万个Java程序员职位需求,也许这将超过其它任何一种程序员的需求. Java的BBs有Java研究组织,中国Java世界,SunOne专家路等(刚成立)Java是面积网络的设计语言,用来让程序员创建应用程序,这些应用程序可以通过下载,而且可在任何计算平台上安全地运行,如果再加上互联网和公司企业内部网体系,你将会拥有一个未准的网络计算环境,Java作为一个分布式的,面向对象的程序设计各方,可以让位于任何地方的任何计算机应用网络上的的应用程序. 综合上述,Java的生命力体现在如下方面: 1. Java产生与流行是InterNet发展的客观要求. 2.是一门各方面性能都很好的编程语言,它的基本特点是简单,面向对象,分布式,解释的,健壮的,完全的,结构中立的,可移植的,性能很优异的,多线程的,动态的,适合的Internet环境上开发应用系统.

python精品教学课件(温州大学)实验6 游戏:外星人入侵

---------------------------------------------------------------最新资料推荐------------------------------------------------------ python精品教学课件(温州大学)实验6 游戏:外 星人入侵 温州大学物理与电子信息工程学院软件设计基础实验报告实验名称: 实验 6 游戏: 外星人入侵班班级: 14 电科 1 班姓姓名: 徐炜学学号: 14211111132 实验地点: 5B105 日日期: 2019/4/21 一、实验目的: 用利用 Python 模拟游戏体验二、实验环境: win 7 + python 3.6 三、实验内容和要求: 内容1: 按教材第 2 部分项目 1 的指引,实现外星人入侵的游戏,其中包含飞船、外星人、积分等元素。 内容2: 自己设计一个小游戏项目,并使用 pygam 模块实现之。 通过本次实验,掌握以下编程知识点: 各种函数方法的套用四、实验步骤: (对实验步骤的说明应该能够保证根据该说明即可重复完整的 1 / 4

实验内容,得到正确结果。 )我是通过以下步骤来完成实验任务,得到结果的: (在编辑器输入代码,通过调试发现何种问题,修改程序,得到计算结果,判别结果的正确性,修改错误的结果,得到正确的结果或更好的结果,分析结果并得出结论,等等。 。 。 ) 1.通过模拟书上的代码加以改编,测试并实现。 2.通过同类型的游戏相比较,加以改进。 3.通过模拟的实验加以复制。 五、实验结果与分析(含程序、数据记录及分析和实验总结等): 每个程序的代码(重要语句要有注释)和运行结果(均使用屏幕拷贝图像的方式)罗列和说明如下: 内容 1 的代码: 第一部分: 外星人的类第二部分: 主要函数第三部分: 子弹的类第四部分: 按钮的类第五部分: 功能管理的类第六部分: 统计相关的类第七部分: 现实得分信息第八部分:

java坦克大战毕业设计论文

基于J2SE的网络版坦克大战游戏设计 摘要 [摘要]:J2SE (Java 2 Standard Edition)就是Java2的标准版,主要用于桌面应用软件的编程,是伴随着计算机技术的飞速发展而诞生的一项新的开发技术。随着个人电脑的日益普及、Java 功能在个人电脑上的实现,Java应用程序产生的单机增值服务逐渐体现出其影响力,对丰富人们的生活内容、愉悦身心、开发智力等起着不可忽视的作用。该论文通过总结和分析JA V A 游戏的开发流程和代码框架的设计,开发了一款基于J2SE架构的游戏——坦克大战。本设计采用面向对象的设计模式,对游戏中的所有物体赋予对象的概念和属性。运行程序后允许用户选择执行选项菜单。在开始游戏后,启动服务器和客户端,对背景的所有物体进行绘图。在主程序运行的线程中,画面刷新将以一定的频率采用双缓冲技术对屏幕重绘,实时反映整个游戏的进行状态。用户控制的坦克运行在主线程中,随屏幕刷新的频率而移动。坦克将在游戏开始时进行初始化,然后将坦克绘制在地图的上层。本设计主要实现的功能是让坦克能向八个方向移动,并且打出炮弹,子弹击中敌人坦克,子弹和敌人坦克同时消失,产生爆炸,CPU坦克能智能的移动并且打出炮弹。能够支持网络对战和单机对战两种模式。 Java良好的跨平台特性在软件的开发中显示出了巨大的威力,“一次编写,随处运行”,java 系统可以运行在不同的操作系统和硬件上。随着linux的持续增长以及MacOSX完全支持java 技术,跨平台的特性变得越来越有分量。 由于免费、跨平台、java语言本身技术先进,在高校中,java已经成为许多学科研究、课程和计算的首选语言,用java做上机作业,一般都是鼓励的。据我所知,北大、清华许多院系的研究生入学考试都可以用java语言答题。实际上,用java来完成这些工作,大多数情况下要比用C或其他语言简洁得多,你可以把注意力集中在算法等核心部分,从而获得更高分数。 [关键词] 面向对象坦克大战游戏J2SE Socket

毕业设计论文 基于J2ME的Java游戏--坦克大战的开发

目录 摘要 ................................................................................................................... - I - Abstract .................................................................................................................... - I - 引言 ...................................................................................................................... II 第一章绪论 .................................................................................................... - 1 - 1.1 手机软件现状.......................................................................................... - 1 - 1.2 游戏业务及J2ME概况............................................................................ - 1 - 1.3 任天堂(Nintendo)的8位FC机器和Battle City背景介绍............ - 3 - 1.4 本章小结.................................................................................................. - 3 - 第二章开发环境及相关技术的介绍 ................................................................ - 5 - 2.1 开发环境.................................................................................................. - 5 - 2.2 Java语言的特点..................................................................................... - 5 - 2.3 关于JBuilder9....................................................................................... - 5 - 2.4 关于Wireless Tool Kit....................................................................... - 6 - 2.5 Java Appication Manager.................................................................... - 6 - 2.6 本章小结.................................................................................................. - 6 - 第三章程序结构、思想和相关技术 ................................................................ - 7 - 3.1 本程序需解决的有关技术问题.............................................................. - 7 - 3.2 程序流程.................................................................................................. - 8 - 3.3 绘图与MIDP2.0新增的GameCanvas包.............................................. - 10 - 3.3.1 提供低级绘制的Canvas类....................................................... - 10 - 3.3.2 Graphics类................................................................................ - 10 - 3.3.3 PNG格式...................................................................................... - 10 - 3.3.4 Game包中的新功能.................................................................... - 11 - 3.3.5 有关绘图的一些技术................................................................. - 12 - 3.4 坦克的控制和敌方的智能运行............................................................ - 12 - 3.5 子弹的运行和控制................................................................................ - 13 - 3.6 RMS数据库系统..................................................................................... - 14 - 3.7 内存使用的最佳化................................................................................ - 15 - 3.8 混淆器(Obfuscator)的使用................................................................ - 16 - 3.9 模拟器的相关调试................................................................................ - 16 - 3.10 本章小结.............................................................................................. - 17 - 第四章程序分析和具体实现 .............................................................................. - 18 - 4.1 游戏进入前的选择................................................................................ - 18 - 4.2 主游戏逻辑及其涉及到的若干类........................................................ - 19 - 4.3 坦克的共同行为.................................................................................... - 21 - 4.4 玩家坦克的功能属性............................................................................ - 22 - 4.5 敌人坦克的功能属性............................................................................ - 22 - 4.6 子弹的运行和控制................................................................................ - 24 - 4.7 记分系统................................................................................................ - 25 -

坦克大战设计

湖北大学 J A V A课程设计论文 题目坦克大战游戏 姓名张诚学号 2014221119200156 姓名柳谦学号 2014221119200091 专业年级计算机科学与技术1401 指导教师王雷春职称副教授 2016年 5月

目录 绪论 (4) 1背景 (4) 2课程设计目标及目的 (5) 2.1课程设计的目标 (5) 2.2课程设计的目的 (5) 2.3可行性分析 (5) 2.3.1技术可行性 (5) 2.3.2经济可行性分析 (6) 3概要设计 (6) 4详细设计 (7) 4.1项目与类的结构图 (7) 4.2 各类实现的功能概要 (7) 4.2.1 barrier包 (7) 4.2.2 lightButton包 (7) 4.2.3 Tankwar包 (7) 4.2.4 mapediter包 (8) 4.3 主要类的的UML图及主要成员变量和函数说明 (8) 4.3.1 Barrier类 (8) 4.3.2 LightButton类 (11) 4.3.3 Mapediter类 (13) 4.3.4 Main类 (15) 4.3.5 Boom类 (18) 4.3.6 Item类 (18) 4.3.7 Missle类 (21) 4.3.8 PanelShow类 (25) 4.3.9 Tank类 (26) 4.3.10 TankWar 类 (33) 5运行结果 (39) 6总结 (46) 7参考文献 (46) 8附录 (47) 坦克大战

摘要 坦克大战是一款最初由日本南梦宫Namco游戏公司1985年在任天堂FC平台上,推出的一款多方位平面射击游戏。一经推出,人气十分高涨,然后又陆续推出了GB,PC等版本,玩法也大大扩充,由最初的单人2D过关演变到如今的多人3D联网对战游戏,我们小时候应该都体验过,之前C#课程中已经了解过有关信息,如今就想同样以Java为载体编写一款坦克大战。 本课题展示了如何使用Java编写出能够实际运行的单人版坦克大战游戏。课题介绍了项目的功能、类的设计和逻辑难点等重要点。通过本课题,你可以了解到有关Java开发在实际运用中的基础知识、并对应用游戏开发有一定的新的认识。

java实现坦克大战课程设计报告书

Java实现坦克大战小游戏 摘要 Java是一种可以撰写跨平台应用软件的面向对象的程序设计语言。我的课程设计是用java来做一个简单的坦克大战小游戏。我将这个程序细分了多个部分,每个部分都建了独立的类,比如:坦克的模型类,河道,树和坦克方向等等。之所以将之细分,是遵循了java的万事万物皆对象的原理。在实现每个类时,最简单但也是最繁琐就是建立界面与实例化坦克,因为这牵扯了界面布局,监听的建立等;而有一些类,比如;河道、墙、坦克,这些类这可以依样画葫芦的编写。 在编写过程,借鉴了他人的一些图片模型,实现的功能也并不是和经典的FC坦克大战相同,但是每个坦克之间的互动还是实现了的。 关键词:万事万物皆对象界面布局坦克之间的互动

USE JAVA TO REALIZE BATTLE CITY MINI-GAME ABSTRACT Java is a object oriented program design language what can compose cross platform application software. My curriculum design is using JAVA language to make a simple small game called Tank Battle. I break down this program into multiple parts, each part is to establish an independent class, such as: Tank Model class, River Course class, Tree class, The Direction of Tank class and so on. The reason divides into multiple parts, is because follow the principle of JAVA that everything is an object. When implements every class, the most simple but also the most troublesome is build interface and instantiate Tank class, because it is involved of the interface layout, monitoring the establishment. While there are some classes, such as: River Course class, Wall class and Tank class, can write like stick closely to the pattern given. In the preparation process, I refer some pictures of models of others, the function of the retaliate isn’t like FC Tank Battle, but the interaction between ach tank is realized. Key words: everything is an object, the interface layout, the interaction between

相关文档
相关文档 最新文档