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

上传人:第*** 文档编号:34008558 上传时间:2018-02-19 格式:DOC 页数:12 大小:424.50KB
返回 下载 相关 举报
程序设计实训坦克大战实验报告_第1页
第1页 / 共12页
程序设计实训坦克大战实验报告_第2页
第2页 / 共12页
程序设计实训坦克大战实验报告_第3页
第3页 / 共12页
程序设计实训坦克大战实验报告_第4页
第4页 / 共12页
程序设计实训坦克大战实验报告_第5页
第5页 / 共12页
点击查看更多>>
资源描述

《程序设计实训坦克大战实验报告》由会员分享,可在线阅读,更多相关《程序设计实训坦克大战实验报告(12页珍藏版)》请在金锄头文库上搜索。

1、 程序设计实训报告坦克大战专业班级: 装控 1401 实习时间:2015 年 7 月 10 日至 7 月 14 日 实习地点: 微 401 成 员 1: 赵振华 成 员 2: 许晨欢 成 员 3: 蒋绪涛 个人分考勤(10%)文档(30%)创意及实现(30%)视频(30%)总成绩(100%) 成员 1 成员 2 成员 31一、作品概述1.1 创新点:1、自定义并命名树林和钢板精灵,设置树林属性为不接受碰撞可以自由穿梭,钢板为接受任何碰撞但不做任何处理(即子弹和坦克均不能摧毁钢板)。2、添加坦克发炮、击中目标和坦克移动的特殊声效。12 概述:这款游戏是我们 QWER 小组以经典 90 版坦克大战

2、为背景制作的坦克大战的改编款,玩家通过控制坦克摧毁敌方坦克来保卫主基地不被摧毁。当敌我双方坦克相碰或己方基地被子弹摧毁时游戏结束(敌我双方子弹均可摧毁基地) ,每隔 3 秒钟出现一辆敌方坦克,游戏最大时长为 100 秒。此款游戏与经典 90 版坦克大战较为相似,操作简单,能唤起我们对童年的回忆。二、功能设计玩家坦克与敌方坦克在街道中进行巷战,玩家坦克被击中或与敌方坦克相撞、玩家指挥部被击中或游戏时间到,一局游戏结束。按下空格键后游戏开始, “空格开始” 消失,载入地图, 100 秒倒计时开始,并把玩家坦克设置在指挥部左侧。游戏时间到,玩家坦克被敌方坦克摧毁,与敌方坦克相撞,或者玩家指挥部被摧毁

3、,一局游戏结束,游戏回到初始界面,并显示上一局的分数。玩家用 W、A 、S、D 键控制坦克上、下、左、右运行,按 J 键开炮。坦克行进过程中有特殊声效,坦克发射或击中目标都有相应的声效。玩家坦克碰到墙和钢板就停下来,需要调转方向才能继续前进。玩家坦克开炮,一炮就能摧毁一块墙或者一辆敌方坦克,但不能摧毁钢板,玩家可穿梭于树林中。玩家每摧毁一辆敌方坦克,加 1 分。玩家指挥部被坦克或者炮弹(不管玩家还是敌方)碰上,都会被摧毁。每隔 3 秒钟,就会产生一辆敌方坦克。敌方坦克每隔一段时间,就自动开炮。敌方坦克遇到墙就会停下来。停下来的坦克,前方的墙如果被摧毁了,又能继续前进。2每隔几秒钟,敌方坦克就会

4、顺时针变换一个方向前进。每局最大时长为 100 秒。三、功能实现3.1 数据结构struct Weaponchar szName128; / 精灵名称3float 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 - 敌方

5、子弹Weapon* pNext; / 指向下一个节点的指针;enum DirectionUP = 0, / 上方RIGHT = 1, / 右方DOWN = 2, / 下方LEFT = 3 / 左方;enum RoleMYTANK = 0, / 我方坦克ENEMYTANK = 1, / 敌方坦克MYBULLET = 2, / 我方子弹ENEMYBULLET = 3 / 敌方子弹;const floatGAME_TIME = 100.f; / 一局游戏时间const float CREATE_TANK_TIME = 2.f; / 每批次生成坦克的时间间隔const floatTANK_SPEED

6、= 20.f; / 坦克速度4const float BULLET_SPEED = 30.f; / 子弹速度const floatFIRE_TIME = 2.f; / 坦克开炮时间间隔const floatWORLD_LEFT = -26.f; / 游戏场景边界左值const floatWORLD_TOP = -22.f; / 游戏场景边界左值const floatWORLD_RIGHT = 26.f; / 游戏场景边界左值const floatWORLD_BOTTOM = 22.f; / 游戏场景边界左值int g_iMap1113; / 二维数组定义游戏地图int g_iWallCount

7、 = 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,

8、1 ,其中 0 表示游戏结束状态,1 表示游戏开始; 当游戏未开始时即 g_start 状态为 0,按下空格键,游戏 g_bstart 状态变为 1,游戏开始,将“空格开始”与“splash”设置为不可见,游戏开始计时为 100 秒,显示最高分数,将本局游戏分数初始化为 0,初始化地图中墙,goal,玩家坦克的位置。一局游戏进行中,每循环一次,g_fGameTime 减去一次刷屏的时间。当g_fGameTime0,说明一局游戏时间已完,游戏停止,重新显示“ 空格开始“字样。2、按 W、S、A、D 键,控制坦克上下左右运动。定义 MoveMyTank 函数,按下W 键,设置玩家坦克向上的速度;按

