C++實現彩色飛機大戰
阿新 • • 發佈:2020-10-30
本文例項為大家分享了C++實現彩色飛機大戰的具體程式碼,供大家參考,具體內容如下
1.基本的能夠實現鍵盤按上下左右進行控制飛機,擊殺敵人飛機,記錄得分,(缺點:死亡後不能從新玩,需要重新啟動程式,),缺點將在2中解決
/*隱藏游標的程式碼 #include <stdio.h> #include <windows.h> int main() { HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE); CONSOLE_CURSOR_INFO CursorInfo; GetConsoleCursorInfo(handle,&CursorInfo);//獲取控制檯游標資訊 CursorInfo.bVisible = false; //隱藏控制檯游標 SetConsoleCursorInfo(handle,&CursorInfo);//設定控制檯游標狀態 getchar(); }*/ /* 明白兩個事實, 敵人飛機和自己的飛機的橫座標和縱座標相同時 表示死亡 敵人飛機和自己的子彈碰撞即 子彈座標和自己子彈的座標相同時,飛機死亡並且加分, */ #include "stdio.h" #include <windows.h> #include <conio.h> #include <time.h> #define Esc 27 //退出 #define Up 72 //上,下,左,右 #define Down 80 #define Left 75 #define Right 77 #define Kong 32 //發射子彈 int x = 10; //飛機座標 int y = 18; int d2 = 10;//敵機座標 int d1 = 10; int d = 10;//d 和r 用來進行碰撞檢測 int r = 1; int r1 = 1; int r2 = 1; int t = 1; // 遊戲結束 int f = 0; // 計分數 int m = 5; // 敵機數 int j = 0; // 殲敵數 char p; // 接受按鍵 void kongzhi(int bx,int by);//宣告函式 void huatu(); void gotoxy(int x,int y) //移動座標 { COORD coord; coord.X = x; coord.Y = y; SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),coord); SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),3); } void gotoxy_red(int x,4); } void gotoxy_blue(int x,1); } void gotoxy_green(int x,2); } void hidden()//隱藏游標,不讓游標顯示 { HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE); CONSOLE_CURSOR_INFO cci; GetConsoleCursorInfo(hOut,&cci); cci.bVisible = 0;//賦1為顯示,賦0為隱藏 SetConsoleCursorInfo(hOut,&cci); } //************************************************************************************** //說明 void shuoming() { printf("\t\t\t\n\n\n\n"); gotoxy_blue(0,0); printf("\t\t\t\t\t\t\tPlane Control\n\n" "\t\t\t\t\t\t\t\tUP\n\n" "\t\t\t\t\t\t\tDown\n\n" "\t\t\t\t\t\t\tLeft \n\n" "\t\t\t\t\t\t\tRight \n\n" "\t\t\t\t\t\t\t bullet space\n\n\n" "\t\t\t\t\t\t\tQuit Esc\n"); gotoxy_red(0,0); } //**************************************************************************************** //判斷我機死沒死/遊戲結束 void byebye() { if (((x == d && y == r) || (x == d1 && y == r1) || (x == d2 && y == r2))||( (d>=19||r>=19)||(d1>=19||r1>=19)||(d1>=19||r1>=19) )) { gotoxy(1,3); printf(" !!! 遊戲結束 !!!\n" "*******************\n" " 您的總得分: %d\n\n" " 敵機數: %d\n" " 殲敵數: %d\n" " 命中率: %.0f %%\n" "*******************\n",f,m,j,((float)j / (float)m) * 100); while (!_kbhit()) { Sleep(500); gotoxy(1,12); printf(" 繼續請按任意鍵...\n\n\n"); Sleep(900); gotoxy(1,12); printf(" "); } gotoxy_red(0,0); huatu(); f = 0; m = 0; j = 0; if (x >= 18) x--; else x++; gotoxy(x,y); printf("A"); } } // 計分/更新敵機 void jifan() { //x,y是子彈的座標 if (x == d && y == r) // d=10,r=1, d,d1,d2 是敵機的x軸,為10 ,r為敵機的縱座標 { gotoxy(d,r); printf("3"); Sleep(200); gotoxy(d,r); printf(" "); f += 2; r = 0; j++;//讓r=0,即是讓敵人的飛機消失 } if (x == d1 && y == r1) { gotoxy(d1,r1); printf("1"); Sleep(200); gotoxy(d1,r1); printf(" "); f += 3; r1 = 0; j++; } if (x == d2 && y == r2) { gotoxy(d2,r2); printf("0"); Sleep(200); gotoxy(d2,r2); printf(" "); f += 1; r2 = 0; j++; } gotoxy(57,2); printf("%d\n",f); } //畫圖 void huatu() { int i,n; for (i = 0; i <= 20; i++) { for (n = 0; n <= 20; n++) { printf("*"); } printf("\n"); } for (i = 1; i <= 19; i++) { for (n = 1; n <= 19; n++) { gotoxy_red(i,n); printf(" "); } } } //隨機產生敵機 void dfeiji() { while (t) { if (!r) { d = rand() % 17 + 1; m++; } //r,r1,r2 初始值都為1,當變為0的時候開始產生隨機數 if (!r1) { d1 = rand() % 17 + 1; m++; } if (!r2) { d2 = rand() % 17 + 1; m++; } while (t) { r=r+2; r1=r1+2; r2=r2+2; gotoxy(d,r); printf("b");//d,d1,d2 為敵機產生的位置,都為10 gotoxy(d1,r1); printf("c"); gotoxy(d2,r2); printf("d"); Sleep(900); gotoxy(d,r); printf(" "); gotoxy(d1,r1); printf(" "); gotoxy(d2,r2); printf(" "); kongzhi(0,0);//控制飛機後,要立即進行判斷 byebye();//判斷飛機有沒有死亡 if (r == 19) r = 0; if (r1 == 19) r1 = 0; if (r2 == 19) r2 = 0; if (r == 0 || r1 == 0 || r2 == 0) break; } } } //操控飛機 void kongzhi(int bx,int by)//呼叫的時候傳入了 0, 0 { int a; while (_kbhit()) { if ((p = _getch()) == -32) p = _getch(); a = p; gotoxy(22,5); switch (a) {//控制方向 case Up:if (y != 1) { gotoxy(x,y); printf(" "); y--; gotoxy(x,y); printf("A"); }break; case Down:if (y != 18) { gotoxy(x,y); printf(" "); y++; gotoxy(x,y); printf("A"); }break; case Left:if (x != 1) { gotoxy(x,y); printf(" "); x--; gotoxy(x,y); printf("A"); }break; case Right:if (x != 18) { gotoxy(x,y); printf(" "); x++; gotoxy(x,y); printf("A"); }break; case Kong: { bx = y;//先把y的值存起來,存到bx for (by = y; by > 1;) //發射子彈,y軸座標一直減減,列印 | { by--;//y的座標 gotoxy(x,by); printf("|"); Sleep(10); gotoxy(x,by); printf(" "); y = by;//記錄子彈打到哪了,好進行碰撞檢測 jifan();//計分數 if (r == 0 || r1 == 0 || r2 == 0) break; } y = bx;//恢復y的值 }break; case Esc:t = 0; break; //退出 default:break; } } } int main() { srand(time(NULL)); shuoming();//列印遊戲說明,之後讓游標進入0,0 hidden();//隱藏游標,不讓游標顯示 huatu();//畫出牆壁 gotoxy(x,y);//x=10,y=8, x 和y 是自己飛機的座標,是全域性變數 printf("A"); gotoxy(50,2); printf("Score:"); while (t) //t是一個全域性變數 初始值為1 { kongzhi(0,0);//呼叫控制飛機函式, (操作飛機後並記分數) if (t) //如果遊戲沒有結束,則 產生敵機 dfeiji();//產生敵機,並判斷飛機有沒有死亡 } }
2.(封裝了一個函式)結束遊戲後能夠重新開始進行下一局
/*隱藏游標的程式碼 #include <stdio.h> #include <windows.h> int main() { HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE); CONSOLE_CURSOR_INFO CursorInfo; GetConsoleCursorInfo(handle,3); printf(" !!! game over !!!\n" "*******************\n" " score: %d\n\n" " di ji shu: %d\n" " jian di shu: %d\n" " ming zhong lv: %.0f %%\n" "*******************\n",((float)j / (float)m) * 100); t=0; } } // 計分/更新敵機 void jifan() { //x,by); printf(" "); y = by;//記錄子彈打到哪了,好進行碰撞檢測 jifan();//計分數 if (r == 0 || r1 == 0 || r2 == 0) break; } y = bx;//恢復y的值 }break; case Esc:t = 0; break; //退出 default:break; } } } void zuzhong(){ x = 10; //飛機座標 y = 18; d2 = 10;//敵機座標 d1 = 10; d = 10;//d 和r 用來進行碰撞檢測 r = 1; r1 = 1; r2 = 1; t = 1; // 遊戲結束 f = 0; // 計分數 m = 5; // 敵機數 j = 0; // 殲敵數 char p; // 接受按鍵 srand(time(NULL)); shuoming();//列印遊戲說明,並判斷飛機有沒有死亡 } } int main() { while(1){ system("cls"); zuzhong(); printf("please enter Enter key contine"); getchar(); } }
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。