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

  • 格式:doc
  • 大小:424.50 KB
  • 文档页数:12

下载文档原格式

  / 12
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

程序设计实训报告

坦克大战

专业班级:装控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秒。

三、功能实现

3.1 数据结构

struct Weapon

{

char szName[128]; // 精灵名称float fPosX, fPosY; // 精灵坐标

float fSpeedX, fSpeedY; // X和Y方向上速度

float fFireTime; // 敌方坦克距下一次开炮的剩余时间

float fRotateTime;

int iHp; // 生命值

int iDir; // 朝向:0 - 上方;1 - 右方;2 - 下方;3 - 左方

int iType; // 类型:0 - 我方坦克;1 - 敌方坦克;2 - 我方

// 子弹;3 - 敌方子弹

Weapon* pNext; // 指向下一个节点的指针

};

enum Direction{

UP = 0, // 上方

RIGHT = 1, // 右方

DOWN = 2, // 下方

LEFT = 3 // 左方

};

enum Role

{

MYTANK = 0, // 我方坦克

ENEMYTANK = 1, // 敌方坦克

MYBULLET = 2, // 我方子弹

ENEMYBULLET = 3 // 敌方子弹

};

const float G AME_TIME = 100.f; // 一局游戏时间

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

const float T ANK_SPEED = 20.f; // 坦克速度

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

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

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

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

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

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

int g_iMap[11][13]; // 二维数组定义游戏地图

int g_iWallCount = 0; // 游戏中墙的数量

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

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

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

bool g_bStart; // 定义游戏开始与否

int g_iScore; // 游戏中的分数

float g_fGameTime=30.f; // 定义游戏时间

int maxscore=0; // 定义初始最高分

3.2 算法描述

3.2.1 游戏开始和结束

1、游戏状态g_bstart分为两种状态0,1 ,其中0表示游戏结束状态,1表示游戏开始;当游戏未开始时即g_start状态为0,按下空格键,游戏g_bstart状态变为1,游戏开始,将“空格开始”与“splash”设置为不可见,游戏开始计时为100秒,显示最高分数,将本局游戏分数初始化为0,初始化地图中墙,goal,玩家坦克的位置。一局游戏进行中,每循环一次,g_fGameTime减去一次刷屏的时间。当g_fGameTime≤0,说明一局游戏时间已完,游戏停止,重新显示“空格开始“字样。

2、按W、S、A、D键,控制坦克上下左右运动。定义MoveMyTank函数,按下W键,设置玩家坦克向上的速度;按下A键,设置向左速度;按下S键,设置向下的速度,按下D键,设置向右速度。松开键盘,坦克速度为0。同时设置玩家坦克朝向iDir。

3、游戏开始后,右上角实时显示剩余时间。一局游戏开始后,在WinMain函数中