C++大作業(yè)坦克大戰(zhàn)_第1頁
C++大作業(yè)坦克大戰(zhàn)_第2頁
C++大作業(yè)坦克大戰(zhàn)_第3頁
C++大作業(yè)坦克大戰(zhàn)_第4頁
C++大作業(yè)坦克大戰(zhàn)_第5頁
已閱讀5頁,還剩12頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、#include<iostream>#include<stdlib.h>#include<windows.h>#include<time.h>#include<conio.h>using namespace std;HANDLE Mutex=CreateMutex(NULL,FALSE,NULL);/互斥對(duì)象int GameOver=0;int level=0;int map2323;/坦克種類,Normal為玩家坦克#define Normal 0#define Red 1#define Blue 2#define Green 3/

2、方向的宏定義#define Up 0#define Down 1#define Left 2#define Right 3/地圖標(biāo)記的宏定義#define Empty 0#define Player 1#define PlayerBullet 2#define EnemyBullet 3#define Enemy 4int Kill;int KillRed;int KillGreen;int EnemyExist;void SetPos(int i,int j)/設(shè)定光標(biāo)位置COORD pos=i,j;HANDLE Out=GetStdHandle(STD_OUTPUT_HANDLE); Se

3、tConsoleCursorPosition(Out, pos);void HideCurSor(void)/隱藏光標(biāo)CONSOLE_CURSOR_INFO info=1,0;HANDLE Out=GetStdHandle(STD_OUTPUT_HANDLE);SetConsoleCursorInfo(Out,&info);int sharp412=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,;/此數(shù)組用來保存坦克各個(gè)方向的形狀信息DWOR

4、D WINAPI Bulletfly(LPVOID lpParameter);/子彈函數(shù)申明void Updata();/更新界面信息函數(shù)申明class Tank/坦克類private:int Direction;/方向int hotpoint2;/活動(dòng)點(diǎn)int Speed;/速度int FirePower;/火力public:Tank(int dir,int hot1,int hot2,int typ,int spe,int firepow)/構(gòu)造函數(shù)Direction=dir;hotpoint0=hot1;hotpoint1=hot2;Type=typ;Speed=spe;FirePowe

5、r=firepow;int Type;/坦克的種類(詳見宏定義)int ID;/坦克在MAP中的標(biāo)記(詳見宏定義)int FireEnable;/是否可以開火int Life;/生命值void Running();/運(yùn)行函數(shù)int Judge(int x,int y,int ID);/判斷是否可以繪制坦克void DrawTank();/重繪坦克void Redraw();/擦除坦克int GetSpeed()/獲取速度return Speed;int GetFire()/獲取火力return FirePower;int GetDirection()/獲取方向return Direction;

6、int GetHotX()/獲取活動(dòng)點(diǎn)坐標(biāo)return hotpoint0;int GetHotY()return hotpoint1;void IncreaseFire()/火力+FirePower+;void IncreaseSpeed()/速度+Speed+;void ChangeDirection(int newD)/改變方向Direction=newD;void ChangePos(int x,int y)/改變活動(dòng)點(diǎn)hotpoint0=x;hotpoint1=y;Tank player(Right,0,0,Normal,1,1);/玩家Tank enemy(Left,20,0,Re

7、d,1,1);/敵人void Tank:DrawTank()/繪制坦克 int i; int nx,ny; if(Type=Red)SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY| FOREGROUND_RED);else if(Type=Blue)SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY| FOREGROUND_BLUE);else if(Type=Green)SetConso

8、leTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY| FOREGROUND_GREEN);else if(Type=Normal)SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY| FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE); for(i=0;i<6;i+) nx=hotpoint0+sharpDirectioni*2;ny=hotpoin

9、t1+sharpDirectioni*2+1;SetPos(ny+1)*2,nx+1);/利用sharp數(shù)組相對(duì)于點(diǎn)x,y繪制形狀mapnxny=ID;cout<<""void Tank:Redraw()/擦除坦克,原理同上 int i; int nx,ny; for(i=0;i<6;i+) nx=hotpoint0+sharpDirectioni*2;ny=hotpoint1+sharpDirectioni*2+1;mapnxny=Empty;SetPos(ny+1)*2,nx+1);cout<<" "int Tank:J

