




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、#include<iostream>#include<stdlib.h>#include<windows.h>#include<time.h>#include<conio.h>using namespace std;HANDLE Mutex=CreateMutex(NULL,FALSE,NULL);/互斥對象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;/活動點(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()/獲取活動點(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)/改變活動點(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ù)組相對于點(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);/線程擁有互斥對象FireEnable=0;/設(shè)為不可開火HANDLE bullet=CreateThread(NULL,0,Bulletfly,&ID,0,NULL);/創(chuàng)建子彈線程CloseHandle(bullet);ReleaseMutex(Mutex);/釋放互斥對象Sleep(100);WaitForSingleObject(Mutex,INFINITE);/線程擁有互斥對象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);/釋放互斥對象Sleep(500-80*Speed);/*子彈線程函數(shù)*/DWORD WINAPI Bulletfly(LPVOID lpParameter)int *ID=(int *)lpParameter;/ID用來獲取發(fā)射子彈坦克的IDint Pos2;/子彈活動點(diǎn)int direction;int Speed;int type;int hit=0;/擊中標(biāo)記int oldx,oldy;/舊活動點(diǎn)int flag=0;/子彈是否有移動的標(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)/子彈移動 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<<"移動速度:"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)控制臺版 "SetPos(10,7);cout<<""SetPos(10,8);cout<<" 方向鍵移動,空格鍵射擊 "SetPos(10,9);cout<<" 敵人分為3種,藍(lán)色為普通敵人 &
31、quot;SetPos(10,10);cout<<" 紅色敵人高射速,綠色敵人高機(jī)動性 "SetPos(10,11);cout<<" 每殺死10個(gè)紅坦克,玩家射速提高(最高五級) "SetPos(10,12);cout<<" 每殺死10個(gè)綠坦克,玩家移動性提高(最高五級)"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)/移動玩家坦克,原理和敵人函數(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等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 韓語五級試題及答案
- 物業(yè)案場培訓(xùn)
- 木牘教育數(shù)學(xué)課程體系
- 血透室肌肉痙攣?zhàn)o(hù)理查房
- 腦血管病變病人的護(hù)理
- 2025年中國母乳喂養(yǎng)乳頭罩行業(yè)市場全景分析及前景機(jī)遇研判報(bào)告
- 會計(jì)總賬業(yè)務(wù)流程規(guī)范
- 餐飲企業(yè)租賃及品牌輸出服務(wù)合同
- 航空公司新員工入職培訓(xùn)
- 車輛無償租賃與品牌形象展示協(xié)議
- 疑難病例討論課件
- 部編本小學(xué)語文六年級下冊畢業(yè)總復(fù)習(xí)教案
- JB∕T 11864-2014 長期堵轉(zhuǎn)力矩電動機(jī)式電纜卷筒
- 小兒氨酚黃那敏顆粒的藥動學(xué)研究
- 生態(tài)環(huán)境行政處罰自由裁量基準(zhǔn)
- 長沙市開福區(qū)2024屆六年級下學(xué)期小升初數(shù)學(xué)試卷含解析
- 2024年安徽普通高中學(xué)業(yè)水平選擇性考試化學(xué)試題及答案
- DZ/T 0462.3-2023 礦產(chǎn)資源“三率”指標(biāo)要求 第3部分:鐵、錳、鉻、釩、鈦(正式版)
- 2024年昆明巫家壩建設(shè)發(fā)展有限責(zé)任公司招聘筆試沖刺題(帶答案解析)
- 《取水許可核驗(yàn)報(bào)告編制導(dǎo)則(試行)(征求意見稿)》
- 2023年國開(中央電大)04114《會計(jì)學(xué)概論》題庫及標(biāo)準(zhǔn)答案
評論
0/150
提交評論