当前位置:文档之家› funcode C++课程设计_坦克大战

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

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

课程设计一坦克大战

一、游戏介绍

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

二、实验目标

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

三、实验内容

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

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

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

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

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

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

游戏开始前

上海锐格软件有限公司

1

进入游戏

四、游戏的整体框架

五、实验指南

实验准备

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

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

实验一游戏开始

【实验内容】

1、设置游戏标题

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

【实验运行结果】

2

上海锐格软件有限公司

3

游戏开始前

按下空格键后

【实验思路】

按下空格键是键盘按下事件,可在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。代码如下:

void OnKeyDown( const int iKey, const bool bAltPress, const bool bShiftPress, const bool

bCtrlPress );

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

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

const bool bCtrlPress )

{

}

4、在CSystem::OnKeyDown函数(Main.cpp文件中)调用CGameMain::OnKeyDown函数,

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

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

数OnKeyDown。

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_iGameState = 1;

}

}

4

上海锐格软件有限公司

5

KEY_SPACE 是枚举变量KeyCodes 的成员,表示空格键。KeyCodes 定义在CommonClass.h 文件中。该枚举变量定义了全部的键盘值。注意:必须将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++ 6.0为例:

第一步、点击菜单“插入”-〉“新建类”。

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

6

上海锐格软件有限公司

7

第三步、点击“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类(具体声明查看CommonClass.h),构造函数为

CSprite( const char *szName )。

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

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

CTankPlayer::CTankPlayer(void)

{

}

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

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

{

m_iDir=0;

m_fSpeedX=0.f;

m_fSpeedY=0.f;

m_iHp=2;

}

子类对象创建时,要先调用父类的构造函数完成父类部分的构造。如果父类没有默认构造函数,子类的构造函数必须显示调用父类的构造函数。CTankPlayer构造函数调用CSprite类构造函数,并将参数szName的值传递给它,从而将名称为szName 的精灵图片与CTankPlayer对象绑定起来。

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

调用setHp方法设置血量。然后调用父类的SetSpritePosition函数将坦克精灵设置在屏幕中央(0,0)处。接下来给坦克精灵设置时间边界的大小,与世界边界的碰撞模式为WORLD_LIMIT_NULL,表示精灵与世界边界碰撞的响应由代码完成,同时设置坦克碰撞模式为发送碰撞和接收碰撞。

void CTankPlayer::Init()

{

SetHp(2);

SetSpritePosition(0.f,0.f);

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

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

SetSpriteVisible(true);

}

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

注意在LessonX.h添加头文件:

#include"TankPlayer.h"

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

上海锐格软件有限公司

9

游戏进入开始状态(见实验一)。程序再次执行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) {

if(bPress) {

switch (iKey) {

case KEY_W: SetDir(0); SetSpeedX(0); SetSpeedY(-8); break; case KEY_D: SetDir(1); SetSpeedX(8); SetSpeedY(0); break; case KEY_S: SetDir(2); 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);

SetSpriteLinearVelocity(GetSpeedX(),GetSpeedY());

}

}

}

用参数bPress来判断键盘是按下还是弹起。如果bPress为false,表示键盘弹起,

且弹起的键是WASD键时,设置坦克的X轴和Y轴移动速度都为0。如果bPress为

true,表示键盘按下,根据按下的键,为m_iDir,m_fSpeedX,m_fSpeedY赋予相应的

值。SetSpriteRotation和SetSpriteLinearVelocity函数用来设置精灵的角度和线性速

度,具体含义参考CommonClass.h文件。

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

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

注意:OnMove参数bPress的值为true。在OnKeyDown函数中添加代码如下:

if(m_iGameState == 2)

{

m_pTankPlayer->OnMove(iKey, true);

}

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

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

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

用来处理按键弹起事件,然后在CSystem::OnKeyUp函数中调用它。关于这个函数如

何声明、定义以及调用参考实验一。

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

值为false。

void CGameMain::OnKeyUp(const int iKey)

{

if(m_iGameState == 2)

{

m_pTankPlayer->OnMove(iKey, false);

}

}

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

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

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

OnSpriteColWorldLimit函数,用来处理精灵与世界边界的碰撞事件,然后在CSystem:: OnSpriteColWorldLimit函数中调用它。关于这个函数如何声明、定义以及调用参考

实验一。

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

用字符串处理函数strstr()来判断碰到世界边界的精灵是否为我方坦克。当碰到世界

边界的精灵名字中含有”player”的时候,strstr会返回一个非空值。因此代码如下:

void CGameMain::OnSpriteColWorldLimit( const char *szName, const int iColSide )

10

11

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 的值,然后

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

v oid CBullet::OnMove(int iDir)

