当前位置:文档之家› 10 C语言课程设计_坦克大战(提高篇)

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

10 C语言课程设计_坦克大战(提高篇)
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, // 下方

LEFT = 3 // 左方

};

enum Role

{

MYTANK = 0, // 我方坦克

ENEMYTANK = 1, // 敌方坦克

MYBULLET = 2, // 我方子弹

ENEMYBULLET = 3 // 敌方子弹

};

除此之外,我们还需要定义一些全局变量来控制程序,根据程序需求,我们目前能考虑到表示游戏状态的变量、表示游戏得分的变量、游戏剩余时间变量以及距离下一辆坦克产生的时间等变量;

// 游戏地图,0表示此处为空,1表示此处有墙。根据游戏空间大小、墙以及坦克大小,// 我们把地图分成11行,13列,每格大小刚好放一块墙。

i nt iMap[11][13];

正如前面所示,我们用枚举类型来表示一些数字的含义。出于同样的原因,我们也定义一些全局常量来存储某些数值。

const float GAME_TIME = 30.f; // 一局游戏时间

const float CREATE_TANK_TIME = 5.f; // 每批次生成坦克的时间间隔const float TANK_SPEED = 5.f; // 坦克速度

const float BULLET_SPEED = 8.f; // 子弹速度

const float FIRE_TIME = 2.f; // 坦克开炮时间间隔

const float WORLD_LEFT = -26.f; // 游戏场景边界左值

const float WORLD_TOP = -22.f; // 游戏场景边界左值

const float WORLD_RIGHT = 26.f; // 游戏场景边界左值

const float WORLD_BOTTOM = 22.f; // 游戏场景边界左值

好处有两点:第一、跟枚举类型一样,用有具体含义的单词,在具体调用时容易记住,不会搞错;第二、如果我们需要调整这些数值,只需在全局常量初始化这里调整就可以了。比如我们要调整坦克速度,没有定义全局常量的话,我们就要找到各处代码用到坦克速度赋值的地方修改。这样,既麻烦又容易出错。

程序本身由一个main.cpp文件组成,包含7个函数,一个主函数WinMain和6个事件函数(键盘按下、键盘弹起、鼠标移动、鼠标点击、精灵与精灵的碰撞、精灵与世界边界的碰撞)。

我们增加两个文件,List.h和List.cpp,主要用来声明和定义结构体以及链表操作的函数。链表操作至少包括下面四个操作:

AddToList // 往链表里添加一个节点;

DeleteNode // 从链表里删除一个节点;

FindeNode // 从链表里查找一个节点;

DeleteList // 删除整个链表。

一局游戏结束,我们需要把本局游戏中还没删除的精灵全部删除,从而保持下一局游戏

的“干净”,所以往往需要删除整个链表。

载入地图、玩家坦克运动、敌方坦克的生成、坦克发射子弹,我们也可以考虑定义单独的函数来完成:

LoadMap // 载入地图

MoveMyTank // 玩家坦克运动

CreateEnemyTanks // 敌方坦克生成

OnFire // 坦克发射炮弹

本游戏,大部分功能都是通过碰撞来实现的,比如玩家坦克子弹击中敌方坦克,就是玩家子弹与敌方坦克的碰撞。子弹到了游戏界面外,就是子弹与世界边界的碰撞。我们通过下面表格,把整个游戏中各种碰撞整理出来,表格中的响应是反应方的响应。“无”表示不可能发生碰撞。我们知道,要发生碰撞,碰在一起的两个精灵,必须一方具有“发送碰撞”的属性,另外一方具有“接受碰撞”的属性。由于敌方坦克与敌方坦克、敌方子弹与敌方子弹也可能发生碰撞,所以需要同时设置“发送碰撞”和“接受碰撞”的属性

根据上面表格,我们可以定义5个碰撞函数

OnMyTankColOther // 玩家坦克与其他精灵碰撞

