c++ 飛機大戰控制檯遊戲
阿新 • • 發佈:2018-12-10
之所以寫這個遊戲,是
#include<iostream> #include<cstring> #include<windows.h> #include<cmath> #include<time.h> #include<conio.h> #include<stdio.h> #include<stdlib.h> #define WM_MYMSG WM_USER+100 using namespace std; const char space=' '; const int TOP=15; const int LEFT=50; char arr[TOP][LEFT]; //地圖 int gwArrTop[TOP]; //怪物縱座標 int gwArrLeft[TOP]; //怪物的橫座標 int gwTot; //怪物數 int fjTOP; //飛機的縱座標 int fjLeft; //飛機的橫座標 int Score=0; //得分 int Life=20;//生命 extern "C" { WINBASEAPI HWND WINAPI GetConsoleWindow(); } int sjs(int x,int y){ //返回[x,y]的隨機數 return rand()%(y-x+1)+x; } void print(){ //列印地圖 gwTot=0;//怪物統計 int gw_i=0,gw_j=0; for(int i=0;i<TOP+2;i++){ for(int j=0;j<LEFT+1;j++){ //邊界 if(i==TOP||j==LEFT){ cout<<'-'; continue; } if(j==LEFT){ cout<<'-'; continue; } if(i==TOP+1){ cout<<"得分:"<<Score<<"\t"<<"剩餘生命值:"<<Life; break; } //邊界 //計算 if(arr[i][j]=='*'){ // arr[t][l] if(arr[i+1][j]=='1') Life--; }else if(arr[i][j]=='O'){ //右斜線 if(arr[i+1][j+1]=='1') Life--; }else if(arr[i][j]=='0'){ if(arr[i+1][j-1]=='1') Life--; }else if(arr[i][j]=='Y'){ if(arr[i+1][j]=='1'||arr[i+1][j+1]=='1'||arr[i+1][j-1]=='1'){ Life--; } }else if(arr[i][j]=='N'){ //擊中怪物 if(arr[i-1][i]=='Y'){ Score++; arr[i-1][j]=space; gwTot--; } } cout<<arr[i][j]; if(arr[i][j]=='Y'){ gwArrTop[gw_i++]=i; //怪物座標 gwArrLeft[gw_j++]=j; gwTot++; } } cout<<endl; } } void FJ(){ //飛機座標初始化 int FJ_TOP=14; int FJ_LEFT=24; fjTOP=FJ_TOP; fjLeft=FJ_LEFT; arr[FJ_TOP][FJ_LEFT]='1'; arr[FJ_TOP-1][FJ_LEFT]='1'; arr[FJ_TOP][FJ_LEFT+1]='1'; arr[FJ_TOP][FJ_LEFT-1]='1'; } void GW(){ //隨機怪物初始化 int tot=sjs(1,2); //隨機一到三個怪物 int gwTOP; int gwLEFT; gwTot=tot; for(int i=0;i<tot;i++){ gwTOP=sjs(0,4); gwLEFT=sjs(0,48); gwArrTop[i]=gwTOP; gwArrLeft[i]=gwLEFT; arr[gwTOP][gwLEFT]='Y'; } } int gwAct(){ //怪物隨機動 for(int i=0;i<gwTot;i++){ int t1=gwArrTop[i]; //TOP int l1=gwArrLeft[i]; //Left arr[t1][l1]=space; int t=sjs(1,3); switch(t){ case 1: if(t1<TOP-1){ t1+=1;} break; case 2: if(l1<LEFT-1){ l1+=1; } break; case 3: if(l1>0){ l1-=1; } break; } gwArrTop[i]=t1; gwArrLeft[i]=l1; arr[t1][l1]='Y'; //怪物移動到邊界的處理 if(t1==TOP-1||l1==0||l1==LEFT-1){ arr[t1][l1]=space; } } } int input(){ int ch; ch=getch(); switch(ch) { case 72: arr[fjTOP][fjLeft]=space; arr[fjTOP-1][fjLeft]=space; arr[fjTOP][fjLeft-1]=space; arr[fjTOP][fjLeft+1]=space; fjTOP-=1; arr[fjTOP][fjLeft]='1'; arr[fjTOP-1][fjLeft]='1'; arr[fjTOP][fjLeft-1]='1'; arr[fjTOP][fjLeft+1]='1'; break;//上 case 80: arr[fjTOP][fjLeft]=space; arr[fjTOP-1][fjLeft]=space; arr[fjTOP][fjLeft-1]=space; arr[fjTOP][fjLeft+1]=space; fjTOP+=1; arr[fjTOP][fjLeft]='1'; arr[fjTOP-1][fjLeft]='1'; arr[fjTOP][fjLeft-1]='1'; arr[fjTOP][fjLeft+1]='1'; break;//下 case 75: arr[fjTOP][fjLeft]=space; arr[fjTOP-1][fjLeft]=space; arr[fjTOP][fjLeft-1]=space; arr[fjTOP][fjLeft+1]=space; fjLeft-=1; arr[fjTOP][fjLeft]='1'; arr[fjTOP-1][fjLeft]='1'; arr[fjTOP][fjLeft-1]='1'; arr[fjTOP][fjLeft+1]='1'; break;//左 case 77: arr[fjTOP][fjLeft]=space; arr[fjTOP-1][fjLeft]=space; arr[fjTOP][fjLeft-1]=space; arr[fjTOP][fjLeft+1]=space; fjLeft+=1; arr[fjTOP][fjLeft]='1'; arr[fjTOP-1][fjLeft]='1'; arr[fjTOP][fjLeft-1]='1'; arr[fjTOP][fjLeft+1]='1'; break;//右 case 13: arr[fjTOP-2][fjLeft]='N'; break;//enter 飛機子彈 default: return 0; } return 1; } void sczd(){ //生成子彈 for(int i=0;i<gwTot;i++){ int t1=gwArrTop[i]; //TOP int l1=gwArrLeft[i]; //Left arr[t1+1][l1]='*'; //直線 arr[t1+1][l1+1]='O'; //右斜線 arr[t1+1][l1-1]='0'; //左斜線 } } void zddel(){ //子彈處理 for(int i=TOP-1;i>=0;i--){ for(int j=LEFT-1;j>=0;j--){ if(arr[i][j]=='*'){ //怪物直線子彈 if(i<TOP-1&&j>0&&j<LEFT-1){ arr[i][j]=space; arr[i+1][j]='*'; }else{ //子彈消失 arr[i][j]=space; } }else if(arr[i][j]=='O'){ //右斜線子彈 if(i<TOP-1&&j<LEFT-1){ arr[i][j]=space; arr[i+1][j+1]='O'; }else{ //子彈消失 arr[i][j]=space; } }else if(arr[i][j]=='0') //左斜線子彈 { if(i<TOP-1&&j>0){ arr[i][j]=space; arr[i+1][j-1]='0'; }else{ //子彈消失 arr[i][j]=space; } } } } for(int i=0;i<TOP;i++){ for(int j=0;j<LEFT;j++){ if(arr[i][j]=='N'){ //飛機子彈 if(i>1&&j>1&&j<LEFT-2){ arr[i][j]=space; arr[i-1][j]='N'; }else{ //子彈消失 arr[i][j]=space; } } } } } //多執行緒 DWORD WINAPI func3(LPVOID LpParameter) //怪物、子彈生成 { while(1) { gwAct();//怪物隨機動 zddel();//子彈處理 Sleep(600); //怪物、子彈速度控制 } return 0; } DWORD WINAPI func2(LPVOID LpParameter) //捕捉鍵盤 { DWORD id = *(int*)LpParameter; while(1) { int ap=0; ap=input(); if(ap==1) //按鍵 { PostThreadMessage(id, WM_MYMSG, 0, 0); } //Sleep(1); } return 0; } DWORD WINAPI func1(LPVOID LpParameter) //怪物、子彈生成 { MSG msg; HWND hwnd = GetConsoleWindow(); while(1) { GetMessage(&msg,NULL,0,0); if (msg.message == WM_MYMSG) //按鍵 新增怪物子彈 { sczd(); //生成子彈 if(gwTot<=0){ GW(); } } Sleep(3000); } return 0; } //多執行緒 int contrl(){ DWORD id; HANDLE hthrd1 = CreateThread(NULL, 0, func1, NULL, 0, &id); HANDLE hthrd2 = CreateThread(NULL, 0, func2, &id, 0, 0); HANDLE hthrd3 = CreateThread(NULL, 0, func3, NULL, 0, 0); while(1){ system("cls");//清空螢幕 print();//列印地圖 if(Life==0){ break; } Sleep(100); //速度控制 } } int main(){ memset(arr,space,sizeof(arr)); //地圖初始化 FJ();//飛機座標初始化 GW(); //隨機怪物初始化 sczd();//生成子彈 contrl();//總體控制 system("cls");//清空螢幕 cout<<"遊戲結束!得分:"<<Score<<endl; Sleep(6000); return 0; }