{

SetDir(iDir);

switch(GetDir())

{

case 0:

SetSpeedX(0);

SetSpeedY(-10);

break;

case 1:

SetSpeedX(10);

SetSpeedY(0);

break;

case 2:

SetSpeedX(0);

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)

{

pBullet->SetOwner(1);//1表示我方坦克发射的子弹

}

else

{

12

上海锐格软件有限公司

13

pBullet->SetOwner(0); //0表示地方坦克发射的子弹 } }

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

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

void CTankPlayer::OnFire() {

float x,y;

x = GetSpritePositionX(); y = GetSpritePositionY(); switch(GetDir()) {

case 0:

y=y-GetSpriteHeight()/2-1; break; case 1:

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

y=y+GetSpriteHeight()/2+1; break; case 3:

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

g_GameMain.AddBullet(GetDir(),x,y,1); }

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

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

if(iKey == KEY_J)//判断按下键是够为J 键 {

m_pTankPlayer->OnFire(); }

实验四 敌方坦克

【实验内容】

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_NULL,表示精灵与世界边界碰撞的响应由代码完成。最后设

置方向和速度代码如下:

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

float fPosX;

SetDir(2);

SetHp(2);

switch (iPos)

{

case 0:

fPosX = -24.f;

break;

case 1:

fPosX = 0.f ;

14

上海锐格软件有限公司

15

break; case 2:

fPosX = 24.f; break; default:

break; }

SetSpritePosition(fPosX,-20.f); SetSpriteLinearVelocity(0.f,8.f);

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 {

iDir = 0; }

SetDir(iDir);

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

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

现隔一段时间随机改变方向。在CTankEnemy 类中添加成员变量m_fChangeDirTime 在构造函数中初始化为0,并添加get 和set 方法。 void CTankEnemy::OnMove(float fDeltaTime) {

m_fChangeDirTime+=fDeltaTime; if(m_fChangeDirTime>2.0f) {

OnMove();

m_fChangeDirTime = 0.f; } }

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

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

void CTankEnemy::OnFire(float fDeltaTime) {

m_fBulletCreateTime+=fDeltaTime;

if(m_fBulletCreateTime>3.0f)

{

m_fBulletCreateTime = 0.0f;

float x,y;

x = GetSpritePositionX();

y = GetSpritePositionY();

switch(GetDir())

{

case 0:

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

break;

case 1:

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

break;

case 2:

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

break;

case 3:

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

break;

}

g_GameMain.AddBullet(GetDir(),x,y,0);

}

}

因为用到全局对象G_GameMain,所以需要在TankEnemy.cpp中声明头文件:

#include"LessonX.h"

8、在CGameMain类中添加CTankEnemy类指针变量m_pTankEnemy。注意在LessonX.h

中声明头文件:

#include"TankEnemy.h"

然后在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方法中添加敌方坦克与世界边界碰撞的

检测。

16

上海锐格软件有限公司

17

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

m_pTankEnemy->OnMove(); }

实验五 加载地图

【实验内容】

1、加载游戏地图;

【实验运行结果】

【实验思路】

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

【实验指导】

1、首先在LessonX.cpp 中定义一个表示地图的二维数组来表示地图,其中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)