OnEnemyTankColOther // 敌方坦克与其他精灵碰撞

OnBulletColOther // 子弹与其他精灵碰撞。子弹碰上其他精灵,本身都是被

// 删除,比较简单,因此两种子弹合并起来OnWallColOther // 墙与其他精灵碰撞

OnGoalColOther // 玩家指挥部与其他精灵碰撞

其中,col是collision(碰撞)的缩写。

精灵与世界边界的碰撞,比较简单,我们直接在dOnSpriteColWorldLimit函数中完成。

我们现在对整个程序架构有了一定了解。现在可以开始编程了,在编程的过程,我们还会根据细节进一步完善。

六、实验指南

实验一游戏开始和结束

【实验内容】

步骤一、按空格键,游戏开始,“空格开始”字样消失,设置初始时间为30。

步骤二、按WASD键,控制坦克上下左右运动。

步骤三、游戏开始后,右上角实时显示剩余时间。

步骤四、当超过30秒,游戏结束,重新显示“空格开始“字样,游戏时间设为0,坦克回到初始位置。

【实验思路】

在List.h中定义Weapon结构体和两个枚举类型。

定义全局变量和全局常量。

定义MoveMyTank函数,控制玩家坦克上下左右移动。

【实验指导】

1、创建“TankWar”工程,并且添加List.h文件,并在List.h中定义Weapon结构体

和Role、Direction两个枚举类型。参考“程序初步设计”;

2、接着我们要定义一个游戏状态的变量,依次变量来判断游戏是否开始,并且还要定

义我们控制的坦克精灵的对象指针;

3、dOnKeyDown函数是处理键盘按下事件的。一局游戏还未开始,按下的空格键,游

戏开始。此时应该“空格开始”消失,显示本局的游戏时间以及得分等信息,

4、运行程序,按下空格键,看看游戏是否按要求运行。

5、游戏开始后,开始计时。游戏时间到,一局游戏结束,游戏恢复到初始界面。要判

断游戏时间,我们需要在WinMain的主循环中进行处理。

// 游戏主循环

while( dEngineMainLoop() ) {

// 获取游戏屏幕刷新一次的时间间距

float fTimeDelta = dGetTimeDelta();

if(g_bStart)

{

g_fGameTime -= fTimeDelta;

if(g_fGameTime > 0.f) // 一局游戏进行中

{

}

else // 一局游戏结束

{

g_bStart = false;

}

}

else // 游戏结束后处理

{

}

}

6、一局游戏开始后,在WinMain函数中的主循环里,通过dSetTextValue把

(int)g_fGameTime的数值显示在名为“time”的文字精灵里,从而实时显示剩余时间(显示整秒的时间)。

7、一局游戏进行中,每循环一次,g_fGameTime减去一次刷屏的时间。当g_fGameTime

≤0,说明一局游戏时间已完,游戏停止,重新显示“空格开始“字样。注意:g_iStart 要改为0,否则下一局就不能正确判断游戏开始或结束。

8、我们定义一个MoveMyTank函数来处理玩家坦克的运动。因为玩家坦克是用键盘控

制的,所以需要传递两个参数,一个用来表示按下或松开了哪个键盘,一个用来表示是按下还是松开。按下W键,设置玩家坦克向上的速度;按下A键,设置向左速度;按下S键,设置向下的速度,按下D键,设置向右速度。松开键盘,坦克速度为0。此外,按下键盘时,还需要相应设置坦克朝向iDir。注意:如果函数定义写在函数调用之后,需要在函数调用前面进行声明。

void MoveMyTank(int iKey, int iPress)

{

}

9、完成函数,我们在dOnKeyDown和dOnKeyUp函数中进行调用。

// 按下键盘

if(g_bStart) // 一局游戏进行中

{

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

{

MoveMyTank(iKey, 1);

}

}

// 松开键盘

if(g_bStart)

{

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

MoveMyTank(iKey, 0);

}

}

