10 C语言课程设计_坦克大战(提高篇)
C#坦克大战实现(可编辑)
C#坦克大战实现记记事事本本CC##坦坦克克大大战战实实现现2010-12-18 21:06 910人阅读评论 0 收藏举报记得在大学学java时,同学在下载了很多java的视频,看到里面有些是介绍简单游戏开发的,马士兵老师讲的,挺感兴趣的。
一起看了看视频写了写程序。
现在毕业了,因为工作中用的是C#,最近很想拿C#把以前写的坦克大战重写下,来熟悉熟悉C#的基本语法。
程序很简单,跟java代码相比没有多大改动实现方法如下1.在form中添加一个panel,在panel的 Paint方法中得到Graphics对象2.通过Graphics对象再panel画出坦克,子弹等相关内容3.添加timer控件来控制panel的重画实现坦克,子弹的运动4.根据电脑按下的方向键,确定出坦克的方向,panel重画时根据坦克的方向修改坦克的X,Y轴坐标,来实现坦克的移动5.通过Rectangle的IntersectsWith函数来进行碰撞检测,实现子弹打击坦克具体实现代码1.在项目里面添加枚举类型////// 表示方向的的枚举类型///public enum Direction L, U, D, R, STOP 2.添加子弹类的相关常量,属性////// 子弹X轴的速度,单位PX///public static int XSPEED 10;////// 子弹Y轴的速度,单位PX///public static int YSPEED 10;////// 子弹的宽度///public static int WIDTH 10;1////// 子弹的高度///public static int HEIGHT 10;////// 子弹的坐标///int x, y;////// 子弹的方向///Direction dir;////// 子弹的存活状态///private bool live true;////// TankClient窗体实例///private TankClient tankClient; ////// 敌我双方的标记///private bool good;3.添加draw方法来画出子弹public void Draw Graphics gif !livetankClve this ;2return;//通过画椭圆函数在界面上显示子弹g.FillEllipse Brushes.Black, x, y, Missile.WIDTH, Missile.HEIGHT ;Move ;4.添加子弹打击坦克的方法public bool HitTank Tank t//用IntersectsWith来检测两个矩形相碰撞if GetRectangle .IntersectsWith t.GetRectangle && t.Live && this.live && this.good! t.Goodt.Live false;this.live false;return true;return false;5.添加坦克类相关属性,常量////// 坦克x轴的速度///public static int XSPEED 5; ////// 坦克y轴的速度///public static int YSPEED 5;////// 坦克的宽度///public static int WIDTH 30;3////// 坦克的高度///public static int HEIGHT 30;////// 坦克的坐标///private int x, y;////// 标记上下左右键是否按下///private bool l false, u false, r false, d false;////// 坦克的方向///private Direction dir Direction.STOP ;////// 坦克炮筒方向///private Direction ptDir Direction.D ; ////// TankClient窗体实例///TankClient tankClient;////// 标记敌我双方///private bool good;///4/// 控制敌人坦克不规则运行时使用 ///private int step 0;////// 标记坦克的存活状态///private bool live true;6.在tank类中实现画坦克方法public void Draw Graphics g if !liveif !goodtankClve this ; return;if good//通过FillEllipse来画坦克g.FillEllipse Brushes.Red, x, y, WIDTH, HEIGHT ;elseg.FillEllipse Brushes.Blue, x, y, WIDTH, HEIGHT ;//根据炮筒坦克来画出坦克的炮筒switch ptDircase Direction.D:g.DrawLine Pens.Black, x + WIDTH / 2, y + HEIGHT / 2, x + WIDTH / 2, y + HEIGHT ;break;case Direction.U :g.DrawLine Pens.Black, x + WIDTH / 2, y + HEIGHT / 2, x + WIDTH / 2, y ;5break;case Direction.L:g.DrawLine Pens.Black, x + WIDTH / 2, y + HEIGHT / 2, x, y + HEIGHT / 2 ;break;case Direction.R:g.DrawLine Pens.Black, x + WIDTH / 2, y + HEIGHT / 2, x + WIDTH, y + HEIGHT / 2 ;break;Move ;7.键盘按键处理的相关代码public void KeyPressed KeyEventArgs eKeys key e.KeyCode; switch keycase Keys.Right: r true;break;case Keys.Left: l true;break;case Keys.Up:u true; break;case Keys.Down: d true; break;LocateDirection ;8.tank发子弹的方法public Missile Fireif !live return null;int x this.x + WIDTH / 2 - Missile.WIDTH / 2;6int y this.y + HEIGHT / 2 - Missile.HEIGHT / 2;Missile missile new Missile x, y, good, ptDir, tankClient ;tankCl missile ;return missile;9.主窗体类加入坦克myTank new Tank 50, 20, true, this ;//放到前面 this不能用 //y轴比java的减少了30for int i 0; i 15; i++//添加10个坦克x轴间距为40pxtanks.Add new Tank 50+40* i+1 ,20,false,this ; //y轴比java的减少了3010.主窗体类中调用子弹打击坦克的方法for int i 0; i missiles.Count; i++ Missile m missiles[i];m.HitTank myTank ;m.HitTanks tanks ;m.Draw g ;11.主窗体处理按键代码private void Form1_KeyDown object sender, KeyEventArgs emyTank.KeyPressed e ;12.控制重画代码private void timer1_Tick object sender, EventArgs e//间隔50毫秒控制panel的重画panel1.Invalidate ;13.这是主要代码基本完成,但是游戏会有闪烁问题可以通过双缓冲来解决,C#解决时很省事,一个函数就能解决7this.SetStyleControlStyles.OptimizedDoubleBuffer |ControlStyles.ResizeRedraw |ControlStyles.AllPaintingInWmPaint, true ;顺便改了个手机版本的但是手机版本的没能解决双缓冲问题,屏幕有些闪烁,朋友们可以自己改进代码下载如果你发现有什么不合理的,需要改进的地方,邮件联系328452421@ (常年不在线,邮件联系)朱晓。
funcodeC课程设计坦克大战
f u n c o d e C课程设计坦克大战文件编码(008-TTIG-UTITD-GKBTT-PUUTI-WYTUI-8256)课程设计一坦克大战一、游戏介绍相信大部分同学都玩过或看过“坦克大战”这款经典游戏。
现在,就由我们自己动手来开发它。
只要大家具备了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,写在文件中。
(汇编代码)微机原理课程设计之TANK坦克大战
测试游戏功能是否正常
检查游戏性能是否达标
调试游戏中的错误和问题
优化游戏性能和体验
游戏测试:成功运 行,无严重错误
调试过程:定位并 修复了若干问题
测试结果:性能稳 定,符合预期
结论:游戏测试和 调试工作顺利完成
游戏优化和改进
优化算法:采用更高效的算法,减 少计算量,提高游戏运行速度。
完 成 TA N K 坦 克 大 战 游 戏 的 程 序设计和实现
学会使用汇编语言进行编程
掌握游戏的基本规则和玩法
游戏规则和玩法
游戏目标:击败所有敌人,保护基地 角色设定:玩家扮演坦克,有生命值和弹药量限制 武器装备:多种武器可供选择,不同武器有不同的攻击力和射程 游戏地图:多个关卡,每个关卡有不同的地形和敌人配置
添加标题
游戏状态管理:游戏状态包括开始、进行中和结束三个状态。在开 始状态下,玩家可以开始游戏;在进行中状态下,玩家可以操作坦 克移动和射击;在结束状态下,游戏结束并给出评价。
添加标题
游戏角色行为:游戏角色包括玩家坦克和敌方坦克。玩家坦克的行 为包括移动和射击;敌方坦克的行为包括移动和攻击。
游戏界面布局:简洁明了,易于操作 角色设计:形象生动,符合游戏主题 场景设计:丰富多样,增加游戏趣味性 特效设计:绚丽多彩,提升游戏体验感
添加标题
添加标题
添加标题
添加标题
敌方角色:游戏中的敌方坦克种类多 样,包括轻型坦克、重型坦克、自行 火炮等,具有不同的攻击和防御能力, 对玩家构成威胁。
游戏辅助角色:游戏中的一些辅助角 色,如地图、弹药补给点等,为玩家 提供地图信息和弹药补给服务,帮助 玩家更好地进行游戏。
游戏程序设计和实 现
游戏整体架构:包 括游戏的主要功能 模块和各模块之间 的关系
C++实例编程:简单坦克大战_C/C++_IT哇咔_IT技术爱好者之家
}
}
void DrawAmy(int x,int y,int i)/*画敌人*/
{
if(amy[i].color==12)
bar(100+x*20-9,50+y*20-9,100+x*20+9,50+y*20+9);
}
void DrawBrick(int x,int y)/*画砖*/
{
setfillstyle(SOLID_FILL,6);
bar(100+x*20-9,50+y*20-9,100+x*20+9,50+y*20+9);
setcolor(15);
line(100+x*20-9,50+y*20-4,100+x*20+9,50+y*20-4);
line(100+x*20-9,50+y*20+4,100+x*20+9,50+y*20+4);
line(100+x*20-4,50+y*20-9,100+x*20-4,50+y*20+9);
setcolor(12);
else if(amy[i].color==13)
setcolor(13);
else/*这里是判断三种颜色的坦克*/
setcolor(14);
circle(100+x*20,50+y*20,7);
c语言坦克大战最新代码
judge_tank_my(map,key);/*判断己方坦克运动函数*/
} aaa: ; } void map_all(int map[15][15])/*初始化地图函数*/ { int i,j; for(i=0;i<15;i++)
for(j=0;j<15;j++) switch(map[j][i]) { case 0: break; case 5:map_wall(i,j);break;/*地形*/ case 6:map_steel(i,j);break; case 7:map_water(i,j);break; case 8:map_border(i,j);break; case 9:map_base(i,j);break; }
void uptank(int i,int j,int color);/*画坦克函数*/ void downtank(int i,int j,int color); void lefttank(int i,int j,int color); void righttank(int i,int j,int color);
/* Note:Your choice is C IDE */ #include "graphics.h" #include "stdlib.h" #include "stdio.h"
#define a_UP 0x4800/*定义A坦克按键*/ #define a_DOWN 0x5000 #define a_LEFT 0x4b00 #define a_RIGHT 0x4d00 #define a_shoot 0x1c0d
void judge_moveshootway(int map[15][15],int i);/*炮弹运动时判断炮弹方 向函数*/ void judge_shoot(int m,int map[15][15],int i);/*判断炮弹打中的物体函数 */ void judge_shootway(int map[15][15],int i);/*炮弹打中物体时判断方向函 数*/
c语言坦克大战源代码
c语言坦克大战源代码/*游戏的整体思路大概是这样的?首先是欢迎界面,然后进入游戏界面,最后是gameover的界面。
本来打算做单人游戏,后来发现让敌人自主移动比较困难,所以改成了双人游戏?layer1控制按键是up,down,left,right,enter,player2控制按键是a,s,d,w,space。
*/#include<stdio.h>#include<string.h>#include<stdlib.h>#include<graphics.h>/*定义鼠标键值常量*/#define ESC 0x011b/*玩家1坦克按键*/#define UP 0x4800#define DOWN 0x5000#define LEFT 0x4b00#define RIGHT 0x4d00#define ENTER 0x1c0d#define up 0x1177/*玩家2坦克按键*/#define down 0x1f73#define left 0x1e61#define right 0x2064#define fire 0x246a/*定义游戏常量*//*双人游戏*/#define NUM 2/*坦克宽度*/#define WIDTH 20/*坦克的数量,宽度*//*定义global变量*******************************************//*子弹的属性*/struct myboom{/*如果子弹life为0则代表子弹没有发射*/int life;int x,y;int direction;};/*子弹们的初始属性*/struct myboom iboom[NUM]={{0},{0}};/*坦克的属性*/struct mytank{int life;int x,y;int direction;};/*坦克们的初始属性*/struct mytank itank[NUM]={{3,10*WIDTH,22*WIDTH},{1,440,40}};pre[NUM][2]={{10*WIDTH,22*WIDTH},{440,40}};/*xy[0]代表自己的坦克; xy[1]及以后代表敌军; 坦克坐标*//*存被子弹覆盖的图像*/void *boom_save[NUM];/*malloc开辟图像空间的大小*/int size;/*动画显示*/void *save[NUM];/*后来加上的。
坦克大战游戏程序课程设计
《程序设计应用基础》课程设计计划书坦克大战游戏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 主函数及其流程图主函数包括打印地图,实现游戏内置调节游戏速度的功能,判断坦克类型,判断敌我坦克是否存活,判断游戏胜负。
10 C语言课程设计_坦克大战(提高篇)
一、游戏介绍
玩家坦克与敌方坦克在街道中进行巷战,玩家坦克被击中、玩家指挥部被击中或游戏时 间到,一局游戏结束。
二、实验目的
综合应用 C 语言知识和设计知识开发一款小游戏。
三、实验内容
初始界面如下图。 按下空格键后游戏开始,“空格开始”消失,载入地图,并把玩家坦克设置在指挥部左 侧。 游戏时间到,比如 30 秒,玩家坦克被敌方坦克摧毁,或者玩家指挥部被摧毁,一局游 戏结束,游戏回到初始界面,并显示上一局的分数。 游戏区域为下图中最内部的黑色区域,左上角坐标[-26, -22],右下角坐标为[26, 22]。 墙为正方形,边长为 4,坦克也是正方形,比墙略小一点。 玩家用 WASD 键控制坦克上、下、左、右运行,按 J 键开炮。玩家坦克碰到墙就停下来, 需要调转方向才能继续前进。玩家坦克开炮,一炮就能摧毁一块墙,或者一辆敌方坦克。玩 家没摧毁一辆敌方坦克,加 1 分。 玩家指挥部被坦克或者炮弹(不管玩家还是敌方)碰上,都会被摧毁。 每隔几秒钟,比如 3 秒,就会产生一辆敌方坦克。敌方坦克每隔一段时间,比如 1 秒, 就自动开炮。敌方坦克遇到墙就会停下来。停下来的坦克,前方的墙如果被摧毁了,又能继 续前进。每隔几秒钟,比如 2 秒,敌方坦克就会顺时针变换一个方向前进。
FunCode API
函数原型 float dGetScreenLeft(); float dGetScreenRight(); float dGetScreenTop(); float dGetScreenBottom(); float dGetSpritePositionX(const char* szName);
// 朝向:0 - 上方;1 - 右方;2 - 下方;3
- 左方
09C++课程设计_坦克大战
课程设计一坦克大战一、游戏介绍相信大部分同学都玩过或看过“坦克大战”这款经典游戏.现在,就由我们自己动手来开发它.只要大家具备了C++语言和面向对象的基础知识,然后按照实验指南的指导一步一步进行下去,相信我们每个同学都能把这款经典游戏做出来。
二、实验目标综合运用C++及其面向对象的知识开发一款小游戏。
三、实验内容在一个战场上,玩家控制坦克,消灭敌方坦克,并防止敌方坦克摧毁我方基地。
游戏的具体要求如下:1、游戏有一个初始页面,如下图。
2、按下任意键开始游戏,玩家控制坦克在战场上穿梭,碰到墙时,不能通过。
3、敌方坦克自由移动,每隔2秒改变一个方向,每隔3秒发射一发子弹。
4、敌方坦克共有20辆,每隔5秒,从屏幕上方的左、中、右三个位置依次出现。
5、当玩家被消灭或者我方基地被摧毁时,游戏结束。
游戏开始前进入游戏四、游戏的整体框架五、实验指南实验一游戏开始【实验内容】1、设置游戏标题2、按空格键,提示图片消失,游戏进入开始状态.【实验运行结果】游戏开始前按下空格键后【实验思路】按下空格键是键盘按下事件,可在CSystem::OnKeyDown函数中编写响应代码。
为了保证程序结构的清晰、一致,更好的办法是在CGameMain类中添加一个相应的键盘按下事件处理函数,然后在CSystem::OnMouseClick函数中进行调用。
g_GameMain是CGameMain类的对象,它是全局变量,在程序运行时最先被创建。
【实验指导】1、C++程序的执行入口是主函数。
FunCode的主函数名称叫WinMain,写在Main。
cpp文件中。
CSystem::SetWindowTitle是设置程序运行窗口标题的函数,修改如下:CSystem::SetWindowTitle("坦克大战”);2、参考CSystem::OnKeyDown函数,为CGameMain类创建一个OnMouseClick函数。
CGameMain类的头文件是LessonX.h文件,实现代码写在LessonX。
c语言简单的坦克对战代码
c语言简单的坦克对战代码C语言简单的坦克对战代码介绍坦克对战游戏是一个经典的游戏,它可以锻炼玩家的反应能力和策略思维。
本文将介绍如何使用C语言编写一个简单的坦克对战游戏。
准备工作在开始编写代码之前,我们需要安装一些必要的工具。
首先,我们需要下载并安装一个C语言编译器。
常见的C语言编译器有GCC、Clang等。
其次,我们需要选择一个集成开发环境(IDE),例如Code::Blocks、Visual Studio等。
游戏规则在本文中,我们将实现一个基本的坦克对战游戏。
游戏规则如下:1. 游戏场景为一个20*20的方格。
2. 游戏中有两辆坦克,分别由玩家和电脑控制。
3. 玩家可以通过键盘控制自己的坦克移动和发射子弹。
4. 电脑会随机移动并发射子弹。
5. 当一辆坦克被击中时,游戏结束。
代码实现下面是实现上述规则所需的代码:头文件和宏定义```#include <stdio.h>#include <stdlib.h>#include <conio.h>#include <windows.h>#define WIDTH 20#define HEIGHT 20```其中,`WIDTH`和`HEIGHT`表示游戏场景的宽度和高度。
游戏场景的绘制void drawScene(char scene[WIDTH][HEIGHT]){int i, j;system("cls");for (i = 0; i < HEIGHT; i++) {for (j = 0; j < WIDTH; j++) {printf("%c", scene[i][j]);}printf("\n");}}```该函数用于绘制游戏场景。
参数`scene`是一个二维字符数组,用于表示游戏场景中每个位置的状态。
函数首先清空屏幕,然后遍历二维数组并输出对应的字符。
《C语言创新实验》课程设计报告
《C语言创新实验》课程设计报告
题目:坦克大战班级:10软件技术姓名:李海飞
指导老师:张红霞
一、功能模块
1. 模块A
2. 模块B
3. 模块C
4. 模块D
5. 模块E
6. 模块F
7. 模块G
.
二、课程设计总结
在做课程设计的过程中,我遇到了许多问题,查了很多资料,解决了一部分,但仍有一部分没解决,最终我想了很长时间才想出来。
通过做课程设计,使我对c语言有了更深的理解,对程序也有了更深的理解,也更加理解了算法的重要性。
学习一门技术,必须要靠大量的实践,我几乎每天都去机房,每天都在想我这个程序中遇到的问题,一旦想出方法来,会非常有成就感。
做课程设计的过程,也是学习的过程。
通过做课程设计,我学习了许多的知识,用到了许多我没用过的函数,知道了许多思想。
三、参考文献或网址
C游戏编程从入门到精通
C语言程序设计(第2版)——谭浩强
百度文库
百度百科
百度
百度知道。
基于C语言的坦克大战
基于C语言的坦克大战游戏是人类日常生活不可或缺的元素,游戏的方式随着时代的变迁也在改变。
在信息时代,以计算机为载体的游戏成为主流,特别是当今生活节奏加快的今天,生活和工作压力常常使人焦虑不安,而游戏能使人精神放松,舒缓压力。
标签:C语言;游戏;坦克大战1 技术简介目前主流的语言是Java、C++等等,这两门语言都是高级語言的一种。
是可以撰写跨平台应用程序的面向对象的程序设计语言。
Java语言具有很长丰富的语法特征,如模块和类模块,是一种解释型语言,他不会生成机器码,所以移植性特别好。
但高级语言存在体积庞大的特点,不适合对空间严格要求的场合。
C语言是一种历史悠久的计算机语言,同时使用范围广,它的出现就是解决了汇编语言晦涩难记的弊端,它既具有高级语言的特征又具有基层语言的功能,同时跨平台性也丝毫不比大型语言差。
C语言的指针更可以灵活操作内存空间,而高级语言则将其封装起来,使用起来限制太多,同时这也是C语言的缺点所在2 需求分析需求分析即是根据用户的要求来确定软件的。
分配软件元素,是软件定义时期的最后一个阶段,它的基本任务是确定系统必须做什么,是对要做的系统确定一个完整的、具体的、清晰的、准确的要求。
可以分为需求的提出,需求的描述,需求的评审等阶段。
需求分析也是设计数据结构的起点,需求分析的结果将直接影响到程序功能的设计。
需求分析的任务是通过详细调查现实世界要处理的对象(坦克、子弹、墙等),充分了解游戏的运行情况,开发游戏的各种需求,然后在此基础上确定游戏的功能。
调查的重点是“数据”和“处理”,通过调查、收集与分析,获得开发游戏的如下要求:信息要求、处理要求、安全性与健壮性要求。
(1)游戏整体分析.本游戏主要包括己方坦克和敌方坦克,还有我方基地,砖墙,铁墙,绿草,开始画面,游戏胜利画面,游戏结束画面。
我方坦克和对方坦克可以向上、向下、向左、向右移动,游戏的玩家通过键盘来控制坦克的移动和发射子弹,对方坦克通过A*算法移动和发射子弹。
课程设计报告--坦克大战
目录一.问题定义 (1)1. 项目名称 (1)2. 项目目标 (1)3. 选题背景 (1)二.可行性研究 (1)1.技术可行性 (1)2. 经济可行性 (1)3. 操作可行性 (1)三.需求分析 (2)1. 游戏内容需求 (2)2. 游戏规则 (3)四.游戏设计 (3)1. 类的设计 (3)2. 游戏流程 (4)1. 主流程 (4)2. 游戏初始化 (5)3. 游戏运行 (6)3. 游戏序列图 (14)游戏初始化 (14)键盘按下事件 (15)游戏运行 (15)玩家坦克处理 (16)电脑坦克处理 (17)炮弹碰撞处理 (19)坦克碰撞处理 (19)游戏结束 (20)五.游戏代码 (21)CGameMain类 (21)CTankPlayer类 (32)CTankEnemy类 (36)CBullet类 (42)CWeapon类 (49)六.实验总结 (53)一.问题定义1.项目名称坦克大战2.项目目标综合运用C++及其面向对象的知识开发一款小游戏。
3.选题背景相信大部分同学都玩过或看过“坦克大战”这款经典游戏。
现在,就由我自己动手来开发它。
因为之前的学习,我具备了C++语言和面向对象的基础知识,在这个基础上按照实验指南的指导一步一步进行下去,把这款经典游戏做出来。
巩固之前所学知识也学习新的知识。
二.可行性研究1.技术可行性本游戏采用 FunCode和Visual C++6.0进行开发,基于Windows xp和Windows7操作系统。
Funcode软件提供了大量基础类库,可以快速方便地构造出游戏软件。
之前课程学习过C++,具有一定的C++语言开发基础,对面向程序设计有一定了解。
2.经济可行性此次课程设计由我一人完成,只需装有Funcode及Visual C++的电脑一台,无资金需求;且制作出来的游戏软件并不打算发行,也无后期资金需求,经济完全可行。
3.操作可行性本游戏只需用W、A、S、D来移动,用J键进行攻击,操作十分简单,界面友好,符合用户操作习惯。
坦克大战
《面向对象的编程技术》课程设计实验报告专业班级:计算机科学与技术114班姓名:翟晓军学号:119074133设计时间:2012.12.8——2012.12.20课题名称:坦克大战课程主题与目的:(1)参考(《PC游戏编程(窥门篇)》谭文洪著)中的“坦克大战”(TankWar工程),并对其进行完善、扩充,程序要能看出专业水平和商业化产品的效果。
(2)要求:修改案例中“子弹可以穿透石头墙”的错误;增加上帝模式(无敌);修改一种敌军坦克,使之威力更大(要求坦克画面采用学生自己的头像)(需要重新编译资源包;之所以“改”而不是“增”,是因为同学们无法修改地图编辑器,另一个办法是在程序运行后动态加入);回答“坦克大战”指导书.doc(或pdf) 和TankWar剖析.doc(或pdf)中带有蓝色《….?》标记的问题。
(3)在中国,电子游戏曾一度被大家斥为“电子海洛因”。
然而电子游戏在青年学生中大受欢迎却又是一个不争的事实。
正如水能载舟,亦能覆舟一样,任何事物都有其两面性。
与其千方百计地封堵,还不如让同学们从技术的角度来研究它,这样既可以掌握复杂系统的设计技巧,也可以破除对电子游戏的神秘感。
我相信,一个人如果自己能制作游戏,如果能清楚地知道那个绚丽多彩的虚拟世界背后无非就是一些类、变量、函数的话,他就不可能再沉迷于打游戏———与一堆对象、内存变量和函数较劲。
同时,从技术上讲,游戏程序的开发异常复杂,能充分体现面向对象的拟人化思想和面向对象设计技巧。
通过游戏程序的制作,可以帮助学生真正掌握面向对象程序设计的精髓。
主要技术:C++中类的继承、派生以及多态的使用 程序开发环境:Microsoft Visual C++6.0,WIN7等游戏的整体设计:TobjectTSpriteTobstacleTExplodeTBonusTEnemytankTPlayertank TBulletTWorldTLinkTLinkNode运行界面展示:指导书问题解答:1、g_world.Move();//《不马上返回菜单,而是继续动,去掉此行怎样?》答:敌人坦克也保持不动2、static DWORD dwTick ;//《定时器用法。
坦克大战课程设计
《面向对象的编程技术》课程设计实验报告学院:计算机学院班级:软件工程114学号:119074258姓名:黄芳恺指导老师:胡增涛2012.12.10[程序设计名称]:疯狂坦克;[程序设计主题]:一款娱乐游戏,玩家通过运行操作坦克消灭坦克最后打掉“邪恶源获得胜利;[程序设计目的]:《面向对象的编程技术》课程设计是一门独立开设的实验课程,旨在进一步强化学生对类、封装、继承、多态等面向对象基本概念的理解和OOP(面向对象编程)实际动手能力,并进一步拓展到OOD(面向对象设计)原则、技巧和初步的OOA(面向对象分析)方法。
[程序设计简介]:一、设计目的:C++电脑游戏开发:侧重利用面向对象的拟人化思想解决复杂问题和OOD技巧;同时让学生掌握基本面向对象C++程序设计方法,熟悉C++程序设计的步骤;通过进行可视化程序设计,进一步熟悉可视化C++开发工具的使用和开发,提高动手能力,提高分析问题和解决问题的能力;二、功能介绍:这是一款小游戏,主要通过玩家的相关操作游戏中坦克做出相关的动作达到相应的效果,使玩家能够获得小乐趣;三、基本内容:模拟敌我各种坦克、各种炮弹的运动,模拟地形和各种障碍物,设计上述对象之间的交互。
处理坦克的各种功能与操作。
四、主要技术:C++程序编程以及相关软件的运用;五、运行环境:本设计采用Microsoft Visual C++6.0编译,并能够在WIN98,WIN2000下运行游戏基于Windows Game Engine(WGE游戏引擎,添翼虎科技)(没提供源程序,不过不用担心,你可以把它看成是利用DirectX快速处理图片、声音、键鼠的类库) ,该引擎需要DirectX7.0 SDK支持[应用程序的总体设计结构图]:、TObjectTSprite TObstacle TExplode TBonusTEnemyTank TPlayerTank TBulletTWord TLink TLinkNode[应用程序类层次图]:[主要运行界面的介绍]:程序主要运行界面如下图,首先是3个选择项目,开始游戏,游戏介绍和退出游戏。
c语言简单的坦克对战代码
C语言简单的坦克对战代码引言在计算机科学领域,游戏开发一直是一个非常有趣和具有挑战性的领域。
本文将介绍如何使用C语言编写一个简单的坦克对战游戏代码。
通过这个例子,读者将学习到如何使用C语言的基本语法和数据结构来实现一个简单的游戏。
游戏规则在这个坦克对战游戏中,有两个玩家分别控制两辆坦克进行对战。
游戏地图是一个二维的矩形区域,玩家可以在地图上移动坦克,并且可以发射子弹来摧毁对方的坦克。
坦克可以向上、向下、向左、向右四个方向移动,子弹可以向上、向下、向左、向右四个方向发射。
游戏的主要目标是摧毁对方的坦克,当一方的坦克被击中后,游戏结束,另一方获胜。
游戏设计为了实现这个游戏,我们需要设计几个基本的数据结构和函数。
以下是游戏设计的主要部分:数据结构1.Tank结构体:表示一个坦克的位置和状态信息。
2.Bullet结构体:表示一颗子弹的位置和状态信息。
3.Map结构体:表示游戏地图的大小和当前状态。
函数1.init_map()函数:用于初始化游戏地图,并生成两辆坦克的初始位置。
2.move_tank()函数:用于移动坦克的位置。
3.shoot_bullet()函数:用于发射子弹。
4.update_map()函数:用于更新游戏地图的状态,包括坦克和子弹的位置。
5.check_collision()函数:用于检测子弹是否击中了坦克。
6.game_over()函数:用于判断游戏是否结束。
代码实现以下是使用C语言实现坦克对战游戏的代码:#include <stdio.h>#define MAP_SIZE 10typedef struct {int x;int y;} Position;typedef struct {Position position;int health;} Tank;typedef struct {Position position;int active;} Bullet;typedef struct {Tank player1;Tank player2;Bullet bullets[MAP_SIZE * MAP_SIZE];} Map;void init_map(Map* map) {map->player1.position.x = 0;map->player1.position.y = 0;map->player1.health = 100;map->player2.position.x = MAP_SIZE - 1;map->player2.position.y = MAP_SIZE - 1;map->player2.health = 100;for (int i = 0; i < MAP_SIZE * MAP_SIZE; i++) { map->bullets[i].active = 0;}}void move_tank(Tank* tank, int x, int y) {tank->position.x += x;tank->position.y += y;}void shoot_bullet(Map* map, Tank* tank) {for (int i = 0; i < MAP_SIZE * MAP_SIZE; i++) {if (!map->bullets[i].active) {map->bullets[i].active = 1;map->bullets[i].position.x = tank->position.x;map->bullets[i].position.y = tank->position.y;break;}}}void update_map(Map* map) {for (int i = 0; i < MAP_SIZE * MAP_SIZE; i++) {if (map->bullets[i].active) {Bullet* bullet = &map->bullets[i];bullet->position.x += 1;bullet->position.y += 1;}}}int check_collision(Map* map) {for (int i = 0; i < MAP_SIZE * MAP_SIZE; i++) {if (map->bullets[i].active) {Bullet* bullet = &map->bullets[i];if (bullet->position.x == map->player1.position.x && bullet->position.y == map->player1.position.y) { map->player1.health -= 10;bullet->active = 0;}if (bullet->position.x == map->player2.position.x && bullet->position.y == map->player2.position.y) { map->player2.health -= 10;bullet->active = 0;}}}}int game_over(Map* map) {if (map->player1.health <= 0 || map->player2.health <= 0) {return 1;} else {return 0;}}int main() {Map map;init_map(&map);while (!game_over(&map)) {// 获取玩家输入,移动坦克或发射子弹update_map(&map);check_collision(&map);}// 游戏结束,显示获胜方return 0;}总结通过本文的介绍,读者可以了解到如何使用C语言编写一个简单的坦克对战游戏代码。
c语言编写坦克大战源代码
#include "tank.h"#include "ConOperator.h"#include <time.h>#include <windows.h>#include <conio.h>#include <iostream>using namespace std;TankGame::TankGame(int w, int h){// 设定当前关数no = 1;// 设定游戏整体高宽wide = w;high = h;HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);COORD sizePos = {2 * wide, high};SetConsoleScreenBufferSize(hStdOut, sizePos);// 分配游戏空间状态表gameSpace = new GameSpace*[high];for (int i = 0; i != high; i++)gameSpace[i] = new GameSpace[wide];// 添加围墙wall = new Wall(gameSpace, wide, high);wall->draw();}void TankGame::load_init(){// 初始化游戏空间for (int y = 1; y != high-1; y++) {for (int x = 1; x != wide-1; x++) {gameSpace[y][x].have = false;gameSpace[y][x].kind = 0;gameSpace[y][x].no = 0;}}// 添加地图map.load(gameSpace, no);// 初始化自己坦克me.init_xy();me.trans_direction(1);me.set_no(0);me.init_move(gameSpace, wide / 2 - 2, high - 5);// 按顺序诞生敌人坦克creatPlace = 0;for (int i = 0; i != 3; i++) {freezeTime[i] = REBIRTHTIME;enemy[i].init_xy();enemy[i].set_kind(2);enemy[i].set_no(i+1);reset(enemy[i]);}// 数目初始化leftCount = 17;existCount = 3;// 显示图片me.draw_tank();for (int i = 0; i != 3; i++)enemy[i].draw_tank();map.draw();}TankGame::~TankGame(){if (wall)delete wall;if (gameSpace) {for (int i = 0; i != high; i++)delete[] gameSpace[i];delete[] gameSpace;}}void TankGame::reset(Tank& tank){bool success = false;int t = 3;while (t && !success) {creatPlace++;if (creatPlace == 4)creatPlace = 1;// 诞生地点选择switch (creatPlace) {case 1:tank.trans_direction(3); //朝下if (tank.reset(gameSpace,1,1))success = true;break;case 2:tank.trans_direction(3);if (tank.reset(gameSpace,wide / 2 - 2, 1))success = true;break;case 3:tank.trans_direction(3);if (tank.reset(gameSpace,wide - 4, 1))success = true;break;}if (!success)t--;}}void TankGame::start(){char command;enter_picture(command);if (command != ENTER)return;while (me.blood > 0) {// init data for runingload_init();// run a taskruning_a_task();// determine why returnif (me.blood > 0) {no++;if (no > map.total) {success_gameover();break;}char command;turn_to_next_task(command);if (command != ENTER)break;}else game_over();}}//voidvoid TankGame::runing_a_task(){while ((leftCount || existCount) && me.blood) {clock_t now = clock();char command = -1; // 主人命令while (clock() - now < TIME_UNIT) // 小于一个时间片,暂停update_keyBoard_char(command);/*更新敌人坦克*/for (int i = 0; i != 3; i++) {if (enemy[i].blood == 0)continue;if (enemy[i].freezeTime == 0) {enemy[i].rand_direction(gameSpace); // 产生随机方向}else {if (enemy[i].speed == 0) {enemy[i].move(gameSpace);if (bullet[i+1].disapper) {int shot = -1;bullet[i+1] = enemy[i].rand_shot(gameSpace,i+1, shot);if (shot == 0)me.be_shot(gameSpace);bullet[i+1].registration(gameSpace);}enemy[i].freezeTime--;} else {enemy[i].speed--;}}}/*更新自己坦克*/if (command >=0 && command < 4) {me.trans_to_direction(command);me.move(gameSpace);}/*更新子弹*/for (int i = 0; i !=4; i++) {if (!bullet[i].disapper) { // 存在的子弹int shot;bullet[i].move(gameSpace, shot); // 运行,是否射中if (shot == 0)me.be_shot(gameSpace);else if (shot >= 1 && shot <= 3) {enemy[shot-1].be_shot(gameSpace);existCount--;} else if (shot >= 7 && shot <= 10) {bullet[shot-7].unregistration(gameSpace);bullet[shot-7].clear();bullet[shot-7].init(bullet[shot-7].kind);}}}/*自己产生子弹*/if (bullet[0].disapper) {if (command == 32) {int shot;bullet[0] = me.make_bullet(gameSpace,0, shot);if (shot >= 1 && shot <= 3) {enemy[shot-1].be_shot(gameSpace);existCount--;}bullet[0].registration(gameSpace);}}/*诞生缺损敌人*/if (leftCount > 0) {for (int i = 0; i != 3; i++) {if (enemy[i].blood == 0) {if (freezeTime[i] == 0) {freezeTime[i] = REBIRTHTIME;reset(enemy[i]);existCount++;leftCount--;}else freezeTime[i]--;}}}}}void TankGame::update_keyBoard_char(char& c){if (_kbhit()) {c = getch();if (c == -32) {c = getch();if (c != UP && c != DOWN && c != LEFT && c != RIGHT)c = -1;else if (c == RIGHT)c = 0;else if (c == UP)c = 1;else if (c == LEFT)c = 2;elsec = 3;}elsec = 32;}}void TankGame::enter_picture(char &command){string captions[6];captions[0] = "◥◣◢◤■■■■■◥◣◢◤";captions[1] = " ◥◣◢◤◢◤◥◣◢◤";captions[2] = " ◥◣◢◤◢◤◥◣◢◤";captions[3] = " ◢◤◢◤◢◤◥◣";captions[4] = " ◢◤◢◤◢◤◥◣";captions[5] = " ◢◤■■■■■◢◤◥◣";string s = " ";color(0x0e);for (int i = 0; i != 6; i++)grid(7, 6 + i, captions[i]);Frame frame(30,15);frame.draw_frame(4,19,0x09);string sentence[3];sentence[0] = "This small game is made by yzx in 2010.";sentence[1] = "Wlecome to play it.";sentence[2] = "All Rights Reserved.";color(0x0e);for (int i = 0; i != 3; i++) {for (int k = 0; k != sentence[i].size(); k++) {grid(14+k,21+2*i,sentence[i][k]);sleep(50);}sleep(1000);}grid(7, 28,"Enter : 开始ESC : 退出");while (true) {if (_kbhit()) {command = getch();if (command == ENTER || command == ESC)break;}}// clear screen picture in wallclear_picture();}void TankGame::turn_to_next_task(char& command){clear_picture();color(0x0e);grid(18, 20, "第");grid(20, 20, no);grid(22, 20, "关");while (true) {if (_kbhit()) {command = getch();if (command == ENTER || command == ESC)break;}}grid(18, 20," ");}void TankGame::success_gameover(){clear_picture();Frame frame(30,15);frame.draw_frame(4,10,0x09);string sentence[3];sentence[0] = "Congratulations for Successfully finishing all tasks";sentence[1] = "Thank you for using it deeply.";sentence[2] = "And welcome to use it next time.";color(0x0e);for (int i = 0; i != 3; i++) {for (int k = 0; k != sentence[i].size(); k++) {grid(12+k,14+2*i,sentence[i][k]);sleep(50);}sleep(1000);}while (true) {if (_kbhit()) {char command = getch();if (command == ENTER || command == ESC)break;}}}void TankGame::game_over(){clear_picture();Frame frame(30,15);frame.draw_frame(4,15,0x09);string sentence[4];sentence[0] = "Game over, but you can try it again.";sentence[1] = "Thank you for using it deeply.";sentence[2] = "And welcome to use it next time.";sentence[3] = "All rights reserved.(Violators will be prosecuted.) .";color(0x0e);for (int i = 0; i != 4; i++) {for (int k = 0; k != sentence[i].size(); k++) {grid(13+k,18+2*i,sentence[i][k]);sleep(50);}sleep(1000);}while (true) {if (_kbhit()) {char command = getch();if (command == ENTER || command == ESC)break;}}}void TankGame::clear_picture(){int cirX = wide / 2;int cirY = high / 2;int depth = cirY > cirX ? cirY + 2 : cirX + 2;int lx, rx, uy, by;int l, r, u, b;for (int i = 0; i != depth; i++) {lx = cirX - i;rx = cirX + i;uy = cirY - i;by = cirY + i;uy <= 0 ? u = 1 : u = uy;by >= high - 1 ? b = high - 2 : b = by;lx <= 0 ? l = 1 : l = lx;rx >= wide -1 ? r = wide - 2 : r = rx;if (rx < wide - 1) {for (int k = u; k <= b; k++)grid(rx, k, " ");}if (lx > 0) {for (int k = u; k <= b; k++)grid(lx, k, " ");}if (by < high - 1) {for (int k = l; k <= r; k++)grid(k, by, " ");}if (uy > 0) {for (int k = l; k <= r; k++)grid(k, uy, " ");}}}void TankGame::test(){for (int y = 0; y != 40; y++) {for (int x = 0; x != 40; x++) {if (gameSpace[y][x].have)// && gameSpace[y][x].kind == 3)grid(x, 42+y, (char)gameSpace[y][x].no);elsegrid(x, 42+y, " ");}}}。
C#版坦克大战
福州教育学院()届毕业论文(设计)题目:系部:专业(方向):学号:姓名:提交日期:指导教师及职称:C#版坦克大战摘要:1985年推出的坦克大战(Battle City)由13×13大小的地图组成了35个关卡,地形包括砖墙、海水、钢板、森林、地板5种,玩家作为坦克军团仅存的一支精锐部队的指挥官,为了保卫基地不被摧毁而展开战斗。
游戏中可以获取有多种功能的宝物,敌人种类则包括装甲车、轻型坦克、反坦克炮、重型坦克4种。
游戏以其出色的游戏性感染的一代又一代的玩家。
现在我在以前的坦克大战的基础上增加了一些的新功能和新算法(例如:玩家自定义地图编辑功能和新的AI算法,并且将地图扩展到了20×20)使得游戏更加有趣。
目录第一章引言 (3)1.1C#语言的介绍 (3) FrameWork简介 (3)第二章游戏的设计 (3)2.1游戏的设计方案 (4)2.2游戏的开发所需的硬件和软件 (4)2.3 游戏中的中枢Level类 (4)2.4 游戏中的组件的基类Element类 (12)第三章游戏所涉及的技术问题 (14)3.1 GUI+与图像双缓冲技术 (14)3.2 多线程技术 (16)3.3 I/O技术实现地图的读取 (17)3.4 碰撞的检测 (19)3.5 接受用户的键盘输入 (19)第四章游戏界面与代码 (19)4.1 开始界面及代码 (19)4.2 游戏界面及代码 (21)第五章总结 (25)第一章引言1.1 C#语言的介绍C#(读做 "C sharp",中文译音暂时没有.专业人士一般读"C sharp",现在很多非专业一般读"C井"。
C#是微软公司发布的一种面向对象的、运行于.NET Framework之上的高级程序设计语言。
并定于在微软职业开发者论坛(PDC)上登台亮相。
C#是微软公司研究员Anders Hejlsberg的最新成果。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
C语言课程设计--坦克大战一、游戏介绍玩家坦克与敌方坦克在街道中进行巷战,玩家坦克被击中、玩家指挥部被击中或游戏时间到,一局游戏结束。
二、实验目的综合应用C语言知识和设计知识开发一款小游戏。
三、实验内容初始界面如下图。
按下空格键后游戏开始,“空格开始”消失,载入地图,并把玩家坦克设置在指挥部左侧。
游戏时间到,比如30秒,玩家坦克被敌方坦克摧毁,或者玩家指挥部被摧毁,一局游戏结束,游戏回到初始界面,并显示上一局的分数。
游戏区域为下图中最内部的黑色区域,左上角坐标[-26, -22],右下角坐标为[26, 22]。
墙为正方形,边长为4,坦克也是正方形,比墙略小一点。
玩家用WASD键控制坦克上、下、左、右运行,按J键开炮。
玩家坦克碰到墙就停下来,需要调转方向才能继续前进。
玩家坦克开炮,一炮就能摧毁一块墙,或者一辆敌方坦克。
玩家没摧毁一辆敌方坦克,加1分。
玩家指挥部被坦克或者炮弹(不管玩家还是敌方)碰上,都会被摧毁。
每隔几秒钟,比如3秒,就会产生一辆敌方坦克。
敌方坦克每隔一段时间,比如1秒,就自动开炮。
敌方坦克遇到墙就会停下来。
停下来的坦克,前方的墙如果被摧毁了,又能继续前进。
每隔几秒钟,比如2秒,敌方坦克就会顺时针变换一个方向前进。
四、实验准备本实验中可能用到的C 语言标准库函数和FunCode API Stdio.hMath.hString.hFunCode 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键,设置向右速度。