{

szName = CSystem::MakeSpriteName("wall",j+i*13+i);//重新起名

CSprite* pWall = new CSprite(szName); //新建对象

pWall->CloneSprite("wall"); //克隆墙块

pWall->SetSpriteCollisionActive(0,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、创建一个容器,用来存放所有精灵。

【实验运行结果】

18

上海锐格软件有限公司

19

【实验思路】

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

我们添加父类CWeapon 。

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()函数,此函数的作用是判断精灵是否死亡,在游戏运

10 C语言课程设计_坦克大战(提高篇)

C语言课程设计--坦克大战 一、游戏介绍 玩家坦克与敌方坦克在街道中进行巷战,玩家坦克被击中、玩家指挥部被击中或游戏时间到,一局游戏结束。 二、实验目的 综合应用C语言知识和设计知识开发一款小游戏。 三、实验内容 初始界面如下图。 按下空格键后游戏开始,“空格开始”消失,载入地图,并把玩家坦克设置在指挥部左侧。 游戏时间到,比如30秒,玩家坦克被敌方坦克摧毁,或者玩家指挥部被摧毁,一局游戏结束,游戏回到初始界面,并显示上一局的分数。 游戏区域为下图中最内部的黑色区域,左上角坐标[-26, -22],右下角坐标为[26, 22]。墙为正方形,边长为4,坦克也是正方形,比墙略小一点。 玩家用WASD键控制坦克上、下、左、右运行,按J键开炮。玩家坦克碰到墙就停下来,需要调转方向才能继续前进。玩家坦克开炮,一炮就能摧毁一块墙,或者一辆敌方坦克。玩家没摧毁一辆敌方坦克,加1分。 玩家指挥部被坦克或者炮弹(不管玩家还是敌方)碰上,都会被摧毁。 每隔几秒钟,比如3秒,就会产生一辆敌方坦克。敌方坦克每隔一段时间,比如1秒,就自动开炮。敌方坦克遇到墙就会停下来。停下来的坦克,前方的墙如果被摧毁了,又能继续前进。每隔几秒钟,比如2秒,敌方坦克就会顺时针变换一个方向前进。

四、实验准备 本实验中可能用到的C 语言标准库函数和FunCode API Stdio.h Math.h String.h

FunCode API

原图的角度 获得的旋转角度即为两张图片的

五、程序初步设计 如果程序规模比较小的时候,我们习惯一上手就写代码,边写边调整。但是当程序越来越大,代码越来越多的时候,如果我们还用这种方式编程,程序写到一半的时候,你可能会恨不得重写一遍。 此,我们在写代码之前,先把程序功能细化一下,并初步设计好程序结构,包括数据结构和自定义函数。有了比较清晰的思路以后,再开始开发程序。 在本项目中,我们要操作的对象有6个:玩家坦克、敌方坦克、玩家子弹、敌方子弹、墙、玩家指挥部。 其中,墙和指挥部都比较简单,主要是前4种,而且它们有共通性:名称、速度、位置,因此,可以考虑用一个结构体来表示。此外,我们需要用一种数据结构来管理它们。由于敌方坦克、子弹的数量都无法事先确定,所以我们选择链表而不是数组来管理它们。 struct Weapon{ char szName[128]; // 精灵名称 float fPosX, fPosY; // 精灵坐标 float fSpeedX, fSpeedY; // X和Y方向上速度 float fFireTime; // 敌方坦克距下一次开炮的剩余时间 int iHp; // 生命值 int iDir; // 朝向:0 - 上方;1 - 右方;2 - 下方;3 - 左方 int iType; // 类型: 0 - 我方坦克;1 - 敌方坦克;2 - 我方 // 子弹; 3 - 敌方子弹 Weapon* pNext; // 指向下一个节点的指针 }; 其中,iDir和iType用不同整数表示不同含义。如果在小程序中,我们可以在代码里直接调用这些整数,但是想象一下下面情况: 如果你连续写了三小时代码,你还能清晰记得1表示什么含义吗? 你时不时需要找到Weapon结构体定义查看这些数字的含义,然后再引用,出错的概率有多大? 如果你一不小心,在某处搞错了,比如要处理的是敌方坦克,你却引用2,需要多少时间才能把错误找出来? 因此,在做一个比较大的程序时,我们强烈建议用定义一个枚举类型,用我们熟悉的单词来表示这种数字的含义。 enum Direction{ UP = 0, // 上方 RIGHT = 1, // 右方 DOWN = 2, // 下方

坦克大战 实验报告

本科实验报告 课程名称: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) { }

{JZ}怎样用C语言编写游戏231

如何用语言编写游戏 网络游戏是常谈的话题,是交互式娱乐的主力军,是一种高层次的综合艺术,更是一个民族的文化,世界观的全新传播方式作为游戏玩家的我们,是不是想设计一个属于自己的游戏呢? 爱玩是人的天性,而语言是我们计算机专业都要学习的一门基础学科.一般来说,是比较枯燥的.那么,我们能不能通过编一些小 游戏来提高它的趣味性呢?这样学习程序设计,就不会是一件坚韧 ,枯燥的事,它变得象电脑游戏一样充满好奇,富有乐趣.这正是 我要写这文档追求. , 总是从开始 学习编程的第一个程序,一般就是打印一个亲切的词语——" !".让我们来看看这个最简单的程序: <> *把输入输出函数的头文件包含进来* () { (", !")*在屏幕上输出字符串"!"* *退出函数,并返回* } 下面我们发现几个值得改进的地方,程序的运行结果一闪而过 ,每执行这个程序一次都能看见上次运行留下的字符,我们 还希望屏幕输出一个笑脸来欢迎我们.(大家不要小看了这个笑脸

曾经有人发贴专门问呢)让我们来改进一下这个程序吧! ,在语句的前面加一句 ();,表示按任意键结 束,在语句前用函数清屏,要使用这个函数和 函数,需要在程序开头再包含头文件码也有 许多非常好玩的字符,比如码值为的就是一个笑脸,我们可 以用("", )来输出一个笑脸. 现在我们把程序改成一个更好看的了.下 面让我们开始做游戏吧! , 心动的开始,一个运动中的笑脸 大家小时侯喜欢看动画片吗?哈哈,我猜你们都喜欢吧!下面就让我们来做一个小动画吧.在屏幕上显示一个运动的小笑脸,而且当它到达屏幕的边缘时会自动弹回来. 先在程序定义一个在屏幕中运动的点的结构: { , *该点的位置,包括坐标和坐标* , *该点在轴轴的速度* }; 运动的原理是,先擦去物体先前的轨迹,让物体按其速度移动一段距离,再画出该物体.让我们看到以下代码: (, )*把光标移到指定的坐标* (" ")*输出一个空格,把先前的字符擦去*

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

《面向对象的编程技术》课程设计实验报告 系计算机科学与技术 班级计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 -

相关主题
文本预览
相关文档 最新文档