10、玩家坦克开到边界时,让它停止运动。我们在dOnSpriteColWorldLimit函数中,

设设置玩家坦克速度为0。

if(strcmp(szName, g_pMyTank->szName)==0) // 玩家坦克

{

dSetSpriteLinearVelocity(g_pMyTank->szName, 0.f, 0.f);

}

11、因为增加了新功能,我们在一局游戏结束时,就必须考虑到新情况:游戏结束时,

坦克已经不在原来位置了;坦克朝向发生变化;游戏结束的时候,玩家正好按下某

个控制键,给坦克设置了速度。我们该如何处理这三种情况?

实验二玩家坦克在街道中运行

【实验内容】

步骤一、一局游戏开始时载入地图。

步骤二、一局游戏结束后删除地图。

步骤三、玩家坦克碰到墙的话,不能继续前行。

【实验思路】

利用数组的值来载入地图,值为0,说明此处为空;值为1,说明此处有墙。

游戏开始后载入地图,但只能载入一次。如果不停载入,会占有大量资源。

游戏结束时,需要把地图中墙都删除。

创建一个新的精灵,首先需要给它命名。有规则地给精灵命名,有利于我们对精灵进行处理。我们按照墙生成的先后顺序,分别给精灵命名为:wall0,wall1,wall2…

设置玩家坦克的碰撞属性,并专门定义一个函数处理玩家坦克发生碰撞后,玩家坦克的响应。

【实验指导】

1、增加新的全局变量定义

int g_iWallCount = 0; // 记录墙的数量

int g_iMap[11][13]; // 地图数组

一局游戏结束后,我们需要卸载地图,也就是把墙都删除了。因此,我们需要知道

墙的数量。

2、定义LoadMap函数,用来载入地图。定义一个局部数组并初始化,然后依次赋值给

全局数组。局部数组初始化如下:

int iMap[11][13]=

{

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

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

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

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

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

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

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

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

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

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

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

};

3、给墙命名,计算墙的数量,并设置墙为“接受碰撞”属性。并将指挥部设置在第

11行第7列。

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

{

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

{

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

{

sprintf(szName, "wall%d", g_iWallCount++);

dCloneSprite("wall",szName);

// 将wall设为接受碰撞

dSetSpriteCollisionReceive(szName, true);

x = -24+4*j;

y = -20+4*i;

dSetSpritePosition(szName,x,y);

}

}

}

// 指挥部设置在第11行第7列

dSetSpritePosition("goal", 0.f, 20);

dSetSpriteVisible("goal", true);

4、完成函数后,我们需要调用该函数载入地图。因为要在游戏开始后载入,为了避免

每次循环都载入一次地图,我们设置一个静态布尔变量来控制。

int iLoad = 1 // 是否载入地图

while( dEngineMainLoop() )

{

if(g_iStart)

{

if(iLoad) // 一局游戏只需要载入一次地图即可

{

// 载入地图

LoadMap();

iLoad = 0;

}

}

}

5、游戏结束时,需要删除地图,把屏幕中的墙精灵都删除,考虑下面一段代码应该写

在哪里。

char szName[128];

