程序设计实训坦克大战实验报告.doc
《程序设计实训坦克大战实验报告.doc》由会员分享,可在线阅读,更多相关《程序设计实训坦克大战实验报告.doc(14页珍藏版)》请在咨信网上搜索。
- - 程序设计实训报告 坦克大战 专业班级: 装控1401 实习时间:2015年7月10日至7月14日 实习地点: 微401 成 员 1: 振华 成 员 2: 许晨欢 成 员 3: 绪涛 考勤〔10%〕 文档〔30%〕 创意及实现〔30%〕 视频 〔30%〕 总成绩 〔100%〕 个人分 成员1 成员2 成员3 - - word.zl- - - 一、作品概述 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 GAME_TIME = 100.f; // 一局游戏时间 const float CREATE_TANK_TIME = 2.f; // 每批次生成坦克的时间间隔 const float TANK_SPEED = 20.f; // 坦克速度 const float BULLET_SPEED = 30.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; // 游戏场景边界左值 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函数中的主循环里,通过dSetTextValue把(int)g_fGameTime的数值显示在名为“time〞的文字精灵里,从而实时显示剩余时间〔显示整秒的时间〕。 4、当超过100秒,游戏完毕,重新显示“空格开场〞字样,游戏时间设为0,坦克回到初始位置。一局游戏进展中,每循环一次,g_fGameTime减去一次刷屏的时间。当g_fGameTime≤0,说明一局游戏时间已完,游戏停顿,重新显示“空格开场〞字样。同时,g_batart状态要改为0,否那么下一局就不能正确判断游戏开场或完毕。 3.2.2玩家坦克在街道中运行 1、一局游戏开场时载入地图。利用数组的值来载入地图,值为0,说明此处为空;值为1,说明此处有墙。游戏开场后载入地图,但只能载入一次。如果不停载入,会占有大量资源。创立一个新的精灵,首先需要给它命名。有规那么地给精灵命名,有利于我们对精灵进展处理。我们按照墙生成的先后顺序,分别给精灵命名为:wall0,wall1,wall2….按树林生成的顺序,分别给精灵命名为:shu,shu1,shu2……,钢板分别命名为aa1,aa2……。 2、一局游戏完毕后删除地图。 3、玩家坦克碰到墙的话,不能继续前行。设置玩家坦克的碰撞属性,并专门定义一个函数处理玩家坦克发生碰撞后,玩家坦克的响应。 3.2.3玩家坦克射击 1、玩家按下j键,坦克发送炮弹;自定义一个函数,OnFire用于完成坦克发射子弹功能。玩家坦克发射子弹,和敌方坦克发射子弹功能根本一样,我们可以写在一个函数里。首先,需要把发射子弹的坦克名称传进来,这样,我们才能获取坦克的朝向和位置;其次,需要区别是我方坦克发射的子弹,还是敌方坦克发射的子弹。在dOnKeyDown中增加对OnFire函数的调用。条件需要满足:游戏开场后,且玩家按J键。 2、创立链表,用链表管理炮弹;用链表管理子弹,每发射一颗子弹,就添加到链表里。每删除一颗子弹,就从链表里相应删除节点。游戏完毕时,删除所有剩余的子弹。 3、子弹击中墙,将墙摧毁;子弹击中目标,游戏完毕。碰撞事件中,我们经常会将碰撞的一方或两方删除。但是,如果我们直接删除某个精灵,而后面的精灵还需要获得它的信息时,就没法获得了。因此,我们定义一个ISDead函数,当该指针存在且iHp为0时,说明该精灵已死。碰撞函数中,先将需要删除的精灵的iHp设置为0,最后再统一将需要删除的精灵删除。 4、在dOnSpriteColSprite函数中调用上面两个碰撞函数。其中,墙只具有“承受碰撞〞属性,因此只需要判断szTarName是否包含wall字符串。子弹具有“发射碰撞〞和“承受碰撞〞两种属性,因此需要分别判断szSrame和szTarName是否包含bullet字符串。 3.2.4敌方坦克产生与运动 1、每隔一段时间,生成一辆敌方坦克,向下运动;坦克生成的初始位置前方不能有墙。 自定义一个函数,用于生成敌方坦克。每次生成一辆敌方坦克,总是放在第一排,列数随机,但其前方不能有墙。方向朝向,设置“发送碰撞〞和“承受碰撞〞属性,设置世界边界。创立一个Weapon指针节点,将精灵名称、朝向、坦克调转方向时间保存起来,并将节点添加到链表中。 2、敌方坦克每隔一段时间,就顺时针变化一个方向,继续前进。自定义一个MoveEnemyTank函数,用来处理敌方坦克的运动。函数根据敌方坦克名称,获取敌方坦克当前朝向和速度,然后将该坦克顺时针旋转90度,并修改相应速度。在WinMain函数中,一局游戏运行时,遍历链表,找出敌方坦克节点,判断是否已经到调换方向时间。如果时间到,调用MoveEnemyTank函数。 3.2.5坦克对战 1、玩家坦克子弹击中敌方坦克,敌方坦克被摧毁,玩家加一分。在OnTankColOther函数中,对玩家子弹碰到敌方坦克,敌方坦克iHp设为0,并且g_iScore加1。 2、每隔一段时间,敌方坦克就发射一发子弹;增加一个一个全局常量的定义:const float FIRE_TIME = 2.f; // 敌方坦克发射炮弹的时间间隔\ 创立坦克时,需要给坦克的fFireTime赋值为FIRE_TIME。在WinMain的主循环中,遍历链表,找到敌方坦克节点。如果坦克发射炮弹时间到,调用OnFire函数。 3、敌方子弹击中玩家坦克,游戏完毕。在OnMyTankColOther函数中,当玩家坦克碰到的是子弹精灵〔不可能是自己发射的子弹,因为子弹速度比坦克快〕,游戏完毕。 四、系统界面 图4-1开场游戏 图4-2游戏进展画面 图4-3开场新一局游戏 五、总结 许晨欢:这次程序设计实训我自己收获非常的多,首先是对于funcode这款软件的收获,可以说是从无到有,从陌生到熟悉,开场觉得软件太难了,无从下手,后来在不断询问教师和同学的过程中,逐渐熟能生巧,学会了创立第一个工程,运行FunCode创立新工程,导入静态精灵,导入动画精灵,删除精灵,设计界面初步,运行游戏等根本操作。通过练习熟练了翻开工程,安装目录及容,给精灵起名称,设置精灵的速度,设置精灵的层次,精灵与世界边界的碰撞,精灵与精灵的碰撞,导入地图模板等工程改良措施,并逐步运用自如。但是对软件熟悉了之后新问题又来了,发现真正难的是游戏代码,开场连哪个函数是什么作用都搞不明白,而且坦克大战中运用到指针,枚举等之前已经生疏的知识点,我们也只能是现学现用,通过询问教师,同学和查询网络一步一步到达自己的目的,在与同队的队员编写一天之后逐步的可以通过结合程序后面的中文注释看懂程序所表达的目的和意思了;在实习过程中遇到很多很多棘手的问题,其中最大的问题便是C语言能力不够了,好多程序编出来都有错误,甚至都编不出来,这给我们时间和精力上增添了很大障碍。在这几天最令我感慨的就是团队的力量,三个人从零根底到独立编写一个游戏,没有团结协作的精神是不行的,我们甚至牺牲晚上娱乐的时间和中午午休的时间加班加点地完善我们的程序,尽管很苦,但我们甘之如饴,为的是团队的成绩;其次就是C语言的强大力量,无论是我们日常接触的手机,电脑或者是接触不到的高科技产品,都离不开C语言,它是一种非常实用的计算机语言,我们也应该日后更加重视C语言的学习与应用。这次实训贵在学有所用,我在团队的力量中确实感觉到自己过去的C语言没有白学,能够转化为应用技能,感到很快乐,希望我们都能在日后注重学于用之间的关系,团结一心向前看! 振华:经过为期4天的funcode学习,从开场只会编程解决所谓的实际应用问题到用funcode平台编一个小游戏,其间我们的C语言知识、程序思维能力等从理论阶段提升到实践阶段,我们从游戏制作者的角度弄清楚了游戏运行原理,知道怎么原来的根底上添加类似的元素〔如树林、钢板〕……几天以来,感受颇深,例如坦克大战,首先进展功能分类,然后具体分析每个功能的设计以及各个功能模块之间的联系,精灵碰撞分类……我们解决现实问题的时候也可借鉴类似的思维方式,针对各种分类情况做出相应的抉择。再者,我们在不断地学习新知识的同时在应用中不断将已有的知识融会贯穿,多多抓住实践练习的时机,学习与应用相结合,使我们学有所用,到达学习的真正目的。以上这是我的感想。 绪涛:我这已经不是第一次接触funcode了,早在小学期开场前,就已经在教师的指导一下用funcode做过海底世界。因为c语言学的并不好,这次程序设计实训对我来说难度很大,还好有队友,不然能不能上交作业都成问题,更不用说做好作业了。通过这次实训,我的收获有好多,更加深入的了解了fancode,但我认为最大的收获就是重视团队合作,团队合作有能让1+1大于2的力量,重视团队合作能让一个活动变得更加协调。坦克大战是一款小时候经常玩的游戏,但是玩和做事不一样的,只有做的时候才知道有多难。这次实践我真正体会到了没有扎实的根本功应用起来真的难于上青天,既然知道了自己的缺乏就要吸取经历与教训,抓住时机,努力提升自己 - - word.zl-- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 程序设计 坦克 大战 实验 报告
咨信网温馨提示:
1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前自行私信或留言给上传者【二***】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时私信或留言给本站上传会员【二***】,需本站解决可联系【 微信客服】、【 QQ客服】,若有其他问题请点击或扫码反馈【 服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【 版权申诉】”(推荐),意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:4008-655-100;投诉/维权电话:4009-655-100。
1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前自行私信或留言给上传者【二***】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时私信或留言给本站上传会员【二***】,需本站解决可联系【 微信客服】、【 QQ客服】,若有其他问题请点击或扫码反馈【 服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【 版权申诉】”(推荐),意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:4008-655-100;投诉/维权电话:4009-655-100。
关于本文