10、udge(int x,int y,int dir)/判斷當(dāng)前是否可以繪制坦克int i;int nx,ny;for(i=0;i<6;i+) nx=x+sharpdiri*2;ny=y+sharpdiri*2+1;if(nx<0|nx>=23|ny<0|ny>=23|mapnxny!=Empty)/不能繪制,返回1return 1;return 0;void Tank:Running()/坦克運(yùn)行函數(shù)int newD;/坦克的運(yùn)行while(1)if(Life=0)EnemyExist=0;/敵人不存在return;if(GameOver=1)return;if(F

11、ireEnable=1&&GameOver=0)/如果可以開火WaitForSingleObject(Mutex,INFINITE);/線程擁有互斥對(duì)象FireEnable=0;/設(shè)為不可開火HANDLE bullet=CreateThread(NULL,0,Bulletfly,&ID,0,NULL);/創(chuàng)建子彈線程CloseHandle(bullet);ReleaseMutex(Mutex);/釋放互斥對(duì)象Sleep(100);WaitForSingleObject(Mutex,INFINITE);/線程擁有互斥對(duì)象srand(int)time(0); newD=ra

12、nd()%4;if(newD=Up)/隨機(jī)出新的方向并重新繪制坦克Redraw();if(Judge(hotpoint0-1,hotpoint1,newD)=0)hotpoint0-;Direction=newD;elseif(Judge(hotpoint0,hotpoint1,newD)=0)Direction=newD; else if(newD=Down)Redraw();if(Judge(hotpoint0+1,hotpoint1,newD)=0)hotpoint0+;Direction=newD;elseif(Judge(hotpoint0,hotpoint1,newD)=0)Dir

13、ection=newD; else if(newD=Left)Redraw();if(Judge(hotpoint0,hotpoint1-1,newD)=0)hotpoint1-;Direction=newD;elseif(Judge(hotpoint0,hotpoint1,newD)=0)Direction=newD; else if(newD=Right)Redraw();if(Judge(hotpoint0,hotpoint1+1,newD)=0)hotpoint1+;Direction=newD;elseif(Judge(hotpoint0,hotpoint1,newD)=0)Dire

14、ction=newD; if(GameOver=0&&Life!=0) DrawTank();ReleaseMutex(Mutex);/釋放互斥對(duì)象Sleep(500-80*Speed);/*子彈線程函數(shù)*/DWORD WINAPI Bulletfly(LPVOID lpParameter)int *ID=(int *)lpParameter;/ID用來獲取發(fā)射子彈坦克的IDint Pos2;/子彈活動(dòng)點(diǎn)int direction;int Speed;int type;int hit=0;/擊中標(biāo)記int oldx,oldy;/舊活動(dòng)點(diǎn)int flag=0;/子彈是否有移動(dòng)的標(biāo)

15、記if(*ID=Player)/如果是玩家坦克type=PlayerBullet;direction=player.GetDirection();Speed=player.GetFire();Pos0=player.GetHotX();Pos1=player.GetHotY(); else if(*ID=Enemy)/如果是敵人坦克type=EnemyBullet;direction=enemy.GetDirection();Speed=enemy.GetFire();Pos0=enemy.GetHotX();Pos1=enemy.GetHotY();if(direction=Up)/根據(jù)坦克

16、的位置和方向確定子彈的初始坐標(biāo)Pos0-;Pos1+;else if(direction=Down)Pos0+=3;Pos1+;else if(direction=Left)Pos0+;Pos1-;else if(direction=Right)Pos0+;Pos1+=3;/子彈的運(yùn)行while(1)WaitForSingleObject(Mutex,INFINITE);/這個(gè)不再注釋了。if(flag=1&&hit!=1)/擦除原位置 mapoldxoldy=Empty; SetPos(oldy+1)*2,oldx+1); cout<<" "i

