1. 程式人生 > >C++實習的打飛機小遊戲

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) 之間的座標填充為 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, COORD b, char ch)
{
if (a.X == b.X)
drawCol(a.X, a.Y, b.Y, ch);
else
{
SetPos(0, 25);
cout << "error code 02:無法填充列,因為兩個座標的橫座標(y)不相等";
system("pause");
}
}


//左上角座標、右下角座標、用row填充行、用col填充列  
void drawFrame(COORD a, COORD  b, char row, char col)
{
drawRow(a.Y, a.X + 1, b.X - 1, row);
drawRow(b.Y, a.X + 1, b.X - 1, row);
drawCol(a.X, a.Y + 1, b.Y - 1, col);
drawCol(b.X, a.Y + 1, b.Y - 1, col);
}


void drawFrame(int x1, int y1, int x2, int y2, char row, char col)
{
COORD a = { x1, y1 };
COORD b = { x2, y2 };
drawFrame(a, b, row, col);
}


void drawFrame(Frame frame, char row, char col)
{
COORD a = frame.position[0];
COORD b = frame.position[1];
drawFrame(a, b, row, col);
}


void drawPlaying()
{
drawFrame(0, 0, 48, 24, '=', '|');//    draw map frame;  
drawFrame(49, 0, 79, 4, '-', '|');//        draw output frame  
drawFrame(49, 4, 79, 9, '-', '|');//        draw score frame  
drawFrame(49, 9, 79, 20, '-', '|');//   draw operate frame  
drawFrame(49, 20, 79, 24, '-', '|');//  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 退出遊戲。";
}


//在[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, 0, 79, '-');
drawRow(5, 0, 79, '-');
SetPos(28, 4);
cout << "w 和 s 選擇, k 確定";
SetPos(15, 11);
cout << "1. 簡單的敵人";
SetPos(15, 13);
cout << "2. 冷酷的敵人";
drawRow(20, 0, 79, '-');
drawRow(22, 0, 79, '-');
SetPos(47, 11);
cout << "簡單的敵人:";
SetPos(51, 13);
cout << "簡單敵人有著較慢的移動速度。";
SetPos(24, 21);
cout << "製作:LJF神犇";
int j = 11;
SetPos(12, j);
cout << ">>";


//drawFrame(45, 9, 79, 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, 11);
cout << "簡單的敵人:";
SetPos(51, 13);
cout << "簡單敵人有著較慢的移動速度,比較容易對付";
}
break;
}
case 's':
{
if (j == 11)
{
SetPos(12, j);
cout << " ";
j = 13;
SetPos(12, j);
cout << ">>";
SetPos(51, 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], enemy[i].position[1], ' ', ' ');
}
}


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, 1 };
COORD b = { 45, 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, 1 };
COORD b = { 45, 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;
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, 0, MusicFun, NULL, 0, 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, p2, '=', '|');
SetPos(31, 11);
cout << "擊落敵機:" << score / 5 << " 架";
SetPos(31, 12);
cout << "得  分:" << score;
SetPos(31, 13);
cout << "獲得稱號:" << title;
SetPos(30, 16);
Sleep(1000);
cout << "繼續? 是(y)| 否(n)製作:最牛的LJF";
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();
}

相關推薦

C++實習飛機遊戲

#include<iostream>   #include<windows.h>   #include<conio.h>   #include<time.h>   #include<string>   using

[Java] java飛機遊戲

新手剛接觸java 程式設計,做一個打飛機的小遊戲。有什麼不對或有錯誤的地方請各位大神指出。            完整程式碼:敵飛機:   [Java] 純文字檢視 複製程式

Python飛機遊戲

環境 作業系統:windows10 pycharm:2017.3 python:3.6 pygame:1.9.3 實現功能 程式碼 alien_invasion.py import pygame from pygame.sprite import Group from se

java專案實戰——Java飛機遊戲(附完整原始碼)

點選有驚喜 寫在前面 技術源於分享,所以今天抽空把自己之前用java做過的小遊戲整理貼出來給大家參考學習。java確實不適合寫桌面應用,這裡只是通過這個遊戲讓大家理解oop面向物件程式設計的過程,純屬娛樂。程式碼寫的很簡單,也很容易理解,並且註釋寫的很清楚了,還有

CreateJS實現飛機遊戲

