C語言版飛機大戰遊戲
阿新 • • 發佈:2020-12-17
C語言版飛機大戰,供大家參考,具體內容如下
不多說直接上程式碼
#include<iostream> #include<windows.h> #include<conio.h> #include<time.h> #include<string> using namespace std; /*=============== all the structures ===============*/ typedef struct Frame { COORD position[2]; int flag; }Frame; /*=============== all the functions ===============*/ void SetPos(COORD a)// set cursor { HANDLE out=GetStdHandle(STD_OUTPUT_HANDLE); SetConsoleCursorPosition(out,a); } void SetPos(int i,int j)// set cursor { COORD pos={i,j}; SetPos(pos); } void HideCursor() { CONSOLE_CURSOR_INFO cursor_info = {1,0}; SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE),&cursor_info); } //把第y行,[x1,x2) 之間的座標bai填充為 ch void drawRow(int y,int x1,int x2,char ch) { SetPos(x1,y); for(int i = 0; i <= (x2-x1); i++) cout<<ch; } //在a,b 縱座標相同的前提下,把座標 [a,b] 之間填充為 ch void drawRow(COORD a,COORD b,char ch) { if(a.Y == b.Y) drawRow(a.Y,a.X,b.X,ch); else { SetPos(0,25); cout<<"error code 01:無法填充行,因為兩個座標的縱座標(x)不相等"; system("pause"); } } //把第x列,[y1,y2] 之間的座標填充為 ch void drawCol(int x,int y1,int y2,char ch) { int y=y1; while(y!=y2+1) { SetPos(x,y); cout<<ch; y++; } } //在a,b 橫座標相同的前提下,把座標 [a,b] 之間填充為 ch void drawCol(COORD a,char ch) { if(a.X == b.X) drawCol(a.X,a.Y,b.Y,25); cout<<"error code 02:無法填充列,因為兩個座標的橫座標(y)不相等"; system("pause"); } } //左上角座標、右下角座標、用row填充行、用col填充列 void drawFrame(COORD a,char row,char col) { drawRow(a.Y,a.X+1,b.X-1,row); drawRow(b.Y,row); drawCol(a.X,a.Y+1,b.Y-1,col); drawCol(b.X,col); } void drawFrame(int x1,char col) { COORD a={x1,y1}; COORD b={x2,y2}; drawFrame(a,b,row,col); } void drawFrame(Frame frame,char col) { COORD a = frame.position[0]; COORD b = frame.position[1]; drawFrame(a,col); } void drawPlaying() { drawFrame(0,48,24,'=','|');// draw map frame; drawFrame(49,79,4,'-','|');// draw output frame drawFrame(49,9,'|');// draw score frame drawFrame(49,20,'|');// draw operate frame drawFrame(49,'|');// draw other message frame SetPos(52,6); cout<<"得分:"; SetPos(52,7); cout<<"稱號:"; SetPos(52,10); cout<<"操作方式:"; SetPos(52,12); cout<<" a,s,d,w 控制戰機移動。"; SetPos(52,14); cout<<" p 暫停遊戲。"; SetPos(52,16); cout<<" e 退出遊戲。"; SetPos(52,18); cout<<" k 發射子彈。"; } //在[a,b)之間產生一個隨機整數 int random(int a,int b) { int c=(rand() % (a-b))+ a; return c; } //在兩個座標包括的矩形框內隨機產生一個座標 COORD random(COORD a,COORD b) { int x=random(a.X,b.X); int y=random(a.Y,b.Y); COORD c={x,y}; return c; } bool judgeCoordInFrame(Frame frame,COORD spot) { if(spot.X>=frame.position[0].X) if(spot.X<=frame.position[1].X) if(spot.Y>=frame.position[0].Y) if(spot.Y<=frame.position[0].Y) return true; return false; } void printCoord(COORD a) { cout <<"( "<<a.X<<","<<a.Y<<" )"; } void printFrameCoord(Frame a) { printCoord(a.position[0]); cout <<" - "; printCoord(a.position[1]); } int drawMenu() { SetPos(30,1); cout<<"P l a n e W a r"; drawRow(3,'-'); drawRow(5,'-'); SetPos(28,4); cout<<"w 和 s 選擇, k 確定"; SetPos(15,11); cout<<"1. 簡單的敵人"; SetPos(15,13); cout<<"2. 冷酷的敵人"; drawRow(20,'-'); drawRow(22,'-'); SetPos(47,11); cout<<"簡單的敵人:"; SetPos(51,13); cout<<"簡單敵人有著較慢的移動速度。"; SetPos(24,21); cout<<" ☆○☆○☆○☆○☆○☆ "; int j=11; SetPos(12,j); cout<<">>"; //drawFrame(45,17,'|'); while(1) { if( _kbhit() ) { char x=_getch(); switch (x) { case 'w' : { if( j == 13) { SetPos(12,j); cout<<" "; j = 11; SetPos(12,j); cout<<">>"; SetPos(51,13); cout<<" "; SetPos(47,13); cout<<"簡單敵人有著較慢的移動速度。"; } break; } case 's' : { if( j == 11 ) { SetPos(12,j); cout<<" "; j = 13; SetPos(12,13); cout<<" "; SetPos(47,11); cout<<"冷酷的敵人:"; SetPos(51,13); cout<<"冷酷的敵人移動速度較快。"; } break; } case 'k' : { if (j == 8) return 1; else return 2; } } } } } /* DWORD WINAPI MusicFun(LPVOID lpParamte) { //DWORD OBJ; sndPlaySound(TEXT("bgm.wav"),SND_FILENAME|SND_ASYNC); return 0; } */ /*================== the Game Class ==================*/ class Game { public: COORD position[10]; COORD bullet[10]; Frame enemy[8]; int score; int rank; int rankf; string title; int flag_rank; Game (); //初始化所有 void initPlane(); void initBullet(); void initEnemy(); //初始化其中一個 //void initThisBullet( COORD ); //void initThisEnemy( Frame ); void planeMove(char); void bulletMove(); void enemyMove(); //填充所有 void drawPlane(); void drawPlaneToNull(); void drawBullet(); void drawBulletToNull(); void drawEnemy(); void drawEnemyToNull(); //填充其中一個 void drawThisBulletToNull( COORD ); void drawThisEnemyToNull( Frame ); void Pause(); void Playing(); void judgePlane(); void judgeEnemy(); void Shoot(); void GameOver(); void printScore(); }; Game::Game() { initPlane(); initBullet(); initEnemy(); score = 0; rank = 25; rankf = 0; flag_rank = 0; } void Game::initPlane() { COORD centren={39,22}; position[0].X=position[5].X=position[7].X=position[9].X=centren.X; position[1].X=centren.X-2; position[2].X=position[6].X=centren.X-1; position[3].X=position[8].X=centren.X+1; position[4].X=centren.X+2; for(int i=0; i<=4; i++) position[i].Y=centren.Y; for(int i=6; i<=8; i++) position[i].Y=centren.Y+1; position[5].Y=centren.Y-1; position[9].Y=centren.Y-2; } void Game::drawPlane() { for(int i=0; i<9; i++) { SetPos(position[i]); if(i!=5) cout<<"o"; else if(i==5) cout<<"|"; } } void Game::drawPlaneToNull() { for(int i=0; i<9; i++) { SetPos(position[i]); cout<<" "; } } void Game::initBullet() { for(int i=0; i<10; i++) bullet[i].Y = 30; } void Game::drawBullet() { for(int i=0; i<10; i++) { if( bullet[i].Y != 30) { SetPos(bullet[i]); cout<<"^"; } } } void Game::drawBulletToNull() { for(int i=0; i<10; i++) if( bullet[i].Y != 30 ) { COORD pos={bullet[i].X,bullet[i].Y+1}; SetPos(pos); cout<<" "; } } void Game::initEnemy() { COORD a={1,1}; COORD b={45,15}; for(int i=0; i<8; i++) { enemy[i].position[0] = random(a,b); enemy[i].position[1].X = enemy[i].position[0].X + 3; enemy[i].position[1].Y = enemy[i].position[0].Y + 2; } } void Game::drawEnemy() { for(int i=0; i<8; i++) drawFrame(enemy[i].position[0],enemy[i].position[1],'|'); } void Game::drawEnemyToNull() { for(int i=0; i<8; i++) { drawFrame(enemy[i].position[0],' ',' '); } } void Game::Pause() { SetPos(61,2); cout<<" "; SetPos(61,2); cout<<"暫停中..."; char c=_getch(); while(c!='p') c=_getch(); SetPos(61,2); cout<<" "; } void Game::planeMove(char x) { if(x == 'a') if(position[1].X != 1) for(int i=0; i<=9; i++) position[i].X -= 2; if(x == 's') if(position[7].Y != 23) for(int i=0; i<=9; i++) position[i].Y += 1; if(x == 'd') if(position[4].X != 47) for(int i=0; i<=9; i++) position[i].X += 2; if(x == 'w') if(position[5].Y != 3) for(int i=0; i<=9; i++) position[i].Y -= 1; } void Game::bulletMove() { for(int i=0; i<10; i++) { if( bullet[i].Y != 30) { bullet[i].Y -= 1; if( bullet[i].Y == 1 ) { COORD pos={bullet[i].X,bullet[i].Y+1}; drawThisBulletToNull( pos ); bullet[i].Y=30; } } } } void Game::enemyMove() { for(int i=0; i<8; i++) { for(int j=0; j<2; j++) enemy[i].position[j].Y++; if(24 == enemy[i].position[1].Y) { COORD a={1,3}; enemy[i].position[0] = random(a,b); enemy[i].position[1].X = enemy[i].position[0].X + 3; enemy[i].position[1].Y = enemy[i].position[0].Y + 2; } } } void Game::judgePlane() { for(int i = 0; i < 8; i++) for(int j=0; j<9; j++) if(judgeCoordInFrame(enemy[i],position[j])) { SetPos(62,1); cout<<"墜毀"; drawFrame(enemy[i],'+','+'); Sleep(1000); GameOver(); break; } } void Game::drawThisBulletToNull( COORD c) { SetPos(c); cout<<" "; } void Game::drawThisEnemyToNull( Frame f ) { drawFrame(f,' '); } void Game::judgeEnemy() { for(int i = 0; i < 8; i++) for(int j = 0; j < 10; j++) if( judgeCoordInFrame(enemy[i],bullet[j]) ) { score += 5; drawThisEnemyToNull( enemy[i] ); COORD a={1,b); enemy[i].position[1].X = enemy[i].position[0].X + 3; enemy[i].position[1].Y = enemy[i].position[0].Y + 2; drawThisBulletToNull( bullet[j] ); bullet[j].Y = 30; } } void Game::Shoot() { for(int i=0; i<10; i++) if(bullet[i].Y == 30) { bullet[i].X = position[5].X; bullet[i].Y = position[5].Y-1; break; } } void Game::printScore() { if(score == 120 && flag_rank == 0) { rank -= 3; flag_rank = 1; } else if( score == 360 && flag_rank == 1) { rank -= 5; flag_rank = 2; } else if( score == 480 && flag_rank == 2) { rank -= 5; flag_rank = 3; } int x=rank/5; SetPos(60,6); cout<<score; if( rank!=rankf ) { SetPos(60,7); if( x == 5) title="初級飛行員"; else if( x == 4) title="中級飛行員"; else if( x == 3) title="高階飛行員"; else if( x == 2 ) title="王牌飛行員"; cout<<title; } rankf = rank; } void Game::Playing() { //HANDLE MFUN; //MFUN= CreateThread(NULL,MusicFun,NULL,NULL); drawEnemy(); drawPlane(); int flag_bullet = 0; int flag_enemy = 0; while(1) { Sleep(8); if(_kbhit()) { char x = _getch(); if ('a' == x || 's' == x || 'd' == x || 'w' == x) { drawPlaneToNull(); planeMove(x); drawPlane(); judgePlane(); } else if ('p' == x) Pause(); else if( 'k' == x) Shoot(); else if( 'e' == x) { //CloseHandle(MFUN); GameOver(); break; } } /* 處理子彈 */ if( 0 == flag_bullet ) { bulletMove(); drawBulletToNull(); drawBullet(); judgeEnemy(); } flag_bullet++; if( 5 == flag_bullet ) flag_bullet = 0; /* 處理敵人 */ if( 0 == flag_enemy ) { drawEnemyToNull(); enemyMove(); drawEnemy(); judgePlane(); } flag_enemy++; if( flag_enemy >= rank ) flag_enemy = 0; /* 輸出得分 */ printScore(); } } void Game::GameOver() { system("cls"); COORD p1={28,9}; COORD p2={53,15}; drawFrame(p1,p2,'|'); SetPos(36,12); string str="Game Over!"; for(int i=0; i<str.size(); i++) { Sleep(80); cout<<str[i]; } Sleep(1000); system("cls"); drawFrame(p1,'|'); SetPos(31,11); cout<<"擊落敵機:"<<score/5<<" 架"; SetPos(31,12); cout<<"得 分:"<<score; SetPos(31,13); cout<<"獲得稱號:"<<title; SetPos(30,16); Sleep(1000); cout<<"繼續? 是(y)| 否(n)"; as: char x=_getch(); if (x == 'n') exit(0); else if (x == 'y') { system("cls"); Game game; int a = drawMenu(); if(a == 2) game.rank = 20; system("cls"); drawPlaying(); game.Playing(); } else goto as; } /*================== the main function ==================*/ int main() { //遊戲準備 srand((int)time(0)); //隨機種子 HideCursor(); //隱藏游標 Game game; int a = drawMenu(); if(a == 2) game.rank = 20; system("cls"); drawPlaying(); game.Playing(); }
圖片展示
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。