9、下 A 键,设置向左速度;按下 S 键,设置向下的5速度,按下 D 键,设置向右速度。松开键盘,坦克速度为 0。同时设置玩家坦克朝向iDir。3、游戏开始后,右上角实时显示剩余时间。一局游戏开始后,在 WinMain 函数中的主循环里,通过 dSetTextValue 把(int)g_fGameTime 的数值显示在名为“time”的文字精灵里,从而实时显示剩余时间(显示整秒的时间) 。4、当超过 100 秒,游戏结束,重新显示“空格开始”字样,游戏时间设为 0,坦克回到初始位置。一局游戏进行中,每循环一次,g_fGameTime 减去一次刷屏的时间。当 g_fGameTime0,说明一局游戏

10、时间已完,游戏停止,重新显示“空格开始”字样。同时,g_batart 状态要改为 0,否则下一局就不能正确判断游戏开始或结束。3.2.2 玩家坦克在街道中运行1、一局游戏开始时载入地图。利用数组的值来载入地图,值为 0,说明此处为空;值为 1,说明此处有墙。游戏开始后载入地图,但只能载入一次。如果不停载入,会占有大量资源。创建一个新的精灵,首先需要给它命名。有规则地给精灵命名,有利于我们对精灵进行处理。我们按照墙生成的先后顺序,分别给精灵命名为:wall0,wall1,wall2. 按树林生成的顺序,分别给精灵命名为:shu,shu1,shu2 ,钢板分别命名为 aa1,aa2。2、一局游戏结

11、束后删除地图。3、玩家坦克碰到墙的话,不能继续前行。设置玩家坦克的碰撞属性,并专门定义一个函数处理玩家坦克发生碰撞后,玩家坦克的响应。3.2.3 玩家坦克射击1、玩家按下 j 键,坦克发送炮弹;自定义一个函数, OnFire 用于完成坦克发射子弹功能。玩家坦克发射子弹,和敌方坦克发射子弹功能基本一样,我们可以写在一个函数里。首先,需要把发射子弹的坦克名称传进来,这样,我们才能获取坦克的朝向和位置;其次,需要区别是我方坦克发射的子弹,还是敌方坦克发射的子弹。在dOnKeyDown 中增加对 OnFire 函数的调用。条件需要满足:游戏开始后,且玩家按 J键。2、创建链表,用链表管理炮弹;用链表管

12、理子弹,每发射一颗子弹,就添加到链表里。每删除一颗子弹,就从链表里相应删除节点。游戏结束时,删除所有剩余的子6弹。3、子弹击中墙,将墙摧毁;子弹击中目标,游戏结束。碰撞事件中,我们经常会将碰撞的一方或两方删除。但是,如果我们直接删除某个精灵,而后面的精灵还需要获得它的信息时,就没法获得了。因此,我们定义一个 ISDead 函数,当该指针存在且iHp 为 0 时,说明该精灵已死。碰撞函数中,先将需要删除的精灵的 iHp 设置为 0,最后再统一将需要删除的精灵删除。4、在 dOnSpriteColSprite 函数中调用上面两个碰撞函数。其中,墙只具有“接受碰撞”属性,因此只需要判断 szTarN

13、ame 是否包含 wall 字符串。子弹具有“发射碰撞”和“接受碰撞”两种属性,因此需要分别判断 szSrcName 和 szTarName 是否包含 bullet字符串。3.2.4 敌方坦克产生与运动1、每隔一段时间,生成一辆敌方坦克,向下运动;坦克生成的初始位置前方不能有墙。自定义一个函数,用于生成敌方坦克。每次生成一辆敌方坦克,总是放在第一排,列数随机,但其前方不能有墙。方向朝向,设置“发送碰撞”和“接受碰撞”属性,设置世界边界。创建一个 Weapon 指针节点,将精灵名称、朝向、坦克调转方向时间保存起来,并将节点添加到链表中。2、敌方坦克每隔一段时间,就顺时针变化一个方向,继续前进。自

14、定义一个MoveEnemyTank 函数,用来处理敌方坦克的运动。函数根据敌方坦克名称,获取敌方坦克当前朝向和速度,然后将该坦克顺时针旋转 90 度,并修改相应速度。在 WinMain函数中,一局游戏运行时,遍历链表,找出敌方坦克节点,判断是否已经到调换方向时间。如果时间到,调用 MoveEnemyTank 函数。3.2.5 坦克对战1、玩家坦克子弹击中敌方坦克,敌方坦克被摧毁,玩家加一分。在OnTankColOther 函数中,对玩家子弹碰到敌方坦克,敌方坦克 iHp 设为 0,并且g_iScore 加 1。2、每隔一段时间,敌方坦克就发射一发子弹;增加一个一个全局常量的定义:7const float FIRE_TIME = 2.f; / 敌方坦克发射炮弹的时间间隔创建坦克时,需要给坦克的 fFireTime 赋值为 FIRE_TIME。在 WinMain 的主循环中,遍历链表,找到敌方坦克节点。如果坦克发射炮弹时间到,调用 OnFire 函数。3、敌方子弹击中玩家坦克,游戏结束。在 OnMyTankColOther 函数中,当玩家坦克碰到的是子弹精灵(不可能是自己发射的子弹,因为子弹速度比坦克快)

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > 解决方案

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号