之前對createJs體驗了一下,正好看到網上有一篇教程,試著也寫了一個打飛機的小遊戲,UI相對比較簡單,主要記錄下實現遊戲邏輯的思路。window.onload = function() { canvas = document.getElementById("can

Python編寫飛機遊戲

這是一個簡單的打飛機的遊戲,執行main.py即可! 最近在學python,總要寫一定小專案練練手的。所以就寫了個仿微信打飛機的小遊戲,有參照網上開源的專案的~後續功能正在完善中… 效果圖 程式碼實現 本專案是基於pygame模組的,所以如果

【組合語言】純組合語言編寫飛機遊戲

    上學期組合語言的期末考核可選的一項是用純組合語言編寫一個小遊戲,喜歡動手的我當然首選這個了。小遊戲當中用來練手的,一般有貪吃蛇、俄羅斯方塊、打飛機之類的咯,於是我選擇了其中一個——打飛機!咳咳,選擇它可並不是因為個人某種特殊喜好,我想大多數男同胞都會傾向於玩這款遊戲

【python】飛機遊戲(一)

首先宣告一點,這篇部落格完全參照了小甲魚的《零基礎入門學習Python》教學視訊 打飛機小遊戲思路: 1、載入背景音樂 2、播放背景音樂(單曲迴圈) 3、我方飛機誕生 interval = 0(

Python編寫微信飛機遊戲(一)

如果覺得這篇文章對您有所啟發,歡迎關注我的公眾號,我會盡可能積極和大家交流,謝謝。   最近開始學習Python語言,發現Python有一個神奇的Pygame模組,在編寫小遊戲時顯得非常方便,於是參照教學視訊編寫了一個微信打飛機的小遊戲,網上有很多相關的部落格,但都不是很詳細

Python編寫微信飛機遊戲(六)

如果覺得這篇文章對您有所啟發,歡迎關注我的公眾號,我會盡可能積極和大家交流,謝謝。   接下來,我們為我方飛機新增武器——發射子彈。  考慮到Python語言的模組化,我們同樣將子彈封裝為一個模組,bullet.py。新建py檔案,匯入Pygame,程式設計開始。  1、定義

C語言實現飛機簡易遊戲(半完成版)

打飛機簡易遊戲(半完成版),如圖。 感謝 童晶 老師的教程,連結地址:http://study.163.com/forum/detail/1003961010.htm 未完成內容:①邊框繪製 ②多個敵機 ③敵機子彈 ④戰機生命 等等。 以下是程式碼。(在帶c99標準的codeblock

C++語言寫遊戲——遊戲

想玩遊戲嗎? 就到某位神犇這來吧! 這會告訴你很多遊戲寫法! 今天,神犇就開始書寫第二期——打怪小遊戲!!! 很容易,只需要用腦袋想想即可,READY——GO! 我也希望大家多多捧場哦~~~ 有一點點BUG,敬請諒解! #include <iostre

C/C++ 控制檯飛機遊戲

#include <stdio.h> #include <conio.h> #include <stdlib.h> #include <time.h> #define N 35 void print(int [][N]);//

C語 三子棋遊戲

splay ret int def 選擇 種子 define tdi rand() 1 #include <stdio.h> 2 #include <Windows.h> 3 #include<time.h> 4 #de

原生javascript面向對象開發兒時經典磚塊遊戲

javascript 經典 打磚塊 遊戲 面向對象 知識點: js面向對象,js運動碰撞檢測,js隨機顏色,動態生成動態監測實現原理,運動實現原理,模塊化編程思想, 事件監聽封裝, 頁面刷新事件 ,call與bind改變this指向等。 html代碼: <div id="wrap"

從完全零基礎教你用Python開飯一款飛機遊戲!是個人就能學會

實現 裁剪 -i ext 想象 一點 換圖 結束 離開 默認圖片左上角為原點 (0,0)。 進群:125240963 即可獲取數十套PDF!要源碼也可以私信哦! 顯示窗口 如果我們這樣設定,當我們運行的時候,窗口會一閃而過,並不會出現我們想象的畫面。因為

jQuery 氣球遊戲 點擊氣球爆炸效果

navig mov dir ret css 利用 rec order 一個 最近在學習前端,看到偶爾看到前端小遊戲,就想自己寫一個小遊戲,奈何水平有限,只能寫打氣球這種簡單的,所有的氣球都是動態生成的,氣球的顏色也是隨機的 html部分 <div class=

js 面向對象 氣球遊戲

www. itl ini parseint alert public elements cli splice <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.

java:字母遊戲demo

在一個300*400的窗體上,有隨機產生的字母向下落。在鍵盤上敲字母,如果對了就消掉,初始成績為1000分,每敲對一個字母加10分,如果字母落到螢幕下方,或者敲錯,扣100分。 import java.awt.Color; import java.awt.Graphics; import j

詳解!C語言程式設計實現遊戲“三子棋”

今天我們來程式設計實現一個充滿童趣的小遊戲“三子棋” 先來說一下三子棋的規則: 三子棋又叫九宮棋、圈圈叉叉、一條龍等。 將正方形對角線連起來,或相對兩邊依次擺上三個雙方棋子, 總之只要將自己的三個棋子走成一條線, 對方就算輸了。 不用再過多解釋了,相信大家一定都玩過! 那麼,該