17、f(GameOver=1)return 0;if(hit=1|Pos0<0|Pos0>22|Pos1<0|Pos1>22)/如果擊中ReleaseMutex(Mutex);Sleep(500);if(type=PlayerBullet)player.FireEnable=1;else if(type=EnemyBullet)enemy.FireEnable=1;break;switch(mapPos0Pos1)/子彈經(jīng)過的MAP的標(biāo)記 case Empty:/如果是空位置就繪制子彈 mapPos0Pos1=type;SetPos(Pos1+1)*2,Pos0+1);Se

18、tConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY| FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);cout<<"" break; case Player:/如果是玩家位置 if(type!=PlayerBullet) player.Life-;/生命減少 if(player.Life<=0) GameOver=1; Updata(); hit=1; break; case Enemy:/如果是敵人位

19、置 if(type!=PlayerBullet)hit=1;elsehit=1;Kill+;if(Kill%20=0&&player.Life<5)/擊殺數(shù)+player.Life+;if(enemy.Type=Red)/如果擊殺紅坦克KillRed+;if(KillRed%10=0&&player.GetFire()<5)player.IncreaseFire();if(enemy.Type=Green)/如果擊殺綠坦克KillGreen+;if(KillGreen%10=0&&player.GetSpeed()<5)play

20、er.IncreaseSpeed();enemy.Redraw();/擦除敵人enemy.Life=0;/敵人死亡Updata(); break;oldx=Pos0;oldy=Pos1;if(direction=Up)/子彈移動(dòng) Pos0-; else if(direction=Down) Pos0+; else if(direction=Left) Pos1-; else if(direction=Right) Pos1+; ReleaseMutex(Mutex); flag=1; Sleep(60-10*Speed); return 0;/*敵人線程函數(shù)*/DWORD WINAPI Tan

21、kRuning(LPVOID lpParameter)Sleep(400);int Pos;int Start2;/敵人起始地址int typ;int fire;int spe;while(1)if(GameOver=1)return 0; srand(int)time(0);/隨機(jī)出敵人起始地址 Pos=rand()%4; if(Pos=0) Start0=2; Start0=2; else if(Pos=1) Start0=2; Start1=18; else if(Pos=2) Start0=18; Start1=2; else if(Pos=3) Start0=18; Start1=1

22、8; if(player.Judge(Start0,Start1,Down)=0) break;WaitForSingleObject(Mutex,INFINITE);srand(int)time(0);typ=rand()%3+1;/隨機(jī)出敵人的種類if(typ=Blue)spe=1+level;fire=1+level;else if(typ=Red)spe=1+level;fire=3+level;else if(typ=Green)spe=3+level;fire=1+level; enemy=Tank(Down,Start0,Start1,typ,spe,fire);/重新生成敵人坦

23、克enemy.ID=Enemy;enemy.Life=1;enemy.FireEnable=1;ReleaseMutex(Mutex);enemy.Running();return 0;void Init()/初始化函數(shù)Kill=0;KillRed=0;KillGreen=0;player=Tank(Left,0,0,Normal,1,1);enemy=Tank(Left,0,0,Red,1,1);player.Life=2;player.FireEnable=1;enemy.Life=0;enemy.FireEnable=1;player.ID=Player;enemy.ID=Enemy;E

24、nemyExist=0;void Updata()/更新界面信息SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY| FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);int i;SetPos(53,0);cout<<"生命值:"SetPos(53,1);for(i=0;i<5;i+)if(i<player.Life)cout<<""elsecout<<

25、;" "SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY| FOREGROUND_GREEN);SetPos(53,3);cout<<"移動(dòng)速度:"SetPos(53,4);for(i=0;i<5;i+)if(i<player.GetSpeed()cout<<""elsecout<<" "SetConsoleTextAttribute(GetStdHandle(ST

26、D_OUTPUT_HANDLE),FOREGROUND_INTENSITY| FOREGROUND_RED);SetPos(53,5);cout<<"火力:"SetPos(53,6);for(i=0;i<5;i+)if(i<player.GetFire()cout<<""elsecout<<" " SetPos(53,8);SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY| FOREG

27、ROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);cout<<"殺敵數(shù):"<<Kill;SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY| FOREGROUND_RED);SetPos(53,9);cout<<"殺死紅坦克:"<<KillRed;SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FO

