C语言的坦克大战源码
- 格式:pdf
- 大小:83.92 KB
- 文档页数:20
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@ (常年不在线,邮件联系)朱晓。
福州教育学院()届毕业论文(设计)题目:系部:专业(方向):学号:姓名:提交日期:指导教师及职称: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的最新成果。
#include<iostream> #include<stdlib.h>#include<windows.h>#include<time.h>#include<conio.h> usingnamespacestd;HANDLEMutex=CreateMutex(NULL,FALSE,NULL);/互/ 斥对象intGameOver=0;intlevel=0;intmap[23][23];// 坦克种类,Normal 为玩家坦克#defineNormal0#defineRed1#defineBlue2#defineGreen3// 方向的宏定义#defineUp0#defineDown1#defineLeft2#defineRight3// 地图标记的宏定义#defineEmpty0#definePlayer1#definePlayerBullet2#defineEnemyBullet3#defineEnemy4intKill;intKillRed;intKillGreen;intEnemyExist;voidSetPos(inti,intj)// 设定光标位置{COORDpos={i,j};HANDLEOut=GetStdHandle(STD_OUTPUT_HANDLE); SetConsoleCursorPosition(Out,pos);}voidHideCurSor(void)// 隐藏光标{CONSOLE_CURSOR_INFOinfo={1,0};HANDLEOut=GetStdHandle(STD_OUTPUT_HANDLE);SetConsoleCursorInfo(Out,&info);}intsharp[4][12]={0,1,1,0,1,1,1,2,2,0,2,2},{0,0,0,2,1,0,1,1,1,2,2,1},{0,1,0,2,1,0,1,1,2,1,2,2},{0,0,0,1,1,1,1,2,2,0,2,1},};// 此数组用来保存坦克各个方向的形状信息DWORDWINAPIBulletfly(LPVOIDlpParameter);// 子弹函数申明voidUpdata();// 更新界面信息函数申明classTank// 坦克类{private:intDirection;// 方向inthotpoint[2];// 活动点intSpeed;// 速度intFirePower;// 火力public:Tank(intdir,inthot1,inthot2,inttyp,intspe,intfirepow)// 构造函数{Direction=dir;hotpoint[0]=hot1;hotpoint[1]=hot2; }Type=typ;Speed=spe;FirePower=firepow;}intType;// 坦克的种类(详见宏定义) intID;// 坦克在MAP中的标记(详见宏定义) intFireEnable;// 是否可以开火intLife;// 生命值voidRunning();// 运行函数intJudge(intx,inty,intID);// 判断是否可以绘制坦克voidDrawTank();// 重绘坦克voidRedraw();// 擦除坦克intGetSpeed()// 获取速度{returnSpeed;}intGetFire()// 获取火力{returnFirePower;}intGetDirection()// 获取方向{returnDirection;}intGetHotX()// 获取活动点坐标{returnhotpoint[0];}intGetHotY(){returnhotpoint[1];}voidIncreaseFire()// 火力+{FirePower++;}voidIncreaseSpeed()// 速度+{Speed++;}voidChangeDirection(intnewD)//改变方向{Direction=newD;}voidChangePos(intx,inty)// 改变活动点{hotpoint[0]=x;hotpoint[1]=y;}};Tankplayer(Right,0,0,Normal,1,1);// 玩家Tankenemy(Left,20,0,Red,1,1);// 敌人voidTank::DrawTank()// 绘制坦克{inti;intnx,ny;if(Type==Red)SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY|FOREGROUND_RED);elseif(Type==Blue)SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY|FOREGROUND_BLUE);elseif(Type==Green)SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY|FOREGROUND_GREEN);elseif(Type==Normal)SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_GREEN|FOREG R OUND_BLUE);for(i=0;i<6;i++){nx=hotpoint[0]+sharp[Direction][i*2]; ny=hotpoint[1]+sharp[Direction][i*2+1];SetPos((ny+1)*2,nx+1);// 利用sharp 数组相对于点x,y 绘制形状map[nx][ny]=ID;cout<<" ■ ";}}voidTank::Redraw()// 擦除坦克,原理同上{inti;intnx,ny;}for(i=0;i<6;i++){ nx=hotpoint[0]+sharp[Direction][i*2]; ny=hotpoint[1]+sharp[Direction][i*2+1];map[nx][ny]=Empty;SetPos((ny+1)*2,nx+1); cout<<"";}}intTank::Judge(intx,inty,intdir)// 判断当前是否可以绘制坦克{inti;intnx,ny;for(i=0;i<6;i++){ nx=x+sharp[dir][i*2]; ny=y+sharp[dir][i*2+1];if(nx<0||nx>=23||ny<0||ny>=23||map[nx][ny]!=Empty)// 不能绘制,返回 1 return1;return0;}voidTank::Running()// 坦克运行函数{intnewD;// 坦克的运行while(1){if(Life==0){EnemyExist=0;// 敌人不存在return;} if(GameOver==1)return;if(FireEnable==1&&GameOver==0)// 如果可以开火{WaitForSingleObject(Mutex,INFINITE);// 线程拥有互斥对象FireEnable=0;// 设为不可开火HANDLEbullet=CreateThread(NULL,0,Bulletfly,&ID,0,NULL);/ / 创建子弹线程}}}CloseHandle(bullet); ReleaseMutex(Mutex);// 释放互斥对象Sleep(100);}WaitForSingleObject(Mutex,INFINITE);// 线程拥有互斥对象srand((int)time(0));newD=rand()%4;if(newD==Up)// 随机出新的方向并重新绘制坦克{Redraw();if(Judge(hotpoint[0]-1,hotpoint[1],newD)==0){hotpoint[0]--;Direction=newD;}else{if(Judge(hotpoint[0],hotpoint[1],newD)==0) Direction=newD;elseif(newD==Down){Redraw();if(Judge(hotpoint[0]+1,hotpoint[1],newD)==0) {hotpoint[0]++; Direction=newD;}else{ if(Judge(hotpoint[0],hotpoint[1],newD)==0)Direction=newD;}}elseif(newD==Left){Redraw();if(Judge(hotpoint[0],hotpoint[1]-1,newD)==0) {hotpoint[1]--; Direction=newD;}else{if(Judge(hotpoint[0],hotpoint[1],newD)==0) Direction=newD; }}elseif(newD==Right){Redraw();if(Judge(hotpoint[0],hotpoint[1]+1,newD)==0){hotpoint[1]++;Direction=newD;}else{if(Judge(hotpoint[0],hotpoint[1],newD)==0) Direction=newD; }}if(GameOver==0&&Life!=0)DrawTank();ReleaseMutex(Mutex);// 释放互斥对象 Sleep(500-80*Speed);}}/*********************DWORDWINAPIBulletfly(LPVOIDlpParameter){int*ID=(int*)lpParameter;//ID 用来获取发射子弹坦克的 intPos[2];// 子弹活动点 intdirection; intSpeed; inttype;inthit=0;// 击中标记intoldx,oldy;// 旧活动点 intflag=0;// 子弹是否有移动的标记 if(*ID==Player)// 如果是玩家坦克 {type=PlayerBullet; direction=player.GetDirection(); Speed=player.GetFire(); Pos[0]=player.GetHotX(); Pos[1]=player.GetHotY();子弹线程函数IDelseif(*ID==Enemy)// 如果是敌人坦克{type=EnemyBullet;direction=enemy.GetDirection();Speed=enemy.GetFire();Pos[0]=enemy.GetHotX();Pos[1]=enemy.GetHotY();}if(direction==Up)// 根据坦克的位置和方向确定子弹的初始坐标{Pos[0]--;Pos[1]++;}elseif(direction==Down){Pos[0]+=3;Pos[1]++;}elseif(direction==Left)Pos[0]++;Pos[1]--;}elseif(direction==Right){{Pos[0]++;Pos[1]+=3;}// 子弹的运行while(1){WaitForSingleObject(Mutex,INFINITE);//这个不再注释了。
C语⾔完整游戏项⽬坦克⼤战详细代码话不多说我们今天就来创造出属于我们⾃⼰的《坦克⼤战》,GOGOGO直接开始吧这次的源码⽐较详细,我分了好⼏个cpp⽂件,思路更加的清晰,请耐⼼⽤⼼的观看⾸先就是我们载⼊图⽚的函数tupian.cpp# include "tanke.h"障碍物void LaoWang(int * tilex, int * tiley){IMAGE img;loadimage(&img, _T("res\\tile.bmp"));putimage(*tilex, *tiley, 32 , 32 , &img, 32 * 5, 0 );}void tileHong(int * tilex, int * tiley){IMAGE img;loadimage(&img, _T("res\\tile.bmp"));putimage(*tilex, *tiley, 32, 32, &img, 32 * 0, 0 );return;}void tileLv(int * tilex, int * tiley){IMAGE img;loadimage(&img, _T("res\\tile.bmp"));putimage(*tilex, *tiley, 32, 32, &img, 32 * 2, 0 );return;}void tileBai(int * tilex, int * tiley){IMAGE img;loadimage(&img, _T("res\\tile.bmp"));putimage(*tilex, *tiley, 32, 32, &img, 32 * 1, 0 );return;}IMAGE img;loadimage(&img, _T("res\\tile.bmp"));putimage(*tilex, *tiley, 32, 32, &img, 32 * 3, 0 ); }//物品void FaZhang(int *wupinx, int *wupiny){IMAGE img;loadimage(&img, _T("res\\fazhang.jpg"));putimage(*wupinx, *wupiny, 24, 24, &img, 0, 0 ); }void ShouQiang(int *wupinx, int *wupiny){IMAGE img;loadimage(&img, _T("res\\shouqiang.jpg"));putimage(*wupinx, *wupiny, 24, 24, &img, 0, 0 ); }void ShangDian(int *wupinx, int *wupiny){IMAGE img;loadimage(&img,_T("res\\shangdian.jpg"));putimage(*wupinx, *wupiny, 32, 32, &img, 0, 0 ); }void YaoShui(int *wupinx, int *wupiny){IMAGE img;loadimage(&img, _T("res\\yaoshui.jpg"));putimage(*wupinx, *wupiny, 28, 28, &img, 0, 0 ); }void DunPai(int *wupinx, int *wupiny){IMAGE img;loadimage(&img, _T("res\\dunpai.jpg"));putimage(*wupinx, *wupiny, 28, 28, &img, 0, 0 ); }void XieZi(int *wupinx, int *wupiny){IMAGE img;loadimage(&img, _T("res\ iezi.jpg"));putimage(*wupinx, *wupiny, 28, 28, &img, 0, 0 ); }void Boss(int *wupinx, int *wupiny){IMAGE img;loadimage(&img, _T("res\\boss.jpg"));putimage(*wupinx, *wupiny, 32, 32, &img, 0, 0 ); }void BigBoss(int *wupinx, int *wupiny){IMAGE img;loadimage(&img, _T("res\\bigboss.jpg"));putimage(*wupinx, *wupiny, 32, 32, &img, 0, 0 ); }接下来是初始化的函数waiyuan.cpp# include "tanke.h"{setcolor(GREEN);settextstyle(0, 0, ("宋体"));char c2[20] = "⾃⼰⽣命值:";outtextxy(0, 20, c2);char c3[10] ;sprintf(c3, _T("%.1f"), 100* (60 - *j) / 60.0);outtextxy(90, 20, c3);}void DShengMing(int * d,int *k){setcolor(GREEN);settextstyle(0, 0, ("宋体"));char c2[20] = "敌⼈⽣命值:";outtextxy(0, 0, c2);char c3[10] ;sprintf(c3, _T("%.1f"), 100* (60 - *d) / 60.0);outtextxy(90, 0, c3);char c4[40] = "恭喜~! 现在起⾦币到2200有惊喜!";//胜利 if ( *k >= 8000 ){setcolor(YELLOW);settextstyle(30, 0, ("宋体"));outtextxy(150, 0, c4);}}void Gold(int * gold){setcolor(GREEN);settextstyle(0, 0, ("宋体"));char c2[20] = "⾦币:";outtextxy(0, 40, c2);char c3[10] ;sprintf(c3, _T("%d"), *gold);outtextxy(40, 40, c3);}void start(void){initgraph(200, 130);TCHAR s1[10]="坦克⼤战";TCHAR s2[30]="按A 开始游戏按B 退出游戏";TCHAR s3[30]="按W S A D控制⽅向";TCHAR s4[20]="按J 发射⼦弹";TCHAR s5[20]="按C 看攻略";outtextxy(70, 0, s1);outtextxy(0, 110, s2);outtextxy(60, 90, s5);outtextxy(55, 30, s4);outtextxy(35, 60, s3);while (true){Sleep(500);if (GetAsyncKeyState('A')){BeginBatchDraw();closegraph();initgraph(640, 480);Sleep(200);Quit();return ;}if (GetAsyncKeyState('C'))GongLue();}}}void GongLue(void){initgraph(450, 300);TCHAR s1[20]="游戏攻略:";TCHAR s2[50]="再打坦克之前先吃法杖打掉⽩⾊砖块,";TCHAR s3[50]="这样敌坦克打⽩⾊就不能回⾎了,boss更应如此。
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];/*后来加上的。
对战坦克大战本节将介绍一个和FC(Family Computer)上的经典游戏《坦克大战》类似的游戏——对战坦克大战。
这是一个4 人对战的坦克游戏,4 个玩家两两一组,率先攻击到对方鹰巢的一组玩家获胜。
对战坦克大战是一个C/S 结构的网络游戏,它的网络部分是用重叠I/O 的Socket 实现的。
它分成服务器端和客户端。
服务器端用来接受客户端连接,并对游戏作出控制。
先来看看服务器部分的实现。
4.10.1 对战坦克大战的服务器程序服务器程序界面如图4.15 所示。
图4.15 对战坦克大战的服务器程序服务器是一段Win32 程序。
程序入口WinMain 和前面游戏中介绍过的入口函数并无二样。
WndProc是WinMain 中定义的消息回调函数,代码如下:LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam){int cxChar, cyChar ;switch (message){case WM_CREATE :cxChar = LOWORD (GetDialogBaseUnits ()) ;cyChar = HIWORD (GetDialogBaseUnits ()) ;hwndList = CreateWindow (TEXT ("listbox"), NULL,WS_CHILDWINDOW|WS_VISIBLE | LBS_STANDARD ^LBS_SORT,cxChar, cyChar,cxChar * 44 + GetSystemMetrics (SM_CXVSCROLL), cyChar * 16,hwnd, (HMENU) ID_LIST,(HINSTANCE) GetWindowLong (hwnd, GWL_HINSTANCE), NULL) ;//初始化服务器if ( !InitServer() )第4 章网络游戏开发277PostQuitMessage (0) ;//创建socket 监听线程CreateThread( NULL, 0, AcceptThread, NULL, 0, NULL ); //创建socket 工作线程CreateThread( NULL, 0, WorkerThread, NULL, 0, NULL ); return 0 ;case WM_SETFOCUS :SetFocus (hwndList) ;return 0 ;case WM_DESTROY :TerminateServer();PostQuitMessage (0) ;return 0 ;}return DefWindowProc (hwnd, message, wParam, lParam) ;}WndProc 在创建消息中首先调用了InitServer,以初始化服务器。
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`是一个二维字符数组,用于表示游戏场景中每个位置的状态。
函数首先清空屏幕,然后遍历二维数组并输出对应的字符。
坦克大战源码根据韩顺平老师视频所作/**坦克大战* 防重叠*/package ;import .*;import .*;import class MyTankGame5 extends JFrame implements ActionListener{quals("newgame")){quals("exit")){quals("saveExit")){quals("continue")){etImage"/"));image2=().getImage"/"));image3=().getImage"/"));etNodesAndEnemy();etSpeed();etSpeed(0);etSpeed();etSpeed(0);边的矩形(x, y, 5, 30,false);边的矩形(x, y, 5, 30,false);etSpeed();etSpeed(0);etSpeed(esp1);;import Node{int x;int y;int direct;public Node(int x,int y,int direct){=x;=y;=direct;}}//记录坦克信息的类class Recorder{//记录敌人和我的坦克数量private static int enlife=20;private static int mylife=10;private static int deadenemy=0;private static FileWriter fw=null;private static BufferedWriter bw=null;private static FileReader fr=null;private static BufferedReader br=null;private static Vector<EnemyTank> ets=new Vector<EnemyTank>();//从文件恢复记录static Vector<Node> nodes=new Vector<Node>();//完成读取public Vector<Node> getNodesAndEnemy(){try {//创建fr=new FileReader("d:\\chen\\");br=new BufferedReader(fr);String n="";//先读取第一行n=();deadenemy=(n);//用split分割从第二行开始取while((n=())!=null){//字符串str中从第一个字符起,//每遇到一个空格则切割为一个元素,//放入[]xyd数组中String []xyd=(" ");//这里的空格数与keepRecAndEnemyTank()中//写入(String record=+" "++" "+;)//!!!!!!!!!!!!!! //的空格数要对应,否则会报错!Node node1=new Node(xyd[0]),(xyd[1]),(xyd[2]));(node1);}} catch (IOException e) {// TODO Auto-generated catch block();}finally{//关闭文件//谁先开,谁后关!try {();();} catch (IOException e) {// TODO Auto-generated catch block();}}return nodes;}public static Vector<EnemyTank> getEts() {return ets;}public static void setEts(Vector<EnemyTank> ets) { = ets;}//保存击毁敌人的数目和敌人坐标,存盘退出public static void keepRecAndEnemyTank(){try {//创建fw=new FileWriter("d:\\chen\\");bw=new BufferedWriter(fw);(deadenemy+"\r\n");//保存当前敌人的数目和坐标for(int i=0;i<();i++){//取出第一个坦克EnemyTank et=(i);//保存活的if{String record=+" "++" "+;//写入(record+"\r\n");}}} catch (IOException e) {// TODO Auto-generated catch block();}finally{//关闭文件//谁先开,谁后关!try {();();} catch (IOException e) {// TODO Auto-generated catch block();}}}//保存击毁的敌人数目public static void keepRecording(){try {//创建fw=new FileWriter("d:\\chen\\");bw=new BufferedWriter(fw);(deadenemy+"\r\n");} catch (IOException e) {// TODO Auto-generated catch block();}finally{//关闭文件//谁先开,谁后关!try {();();} catch (IOException e) {// TODO Auto-generated catch block();}}}//读取出上一局击毁的敌人数目public static void getRecording(){try {//创建fr=new FileReader("d:\\chen\\");br=new BufferedReader(fr);String n=();deadenemy=(n);} catch (IOException e) {// TODO Auto-generated catch block();}finally{//关闭文件//谁先开,谁后关!try {();();} catch (IOException e) {// TODO Auto-generated catch block();}}}public static int getEnlife() {return enlife;}public static void setEnlife(int enlife) {= enlife;}public static int getMylife() {return mylife;}public static void setMylife(int mylife) {= mylife;}//减少数量public static void reduceMylife() {;}public static void reduceEnlife() {;}public static void deadenemy() {++;public static int getDeadenemy() {return deadenemy;}}class Tank{//坦克的横坐标int x=0;//纵坐标int y=0;//暂停速度int tempspeed;public int getTempspeed() {return tempspeed;}public void setTempspeed(int tempspeed) { = tempspeed;}//颜色int color;boolean isLive=true;public boolean isLive() {return isLive;}public void setLive(boolean isLive) {= isLive;}public int getColor() {return color;}public void setColor(int color) {= color;public int getX() {return x;}public void setX(int x) {= x;}public int getY() {return y;}public void setY(int y) {= y;}public Tank (int x,int y){=x;=y;}//坦克方向//0上,1右,2下,3左int direct=0;public int getDirect() {return direct;}public void setDirect(int direct) {= direct;}//坦克的速度int speed=3;public int getSpeed() {return speed;}public void setSpeed(int speed) {= speed;}}//敌方坦克class EnemyTank extends Tank implements Runnable{//设敌人可以复活10次static int newlife=10;//计数器static int counter=0;//让坦克随机产生步数//每次走多少步int steps=(int)()*50+10);int sleeptime=200; //睡眠时间//定义一个向量存放敌人子弹Vector<Shot> ss1=new Vector<Shot>();//在敌人创建和子弹死亡后在创建子弹public EnemyTank(int x,int y){super(x,y);}//定义一个向量,访问MyPanel的所有敌人坦克Vector<EnemyTank> ets=new Vector<EnemyTank>();//得到MyPanel的所有敌人坦克public void setEts(Vector<EnemyTank> vv){=vv;}//判断是否撞到了别的敌人坦克public boolean isTouchotherEnemy(){boolean b=false;//判断switch{case 0://向上//取出敌人所有坦克for(int i=0;i<();i++){//取出第一个坦克EnemyTank et=(i);//如果不是自己if(et!=this){//如果敌人方向是向上或者向下if==0||==2){if>=&&<=+20&&>=&&<=+30){return true;}if+20>=&&+20<=+20&&>=&&<=+30){return true;}}//如果敌人方向是向左或者向右if==1||==3){if>=&&<=+30&&>=&&<=+20){return true;}if+20>=&&+20<=+30&&>=&&<=+20){return true;}}}}break;case 1://向右//取出敌人所有坦克for(int i=0;i<();i++){//取出第一个坦克EnemyTank et=(i);//如果不是自己if(et!=this){//如果敌人方向是向上或者向下if==0||==2){if+30>=&&+30<=+20&&>=&&<=+30){return true;}if+30>=&&+30<=+20&&+20>=&&+20<=+30){return true;}}//如果敌人方向是向左或者向右if==1||==3){if>=&&<=+30&&>=&&<=+20){return true;}if+30>=&&+30<=+30&&+20>=&&+20<=+20){return true;}}}}break;case 2://向下//取出敌人所有坦克for(int i=0;i<();i++){//取出第一个坦克EnemyTank et=(i);//如果不是自己if(et!=this){//如果敌人方向是向上或者向下if==0||==2){if>=&&<=+20&&+30>=&&+30<=+30){return true;}if+20>=&&+20<=+20&&+30>=&&+30<=+30){return true;}}//如果敌人方向是向左或者向右if==1||==3){if>=&&<=+30&&+30>=&&+30<=+20){return true;}if+20>=&&+20<=+30&&+30>=&&+30<=+20){return true;}}}}break;case 3://向左//取出敌人所有坦克for(int i=0;i<();i++){//取出第一个坦克EnemyTank et=(i);//如果不是自己if(et!=this){//如果敌人方向是向上或者向下if==0||==2){if>=&&<=+20&&>=&&<=+30){return true;}if>=&&<=+20&&+20>=&&+20<=+30){return true;}}//如果敌人方向是向左或者向右if==1||==3){if>=&&<=+30&&>=&&<=+20){return true;}if>=&&<=+30&&+20>=&&+20<=+20){return true;}}}}break;}return b;}public void run() {// TODO Auto-generated method stubwhile(true){switch{case 0://继续让他再走几步for(int i=0;i<steps;i++){if(y>0&&!isTouchotherEnemy()){y-=speed;}// //撞到墙或者队友就转弯||isTouchotherEnemy()// else if(y<=0)// {// //让坦克变向// =(direct+1)%4;// }try {(sleeptime);} catch (InterruptedException e) {// TODO Auto-generated catch block();}}break;case 1://继续让他再走几步for(int i=0;i<steps;i++){if(x<&&!isTouchotherEnemy()){x+=speed;}// //撞到墙或者队友就转弯// else if(x>=// {// //让坦克变向// =(direct+1)%4;// }try {(sleeptime);} catch (InterruptedException e) {// TODO Auto-generated catch block();}}break;case 2://继续让他再走几步for(int i=0;i<steps;i++){if(y<&&!isTouchotherEnemy()){y+=speed;}//撞到墙或者队友就转弯// else if(y>=// {// //让坦克变向// =(direct+1)%4;// }try {(sleeptime);} catch (InterruptedException e) {// TODO Auto-generated catch block();}}break;case 3://继续让他再走几步for(int i=0;i<steps;i++){if(x>0&&!isTouchotherEnemy()){x-=speed;}// //撞到墙或者队友就转弯// else if(x<=0)// {// //让坦克变向// =(direct+1)%4;// }try {(sleeptime);} catch (InterruptedException e) {// TODO Auto-generated catch block();}}break;}//判断是否死亡,是否暂停if==false||=={//退出线程break;}//让坦克随机产生方向=(int)()*4);}}}//我的坦克class Hero extends Tank{//设我可以复活3次static int newlife=10;//计数器static int counter=0;Vector<Shot> ss=new Vector<Shot>();//子弹Shot s=null;public Hero(int x,int y){super(x,y);}//开火public void shotEnemy(){switch{case 0:s=new Shot(x+9,y-10,0);(s);break;case 1:s=new Shot(x+35,y+9,1);(s);break;case 2:s=new Shot(x+10,y+35,2);(s);break;case 3:s=new Shot(x-9,y+9,3);(s);break;}//创建线程对象Thread t1=new Thread(s);//启动();}//坦克向上移动public void moveUp(){if(y>0&&{y-=speed;}}//坦克向右移动public void moveRight(){if(x<&&{x+=speed;}}//坦克向下移动public void moveDown(){if(y<&&{y+=speed;}}//坦克向左移动public void moveLeft(){if(x>0&&{x-=speed;}}}//炸弹类class Bomb{//定义炸弹坐标int x,y;//炸弹生命int life=3;boolean isLive=true;public Bomb(int x,int y){=x;=y;}//减少生命值public void lifeDown(){if(life>0){life--;}else{=false;}}}//子弹类class Shot implements Runnable{//坐标int x;int y;int direct;int speed=5;public int getDirect() {return direct;}public void setDirect(int direct) {= direct;}public int getSpeed() {return speed;}public void setSpeed(int speed) {= speed;}//是否还活着boolean isLive=true;public Shot(int x,int y,int direct){=x;=y;=direct;}public void run(){while(true){try {(50);} catch (InterruptedException e) {// TODO Auto-generated catch block();}switch(direct){case 0://上方向y-=speed;break;case 1://向右x+=speed;break;case 2://向下y+=speed;break;case 3://向左x-=speed;break;}//"子弹坐标:"+"("+x+","+y+")");//子弹何时死亡?//判断该子弹是否碰到窗口边缘if(x<0||x>||y<0||y>{=false;break;}}}}//播放声音的类class AePlayWave extends Thread {private String filename;public AePlayWave(String wavfile){filename = wavfile;}public void run() {File soundFile = new File(filename);AudioInputStream audioInputStream = null;try {audioInputStream = (soundFile);} catch (Exception e1) {();return;}AudioFormat format = ();SourceDataLine auline = null;info = new , format);try {auline = (SourceDataLine) (info);(format);} catch (Exception e) {();return;}();int nBytesRead = 0;//这是缓冲byte[] abData = new byte[512];try {while (nBytesRead != -1){nBytesRead = (abData, 0, ;if (nBytesRead >= 0)(abData, 0, nBytesRead);}} catch (IOException e) {();return;} finally {();();}}}。