![C++大作業(yè)坦克大戰(zhàn)_第1頁](http://file3.renrendoc.com/fileroot_temp3/2022-3/9/0a3075cc-e15d-42cc-afe7-b2a00dd24441/0a3075cc-e15d-42cc-afe7-b2a00dd244411.gif)
![C++大作業(yè)坦克大戰(zhàn)_第2頁](http://file3.renrendoc.com/fileroot_temp3/2022-3/9/0a3075cc-e15d-42cc-afe7-b2a00dd24441/0a3075cc-e15d-42cc-afe7-b2a00dd244412.gif)
![C++大作業(yè)坦克大戰(zhàn)_第3頁](http://file3.renrendoc.com/fileroot_temp3/2022-3/9/0a3075cc-e15d-42cc-afe7-b2a00dd24441/0a3075cc-e15d-42cc-afe7-b2a00dd244413.gif)
![C++大作業(yè)坦克大戰(zhàn)_第4頁](http://file3.renrendoc.com/fileroot_temp3/2022-3/9/0a3075cc-e15d-42cc-afe7-b2a00dd24441/0a3075cc-e15d-42cc-afe7-b2a00dd244414.gif)
![C++大作業(yè)坦克大戰(zhàn)_第5頁](http://file3.renrendoc.com/fileroot_temp3/2022-3/9/0a3075cc-e15d-42cc-afe7-b2a00dd24441/0a3075cc-e15d-42cc-afe7-b2a00dd244415.gif)
版權(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度酒店客房智能化改造合同范本
- 2025年度新型城鎮(zhèn)化建筑工程合作意向書
- 2025年度網(wǎng)絡(luò)安全風(fēng)險(xiǎn)評(píng)估服務(wù)合同補(bǔ)充協(xié)議范本
- 2025年度房地產(chǎn)項(xiàng)目墊資合同范本(新版)
- 2025年中國(guó)乳酸依沙吖啶溶液行業(yè)市場(chǎng)發(fā)展現(xiàn)狀及投資策略咨詢報(bào)告
- 2025年度高新技術(shù)企業(yè)研發(fā)人員勞動(dòng)合同
- 2025年度智慧城市建設(shè)項(xiàng)目造價(jià)咨詢及監(jiān)理合同范本
- 2025年城市公園環(huán)境衛(wèi)生管理與承包服務(wù)協(xié)議
- 2025年度公司內(nèi)部員工借款續(xù)借合同范本
- 2025年度智慧農(nóng)業(yè)技術(shù)入股合同模板
- 2025年度有限責(zé)任公司拆伙協(xié)議書范本4篇
- 七年級(jí)數(shù)學(xué)新北師大版(2024)下冊(cè)第一章《整式的乘除》單元檢測(cè)習(xí)題(含簡(jiǎn)單答案)
- 2024年財(cái)政部會(huì)計(jì)法律法規(guī)答題活動(dòng)題目及答案一
- 定向鉆出入土點(diǎn)平面布置圖(可編輯)
- 高考日語基礎(chǔ)歸納總結(jié)與練習(xí)(一輪復(fù)習(xí))
- 居民自建房經(jīng)營(yíng)業(yè)態(tài)不超過三種承諾書
- 河南省陜州區(qū)王家后鄉(xiāng)滹沱鋁土礦礦產(chǎn)資源開采與生態(tài)修復(fù)方案
- 中國(guó)高血壓臨床實(shí)踐指南(2022版)解讀
- 最常用漢字5000個(gè)
- 《了凡四訓(xùn)》課件
- 醫(yī)院住院病人健康教育表
評(píng)論
0/150
提交評(píng)論