28、REGROUND_INTENSITY| FOREGROUND_GREEN);SetPos(53,10);cout<<"殺死綠坦克:"<<KillGreen;void DrawMap()/畫界面SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY| FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);system("cls");int i;for(i=0;i<25;i+) S

29、etPos(i*2,0); cout<<""for(i=1;i<25;i+)SetPos(0,i);cout<<""SetPos(24*2,i);cout<<""for(i=0;i<25;i+) SetPos(i*2,24); cout<<""Updata();void Welcome()/歡迎界面int x;system("cls");SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HA

30、NDLE),FOREGROUND_INTENSITY| FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);SetPos(10,5);cout<<""SetPos(10,6);cout<<" 坦克大戰(zhàn)控制臺(tái)版 "SetPos(10,7);cout<<""SetPos(10,8);cout<<" 方向鍵移動(dòng),空格鍵射擊 "SetPos(10,9);cout<<" 敵人分為3種,藍(lán)色為普通敵人 &

31、quot;SetPos(10,10);cout<<" 紅色敵人高射速,綠色敵人高機(jī)動(dòng)性 "SetPos(10,11);cout<<" 每殺死10個(gè)紅坦克,玩家射速提高(最高五級(jí)) "SetPos(10,12);cout<<" 每殺死10個(gè)綠坦克,玩家移動(dòng)性提高(最高五級(jí))"SetPos(10,13);cout<<" 每殺死20個(gè)坦克,玩家生命+1(最高五格) "SetPos(10,14);cout<<""SetPos(10,15);co

32、ut<<" 何某作(百度ID:HapHapYear) "SetPos(10,16);cout<<" 按1-3選擇難度 "SetPos(10,17);cout<<""while(1)x=getch();if(x<='3'&&x>='1')break;level=x-'0'-1;int main()Init();HideCurSor();Welcome();DrawMap();HANDLE temp;int newD;playe

33、r.DrawTank();while(GameOver=0)if(GetAsyncKeyState(VK_UP)/按鍵上WaitForSingleObject(Mutex,INFINITE);newD=Up;player.Redraw();if(player.Judge(player.GetHotX()-1,player.GetHotY(),newD)=0)/移動(dòng)玩家坦克,原理和敵人函數(shù)一樣player.ChangePos(player.GetHotX()-1,player.GetHotY();player.ChangeDirection(newD);elseif(player.Judge(p

34、layer.GetHotX(),player.GetHotY(),newD)=0)player.ChangeDirection(newD); if(GameOver=0) player.DrawTank();ReleaseMutex(Mutex);Sleep(200-player.GetSpeed()*20);/按鍵延遲,決定玩家坦克的速度else if(GetAsyncKeyState(VK_DOWN)/按鍵下,同上WaitForSingleObject(Mutex,INFINITE);newD=Down;player.Redraw();if(player.Judge(player.GetH

35、otX()+1,player.GetHotY(),newD)=0)player.ChangePos(player.GetHotX()+1,player.GetHotY();player.ChangeDirection(newD);elseif(player.Judge(player.GetHotX(),player.GetHotY(),newD)=0)player.ChangeDirection(newD); if(GameOver=0) player.DrawTank();ReleaseMutex(Mutex);Sleep(200-player.GetSpeed()*20);else if(

36、GetAsyncKeyState(VK_RIGHT)/按鍵右,同上WaitForSingleObject(Mutex,INFINITE);newD=Right;player.Redraw();if(player.Judge(player.GetHotX(),player.GetHotY()+1,newD)=0)player.ChangePos(player.GetHotX(),player.GetHotY()+1);player.ChangeDirection(newD);elseif(player.Judge(player.GetHotX(),player.GetHotY(),newD)=0)player.ChangeDirection(newD); if(GameOver=0) player.DrawTank();ReleaseMutex(Mutex);Sleep(200-player.GetSpeed()*20);else if(GetAsyncKeySt

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論