1、C大作业坦克大战 文档编制序号:KKIDT-LLE0828-LLETD298-POI08C大作业坦克大战#include#include#include#include#includeusingnamespacestd;HANDLEMutex=CreateMutex(NULL,FALSE,NULL);/互斥对象intGameOver=0;intlevel=0;intmap2323;/坦克种类,Normal为玩家坦克#defineNormal0#defineRed1#defineBlue2#defineGreen3/方向的宏定义#defineUp0#defineDown1#defineLeft2
2、#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_
3、CURSOR_INFOinfo=1,0; HANDLEOut=GetStdHandle(STD_OUTPUT_HANDLE); SetConsoleCursorInfo(Out,&info);intsharp412= 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();/更新界面信息函数申明c
4、lassTank/坦克类private: intDirection;/方向 inthotpoint2;/活动点 intSpeed;/速度 intFirePower;/火力public: Tank(intdir,inthot1,inthot2,inttyp,intspe,intfirepow)/构造函数 Direction=dir; hotpoint0=hot1; hotpoint1=hot2; Type=typ; Speed=spe; FirePower=firepow; intType;/坦克的种类(详见宏定义) intID;/坦克在MAP中的标记(详见宏定义) intFireEnable;
5、/是否可以开火 intLife;/生命值 voidRunning();/运行函数 intJudge(intx,inty,intID);/判断是否可以绘制坦克 voidDrawTank();/重绘坦克 voidRedraw();/擦除坦克 intGetSpeed()/获取速度 returnSpeed; intGetFire()/获取火力 returnFirePower; intGetDirection()/获取方向 returnDirection; intGetHotX()/获取活动点坐标 returnhotpoint0; intGetHotY() returnhotpoint1; voidIn
6、creaseFire()/火力+ FirePower+; voidIncreaseSpeed()/速度+ Speed+; voidChangeDirection(intnewD)/改变方向 Direction=newD; voidChangePos(intx,inty)/改变活动点 hotpoint0=x; hotpoint1=y; ;Tankplayer(Right,0,0,Normal,1,1);/玩家Tankenemy(Left,20,0,Red,1,1);/敌人voidTank:DrawTank()/绘制坦克 inti; intnx,ny; if(Type=Red) SetConsol
7、eTextAttribute(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|FOREGR
8、OUND_GREEN); elseif(Type=Normal) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_BLUE); for(i=0;i6;i+) nx=hotpoint0+sharpDirectioni*2; ny=hotpoint1+sharpDirectioni*2+1; SetPos(ny+1)*2,nx+1);/利用sharp数组相对于点x,y绘制形状 mapnxny=ID; cout
9、; voidTank:Redraw()/擦除坦克,原理同上 inti; intnx,ny; for(i=0;i6;i+) nx=hotpoint0+sharpDirectioni*2; ny=hotpoint1+sharpDirectioni*2+1; mapnxny=Empty; SetPos(ny+1)*2,nx+1); cout; intTank:Judge(intx,inty,intdir)/判断当前是否可以绘制坦克 inti; intnx,ny; for(i=0;i6;i+) nx=x+sharpdiri*2; ny=y+sharpdiri*2+1; if(nx=23|ny=23|m
10、apnxny!=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,&
11、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(hotpoint0-1,hotpoint1,newD)=0) hotpoint0-; Direction=newD; else if(Judge(hotpoint0,hotpoint1,n
12、ewD)=0) Direction=newD; elseif(newD=Down) Redraw(); if(Judge(hotpoint0+1,hotpoint1,newD)=0) hotpoint0+; Direction=newD; else if(Judge(hotpoint0,hotpoint1,newD)=0) Direction=newD; elseif(newD=Left) Redraw(); if(Judge(hotpoint0,hotpoint1-1,newD)=0) hotpoint1-; Direction=newD; else if(Judge(hotpoint0,h
13、otpoint1,newD)=0) Direction=newD; elseif(newD=Right) Redraw(); if(Judge(hotpoint0,hotpoint1+1,newD)=0) hotpoint1+; Direction=newD; else if(Judge(hotpoint0,hotpoint1,newD)=0) Direction=newD; if(GameOver=0&Life!=0) DrawTank(); ReleaseMutex(Mutex);/释放互斥对象 Sleep(500-80*Speed); /*子弹线程函数*/DWORDWINAPIBulle
14、tfly(LPVOIDlpParameter) int*ID=(int*)lpParameter;/ID用来获取发射子弹坦克的ID intPos2;/子弹活动点 intdirection; intSpeed; inttype; inthit=0;/击中标记 intoldx,oldy;/旧活动点 intflag=0;/子弹是否有移动的标记 if(*ID=Player)/如果是玩家坦克 type=PlayerBullet; direction=(); Speed=(); Pos0=(); Pos1=(); elseif(*ID=Enemy)/如果是敌人坦克 type=EnemyBullet; di
15、rection=(); Speed=(); Pos0=(); Pos1=(); if(direction=Up)/根据坦克的位置和方向确定子弹的初始坐标 Pos0-; Pos1+; elseif(direction=Down) Pos0+=3; Pos1+; elseif(direction=Left) Pos0+; Pos1-; elseif(direction=Right) Pos0+; Pos1+=3; /子弹的运行 while(1) WaitForSingleObject(Mutex,INFINITE);/这个不再注释了。 if(flag=1&hit!=1)/擦除原位置 mapoldx
16、oldy=Empty; SetPos(oldy+1)*2,oldx+1); cout; if(GameOver=1) return0; if(hit=1|Pos022|Pos122)/如果击中 ReleaseMutex(Mutex); Sleep(500); if(type=PlayerBullet) =1; elseif(type=EnemyBullet) =1; break; switch(mapPos0Pos1)/子弹经过的MAP的标记 如果是空位置就绘制子弹 mapPos0Pos1=type; SetPos(Pos1+1)*2,Pos0+1); SetConsoleTextAttrib
17、ute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_BLUE); cout; break; 如果是玩家位置 if(type!=PlayerBullet) ;/生命减少 if=0) GameOver=1; Updata(); hit=1; break; 如果是敌人位置 if(type!=PlayerBullet) hit=1; else hit=1; Kill+; if(Kill%20=0&5)/击杀数+ +; if=Red)/如果击杀红坦克 Kil
18、lRed+; if(KillRed%10=0&()5) (); if=Green)/如果击杀绿坦克 KillGreen+; if(KillGreen%10=0&()5) (); ();/擦除敌人 =0;/敌人死亡 Updata(); break; oldx=Pos0; oldy=Pos1; if(direction=Up)/子弹移动 Pos0-; elseif(direction=Down) Pos0+; elseif(direction=Left) Pos1-; elseif(direction=Right) Pos1+; ReleaseMutex(Mutex); flag=1; Sleep
19、(60-10*Speed); return0;/*敌人线程函数*/DWORDWINAPITankRuning(LPVOIDlpParameter) Sleep(400); intPos; intStart2;/敌人起始地址 inttyp; intfire; intspe; while(1) if(GameOver=1) return0; srand(int)time(0);/随机出敌人起始地址 Pos=rand()%4; if(Pos=0) Start0=2; Start0=2; elseif(Pos=1) Start0=2; Start1=18; elseif(Pos=2) Start0=1
20、8; Start1=2; elseif(Pos=3) Start0=18; Start1=18; if(Start0,Start1,Down)=0) break; WaitForSingleObject(Mutex,INFINITE); srand(int)time(0); typ=rand()%3+1;/随机出敌人的种类 if(typ=Blue) spe=1+level; fire=1+level; elseif(typ=Red) spe=1+level; fire=3+level; elseif(typ=Green) spe=3+level; fire=1+level; enemy=Tan
21、k(Down,Start0,Start1,typ,spe,fire);/重新生成敌人坦克 =Enemy; =1; =1; ReleaseMutex(Mutex); (); return0;voidInit()/初始化函数 Kill=0; KillRed=0; KillGreen=0; player=Tank(Left,0,0,Normal,1,1); enemy=Tank(Left,0,0,Red,1,1); =2; =1; =0; =1; =Player; =Enemy; EnemyExist=0;voidUpdata()/更新界面信息 SetConsoleTextAttribute(Get
22、StdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_BLUE); inti; SetPos(53,0); cout生命值:; SetPos(53,1); for(i=0;i5;i+) if(i cout; else cout; SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_GREEN); SetPos(53,3); cout移动速度:
23、; SetPos(53,4); for(i=0;i5;i+) if(i() cout; else cout; SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED); SetPos(53,5); cout火力:; SetPos(53,6); for(i=0;i5;i+) if(i() cout; else cout; SetPos(53,8); SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREG
24、ROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_BLUE); cout杀敌数:Kill; SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED); SetPos(53,9); cout杀死红坦克:KillRed; SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_GREEN
25、); SetPos(53,10); cout杀死绿坦克:KillGreen;voidDrawMap()/画界面 SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_BLUE); system(cls); inti; for(i=0;i25;i+) SetPos(i*2,0); cout; for(i=1;i25;i+) SetPos(0,i); cout; SetPos(24*2,i); cout; for(i=0;i25;i+) SetPos(i*2,24); cout; Updata();voidWelcome()/欢迎界面 intx; system(cls); SetConsoleTextAttribute(
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1