for(int i=0; i

{

sprintf(szName, "wall%d", i);

dDeleteSprite(szName);

}

g_iWallCount = 0;

iLoad = t1;

// 设置指挥所不可见

dSetSpriteVisible("goal", 0);

6、按下空格键,游戏开始,玩家坦克被设置在指挥部左侧。从数组iMap中我们看出,

这个位置在第11行第5列,在dOnKeyDown函数中设置玩家坦克位置。

7、玩家坦克与墙碰撞时,玩家坦克停止运动。我们定义一个函数专门处理玩家坦克与

其他精灵碰撞。在本实验中,只需处理与墙碰撞。

void OnMyTankColOther(const char* szMyTankName, const char*

szOtherName)

{

// 如果碰到墙上

if(strstr(szOtherName, "wall") != NULL)

dSetSpriteLinearVelocity(szMyTankName, 0.f, 0.f);

}

因为玩家坦克装上墙,墙没有任何反应,所以本实验,我们暂时不定义墙与其他精

灵碰撞的函数。

8、我们在dOnSpriteColSprite函数中调用OnMyTankColOther函数。因为,玩家坦克

只具备“发送碰撞”属性,因此它的名称只能传递给szSrcName参数。

实验三玩家坦克射击

【实验内容】

步骤一、玩家按下j键,坦克发送炮弹;

步骤二、创建链表,用链表管理炮弹;

步骤三、子弹击中墙,将墙摧毁;子弹击中目标,游戏结束。

【实验思路】

完成坦克发送炮弹的功能:根据发送子弹的坦克的朝向设置子弹的朝向,设置子弹的速度,并将子弹设置在坦克前面一些。

子弹碰到墙的时候,删除子弹和墙。

子弹击中目标,删除子弹和目标,游戏结束。

用链表管理子弹,每发射一颗子弹,就添加到链表里。每删除一颗子弹,就从链表里相应删除节点。

游戏结束时,删除所有剩余的子弹。

【实验指导】

1、增加几个全局变量和全局常量的定义。

int g_iNum = 0; // 记录全部精灵的数目,用来给精灵命名

const float BULLET_SPEED = 8.f; // 子弹速度

2、自定义一个函数,OnFire用于完成坦克发射子弹功能。玩家坦克发射子弹,和敌

方坦克发射子弹功能基本一样,我们可以写在一个函数里。首先,需要把发射子弹

的坦克名称传进来,这样,我们才能获取坦克的朝向和位置;其次,需要区别是我方坦克发射的子弹,还是敌方坦克发射的子弹。定义如下:

void OnFire(char* szName, int iType)

{

}

3、在dOnKeyDown中增加对OnFire函数的调用。条件需要满足:游戏开始后,且玩家

按J键。

4、运行程序,按J键,看是否能发射子弹。

5、碰撞事件中,我们经常会将碰撞的一方或两方删除。但是,如果我们直接删除某个

精灵,而后面的精灵还需要获得它的信息时,就没法获得了。因此,我们定义一个ISDead函数,当该指针存在且iHp为0时,说明该精灵已死。碰撞函数中,先将需要删除的精灵的iHp设置为0,最后再统一将需要删除的精灵删除。

6、子弹与墙碰撞时,删除子弹和墙。因此,我们需要定义两个函数,一个用于处理子

弹碰到其他精灵,一个用于处理墙碰到其他精灵。定义如下:

// 子弹与其他精灵碰撞

void OnBulletColOther(const char* szBulletName, const char* szOtherName)

{

}

判断是否与墙碰撞,是的话,将子弹iHp设为0。所有的墙的名称中都包含wall,通过判断szOherName中是否包含该字符串判断是否是墙。

// 墙与其他精灵碰撞

void OnWallColOther(const char* szWallName, const char* szOtherName) {

}

判断是否与子弹碰撞,是的话,删除墙。所有的子弹的名称中都包含bullet,通过判断szOherName中是否包含该字符串判断是否是子弹。

7、在dOnSpriteColSprite函数中调用上面两个碰撞函数。其中,墙只具有“接受碰

撞”属性,因此只需要判断szTarName是否包含wall字符串。子弹具有“发射碰撞”和“接受碰撞”两种属性,因此需要分别判断szSrcName和szTarName是否包含bullet字符串。

8、运行程序,按J键发射子弹。朝墙设计,看是否摧毁墙。

9、在后面的开发中,我们还需要增加敌方坦克,敌方坦克还会发射子弹,6种精灵会

相互碰撞,产生不同反应,如果没有良好的数据结构进行管理的话,整个程序很可能存在大量bug。

10、我们在List.cpp中实现链表操作函数的定义。把链表操作函数和游戏逻辑函数分

开,可以让程序结构更清晰。

11、定义一个链表头结点:

Weapon *g_pHead = NULL;

12、根据精灵名称,往链表末尾添加新结点,参考代码如下:

void AddToList(Weapon *pSprite)

{

Weapon* pTemp = (Weapon*)malloc(sizeof(Weapon)) ;

strcpy(pTemp->szName, pSprite->szName);

pTemp->fPosX = pSprite->fPosX;

pTemp->fPosY = pSprite->fPosY;

pTemp->fSpeedX = pSprite->fSpeedX;

pTemp->fSpeedY = pSprite->fSpeedY;

pTemp->iDir = pSprite->iDir;

pTemp->iType = pSprite->iType;

pTemp->pNext = NULL;

Weapon* pNode = g_pHead;

if(g_pHead == NULL) // 表头为空,说明加入的是第一个节点

{

g_pHead = pTemp;

}

else{

// 循环读到链表的最后一个节点

while(pNode->pNext != NULL)

{

pNode = pNode->pNext;

}

pNode->pNext = pTemp;

}

}

13、参考AddToList函数,完成查找结点、删除结点以及删除整个链表的操作。

// 根据名字获取精灵节点

Weapon* FindNode( const char *szName )

{

}

// 根据名字删除精灵节点

void DeleteNode( const char *szName)

{

}

// 删除整个链表

void DeleteList( )

{

}

删除链表时,一般也需要删除界面上相应的精灵,我们在DeleteList函数中完成此功能相应比较容易。

14、完成链表操作函数后,我们需要在几个地方进行完善。子弹是通过OnFire发射出

来,因此,我们需要在该函数中把子弹节点加入到链表中。

子弹与其他精灵碰撞时,会被删除。我们在OnBulletColOther函数中删除该子弹精灵对应链表中的节点。

子弹与世界边界碰撞时,也会被删除。我们在dOnSpriteColSprite函数中删除该

子弹精灵对应链表中的节点。

游戏结束后,我们需要把界面上剩余的子弹都删除。剩余的子弹肯定在链表中,因

此通过删除链表就可以了。

15、要完成子弹与玩家指挥部的碰撞,首先在LoadMap函数中将指挥部精灵设为“接受

碰撞”属性。然后增加一个OnGoalColOther函数,由于精灵碰上玩家指挥部,游

戏都结束。所以,无需做任何判断,只要把g_bStart改为false。

16、运行游戏,用玩家坦克轰击指挥部,游戏是否结束?此外,我们发现,游戏结束后,

游戏时间并没有变为0。这是因为一局游戏时间并没有正常结束。所以我们需要在

游戏结束时,把时间精灵设为0。

实验四敌方坦克产生与运动

【实验内容】

步骤一、每隔一段时间,生成一辆敌方坦克,向下运动;坦克生成的初始位置前方不能有墙。

步骤二、敌方坦克遇到墙时停下来。

步骤三、敌方坦克遇到边界调头往回走。

步骤四、敌方坦克碰到运动中的敌方坦克(这种情况只能是迎头碰上),两辆敌方坦克均调头。敌方坦克碰上停止的敌方坦克(这种情况是前面一辆被障碍物阻挡,后面一辆跟上去),运动的敌方坦克调头。

步骤五、敌方坦克碰上我方坦克都被摧毁,游戏结束。

步骤六、敌方坦克每隔一段时间,就顺时针变化一个方向,继续前进。

【实验思路】

定义一个函数专门处理坦克的生成,包括朝向、速度和位置的设置。在主函数中,根据敌方坦克生成时间,调用该函数。

完善敌方坦克、墙与、我方坦克其他精灵碰撞的函数。

增加敌方坦克与世界边界碰撞的处理。

定义一个函数专门处理敌方坦克的运动,在主函数中调用。

【实验指导】

1、新增几个全局变量和全局常量的定义:

float g_fCreateTime = 0.f; // 每批次生成坦克的剩余时间

const float CREATE_TANK_TIME = 3.f; // 每批次生成坦克的时间间隔

const float ROTATE_TIME = 2.f; // 敌方坦克调转方向的时间

2、在结构体中增加一个元素:

float fFireTime; // 敌方坦克的开火时间

相应修改AddToList函数。

3、自定义一个函数,用于生成敌方坦克。每次生成一辆敌方坦克,总是放在第一排,

列数随机,但其前方不能有墙。方向朝向,设置“发送碰撞”和“接受碰撞”属性,

设置世界边界。创建一个Weapon指针节点,将精灵名称、朝向、坦克调转方向时

间保存起来,并将节点添加到链表中。

void CreateEnemyTanks()

{

}

4、在WinMain函数的主循环中,判断游戏开始后,根据g_fCreateTime,判断敌方坦

克创建时间是否到了。如果到了,就调用CreateEnemyTanks函数。

5、在OnTankColOther函数中,完成如下操作:

当敌方坦克撞上墙时,敌方坦克要停止。

如果敌方坦克碰上的也是敌方坦克,根据其中一方szTankName坦克当前速度,如

果某个方向上速度不为0,则在该方向上调头运动。

如果敌方坦克碰上的是我方坦克,游戏结束。

6、在OnMyTankColOther函数中,当玩家坦克碰到敌方坦克,游戏结束。

7、自定义一个MoveEnemyTank函数,用来处理敌方坦克的运动。函数根据敌方坦克名

称,获取敌方坦克当前朝向和速度,然后将该坦克顺时针旋转90度,并修改相应

速度。

// szName –敌方坦克名称

void MoveEnemyTank(const char* szName)

{

}

8、在WinMain函数中,一局游戏运行时,遍历链表,找出敌方坦克节点,判断是否已

经到调换方向时间。如果时间到,调用MoveEnemyTank函数。

9、如果我们用如下方式遍历链表,考虑会存在什么问题?

pNode = g_pHead;

while(pNode->pNext != NULL)

{

pNode = pNode->pNext;

}

因为游戏会不断生成新的精灵,比如新的坦克,尤其是下个实验中的子弹,链表会

不停的增长,这种写法会导致程序效率低下。我们在List.cpp中增加一个全局变

量:

int g_listSize = 0;

用来表示当前链表节点数量。每添加一个节点时,g_listSize++;每减少一个节点

时,g_listSize--。删除整个链表时,g_listSize = 0。

利用g_listSize和for循环,我们读取当前链表中的节点进行操作。

实验五坦克对战

【实验目的】

步骤一、玩家坦克子弹击中敌方坦克,敌方坦克被摧毁,玩家加一分。

步骤二、每隔一段时间,敌方坦克就发射一发子弹;

步骤三、敌方子弹击中玩家坦克,游戏结束。

步骤四、敌方子弹击中墙,墙被摧毁。

步骤五、敌方子弹或敌方坦克碰到玩家指挥部,游戏结束。

【实验思路】

按实验指导完成。

【实验指导】

1、在OnTankColOther函数中,对玩家子弹碰到敌方坦克,敌方坦克iHp设为0,并

且g_iScore加1。

2、按下空格键时,分数需要变为0。一局游戏结束时,需要显示上一局玩家得分。

3、增加一个一个全局常量的定义:

const float FIRE_TIME = 2.f; // 敌方坦克发射炮弹的时间间隔

4、创建坦克时,需要给坦克的fFireTime赋值为FIRE_TIME。

5、在WinMain的主循环中,遍历链表,找到敌方坦克节点。如果坦克发射炮弹时间到,

调用OnFire函数。

6、在OnMyTankColOther函数中,当玩家坦克碰到的是子弹精灵(不可能是自己发射

的子弹,因为子弹速度比坦克快),游戏结束。

坦克大战 实验报告

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

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