c语言程序设计_坦克大战(提高篇)(funcode环境)

c语言程序设计_坦克大战(提高篇)(funcode环境)
c语言程序设计_坦克大战(提高篇)(funcode环境)

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列,每格大小刚好放一块墙。

int 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函数中,当玩家坦克碰到的是子弹精灵(不可能是自己发射

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

html5课程论文-基于html5的贪吃蛇游戏

HTML5课程设计 题目:基于html5的贪吃蛇游戏 学院:__商学院___________专业:__ 信息管理与信息系统 姓名:韩斌 指导教师:田更 2015年6月10日

摘要 随着互联网技术的不断发展和计算机性能的不断提升,用户享受互联网的方式也开始不断的变化,越来越多的应用可以直接以浏览器打开的方式使用,数据则是存储在云端,更加的安全可靠,方便用户共享数据。在各种应用不断的趋于更加网络话的同时,一种新的技术标准也随之产生,那就是HTML5(HTML是一种标记语言也是一种标准,互联网开发居于此)。HTML5是近十年来Web(互联网)标准最巨大的飞跃,和以前的版本不同,HTML5并非仅仅用来表示Web内容,它的使命是将Web带入一个成熟的应用平台,在这个平台上,视频、音频、图象和动画,以及同电脑的交互都被标准化。也就是说HTML5是通过开放的技术和标准来实现一个无插件模式的富客户端,这个客户端可以在移动终端、PC(个人计算机)或者其他可以有网络的地方轻松的运行。所以此时研究HTML5,并且大胆的实践有着重要的意义。课题内容是使用HTML5技术基于Web的环境来制作一个网络版的“坦克大战”游戏应用,该游戏使用了HTML5中的Canvas(画布)、WebSocket(HTML5中最新使用的一种网络连接协议,用于实时通讯)、Audio(HTML5中控制声音的技术)等最新的技术。目前HTML5标准尚未成熟,很多地方仍在变动,API(应用程序接口)仍不是很稳定,所以还无法真正的完全商用或者全部普及开,但这并不会影响我们来研究它。服务器端采用的Nodejs(一种Javascript程序语言框架,可以在服务器端运行Javascript语言)这种新型的框架来开发,Nodejs使用Javascript语言来开发,使整个应用从客户端到服务器端编程都是使用Javascript,大大的

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

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

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

马士兵 Java视频教学顺序

第一部分:J2se学习视频内容包括: 尚学堂科技_马士兵_JA V A视频教程_JDK5.0_下载-安装-配置 尚学堂科技_马士兵_JA V A视频教程_J2SE_5.0_第01章_JA V A简介_源代码_及重要说明 尚学堂科技_马士兵_JA V A视频教程_J2SE_5.0_第02章_递归补充 尚学堂科技_马士兵_JA V A视频教程_J2SE_5.0_第02章_基础语法 尚学堂科技_马士兵_JA V A视频教程_J2SE_5.0_第03章_面向对象 尚学堂科技_马士兵_JA V A视频教程_J2SE_5.0_第04章_异常处理 尚学堂科技_马士兵_JA V A视频教程_J2SE_5.0_第05章_数组 尚学堂科技_马士兵_JA V A视频教程_J2SE_5.0_第06章_常用类 尚学堂科技_马士兵_JA V A视频教程_J2SE_5.0_第07章_容器 尚学堂科技_马士兵_JA V A视频教程_J2SE_5.0_第08章_IO 尚学堂科技_马士兵_JA V A视频教程_J2SE_5.0_第09章_线程 尚学堂科技_马士兵_JA V A视频教程_J2SE_5.0_第10章_网络 尚学堂科技_马士兵_JA V A视频教程_J2SE_5.0_第11章_GUI 尚学堂科技_马士兵_JA V A视频教程_J2SE_5.0_专题_日期处理 尚学堂科技_马士兵_JA V A视频教程_J2SE_专题_正则表达式 反射avi ◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆ 最好的Java只有尚学堂最好的Java只有尚学堂最好的Java只有尚学堂最好的Java只有尚学堂最好的Java只有尚学堂 ◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆ 第二部分:j2se练习项目视频内容包括:

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

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

XP母盘制作详细教程(完全版)

XP母盘制作详细教程(完全版) 现在XP系统已经成为很多网吧的选择,但一直没有网友提供完整的方案.春节放假期间做了几套系统,顺便把过程记录如下 希望能给那些想学习网吧系统的朋友一点帮助 安装Windows XP SP2上海政府版 一、分区: 为了维护方便,我的分区是这样做的C盘NTFS格式4G,操作系统;D盘NTFS格式25G 单机游戏,系统备分,QQ等,;E盘NTFS格式2.4G(下载盘),;其余给F盘,也是NTFS格式用于安装网络游戏。(80G硬盘) C D盘保护,E F盘不还原.我用的冰点还原 二、操作系统安装: 直接在CMOS中,设置为从光驱启动,然后先用Windows 98无忧启动光盘,用DM将四个分区划分出来。重新启动后,在将C盘格式化,并用PM8.01把分区格式转换为NTFS。所有操作完成后,直接放入Windows XP的安装光盘。 三、软件安装: 1、补丁安装: SP2补丁 三波补丁(冲击波、震荡波、阻击波) Flash8.0 IE补丁。 泡泡堂输入法解决补丁(说白了也就是将XP输入法指示放在系统托盘补丁)。 2、驱动安装: 主板驱动----显卡驱动----声卡驱动----网卡驱动----USB2.0----DX9.0C----硬盘IDE接口加速驱动。 3、杀毒软件的安装: 在驱动安装完成后,直接安装诺顿杀毒9.0企业版。安装完成后,配置网络,然后到网上升级最新的病毒库。注意:在杀毒软件没有安装之前,千万不要配置网络,更不要上网,其他

所需软件最好刻录成光盘,方便使用 4、软件和游戏的安装: 在安装常用软件的时候,如果能够放在其他分区的软件,尽量不要放在系统盘C分区中,我一般放在D盘。游戏安装的时候,请设置好自己的目录,并划分类别,从其他没有病毒的电脑上复制过来,尽量不用安装程序安装。 病毒安全:诺顿黄金中文9.0企业版 木马防治:木马杀客绿色版 输入法:删除没用的输入法、装智能abc v5.22、王码五笔。(调整输入法顺序) 聊天工具:QQ2006飘云版(QQ彩字,QQ表情,QQ字符画精灵,QQIP库-显示网吧名,Q代理公布器)、 游戏平台:联众安装包、QQGAME安装包、边烽安装包、中国游戏在线安装包、中国游戏互动中心、浩方对战平台 (CS反作弊器网易泡泡2004、UC安装包、ICQ汉化版大智慧、E话通MSN简体中文版、雅虎通)安装包放在服务器。 更新软件:迅闪4.5完美破解版。 优化软件:Windows优化大师v6.5 Build 5.124破解版 局域网同步软件:LanUpdater 。 游戏管理器:迅闪4.5完美破解版(很好用的一款网吧游戏、外挂、音乐等管理软件) 办公软件:OFFICE2000免安装版 (放在服务器上,顾客需要用LanUpdater同步) 图像处理软件:acdsee4.0绿色版 翻译软件:金山快译绿色版 解压工具:WINRAR3.51 媒体播放:暴风影音千千静听绿色版(同时把歌曲列表导入一份) Realplayer(安装完要更新)、Mediaplayer、Ffshow、Winamp、Divx 抓图工具:屏幕录象专家5.5绿色版 克窿备份:MAXDOS5.5(自带了GHOST8.2并支持网克HOHO~ 偶喜欢)

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

程序设计实训报告 坦克大战 专业班级:装控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 SE开发技术 C HAT项目:Chat项目通过完成一个模拟的在线聊天系统,主要锻炼大家对于TCP/IP、Socket 编程、C/S模式的编程、线程的运用等方面的能力。 坦克大战单机版/图片版/网络版:这三个项目通过大家喜闻乐见的小游戏的形式来锻炼大家对于Java SE综合运用的能力,并且能够初步运用面向对象的编程理念,锻炼初步的设计能力,并基本掌握多线程的编程。 第二阶段:java Web开发技术 BBS项目:BBS的两个项目完成了一个具备完善前台展现以及后台管理的论坛系统,论坛系统的业务逻辑大家比较熟悉,是用来进行JavaWeb开发的极好的入门系统。但是由于其业务逻辑太简单,尚学堂目前的课程体系中已经用搜索项目来替代它。 金尚在线商城项目:这个系统整合了商品展示、商品管理、商品类别管理、购物车、会员管理等功能,提供了简易的操作,丰富的功能和完善的权限管理,为用户提供了一个低成本、高效率的网上商城建设方案。这个项目在商品类别设计中采用了树状层次设计结构;在前台可以分类浏览所有商品详细信息,下订单购买商品,查看购物车状态以及购买用户的反馈信息;在系统后台可以管理会员、管理商品和商品类别,并使用上传组件上传商品图片,管理查看商品库存以及进货渠道,并使用报表组件将商品的销售情况做成图表,供商城管理者做市场分析。前台对数据的修改使用Ajax技术直接与后台交互,提高了用户体验。但是,由于这个项目业务逻辑比较简单,尚学堂目前的课程体系中已经使用DRP项目?云浣 刑娲 ? CMS项目:CMS是大型直播发布系统,需求调研、需求分析、系统设计、编码、单元测试、集成测试和子系统测试,本系统主要包括,播放工具管理、电视频道管理、比赛管理、时区管理、节目管理,是综合了Java Web、数据库、JDBC、设计模式、SOA、AJAX等技术的不可多得的大型系统。 这个项目所涉及的知识点包括JDBC、连接池、数据库、HTML、 CSS、JavaScript、AJAX、分页、树状结构的设计与展现、JSP、Servlet、Session等. 这个项目所涉及的知识点包括JDBC、数据库、HTML、CSS、JavaScript、AJAX、分页、树状结构的设计与展现、JSP、Servlet、Session、JFreechart图表组件、上传组件等,并且已经开始教授软件工程、SCM等方面的项目管理知识,是商城项目的替代者,除了在技术上更加复杂和细腻之外,在业务领域也有自己的独到之处,学习本项目不但可以得到技术上的锻炼,也可以了解复杂的业务逻辑,达到一个较高级程序员的水平。 E-learning项目:直播、点播、课件制作、课程发布四大子系统,Java C++多语言开发,系统分析与设计课程不可多得的项目。 第三阶段:主流框架技术及项目实战 OA项目:国家金审项目OA系统,综合运用了Hibernate、Struts、Spring、XDoclet、Ant、JUnit、DOM4J、JAXP、Log4J、DWR、Workflow、Freemarker等技术的大型OA项目,是尚学堂老师呕心沥血之作,并且经过多次打磨成型,相比较新成立公司的项目而言,具有更先进、更细致、更能帮助同学建立大型项目经验的特点,这是不可多得的项目,是尚学堂的

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

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

实习成果

毕业实习是学生学完教学计划规定的全部课程后,在进行毕业论文之前的一个重要的教学环节,是一个理论联系实际,锻炼和提高学生组织管理能力,培养分析、解决实际问题能力的教学过程。通过实习使我加深对所学专业课程的理解,增强综合运用专业知识的能力。熟悉专业工作的内容,提高运用理论知识解决实际问题的能力。根据所学课程的理论知识,结合企业的运营实际,同时提高观察问题、分析问题、解决问题的能力。 我实习的时间为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环境上开发应用系统.

相关文档
最新文档