首页 > 编程学习 > 飞机大战作业C++实现

飞机大战作业C++实现

发布时间:2022/1/17 12:29:28

飞机大战源代码

大家都喜欢玩游戏,但是如何用C++完成一款比较完整的游戏呢?请按照如下说明完成空战游戏的开发。

.敌机数量>1, 飞机发射的子弹数量>1,所以用二维数组记录游戏画面中对应的元素,0表示输出空格,1表示输出飞机,2输出子弹,3输出敌机。

  1. 空战游戏开始有趣了,但是一些错误处理不够,也可以增加更多的游戏情节。
    i. 增加敌机boss,其形状更大、血量更多;
    ii. 尝试让敌机也发射子弹。
#include<iostream>
#include<windows.h>
#include<conio.h>
#include<time.h>
#include<string>using namespace std;typedef struct Frame
{COORD position[2];int flag;
}Frame;void SetPos(COORD a)
{HANDLE out = GetStdHandle(STD_OUTPUT_HANDLE);SetConsoleCursorPosition(out, a);
}void SetPos(int i, int j)
{COORD pos = { i, j };SetPos(pos);
}void HideCursor()
{CONSOLE_CURSOR_INFO cursor_info = { 1, 0 };SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info);
}void drawRow(int y, int x1, int x2, char ch)
{SetPos(x1, y);for (int i = 0; i <= (x2 - x1); i++)cout << 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");}
}void drawCol(int x, int y1, int y2, char ch)
{int y = y1;while (y != y2 + 1){SetPos(x, y);cout << ch;y++;}
}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, '#', '#');//	map frame;drawFrame(49, 4, 79, 9, '-', '|');//	 score frameSetPos(52, 6);cout << "�÷֣�";SetPos(52, 7);cout << "����";}//��[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 << "@@@@@@�ɻ���ս��Ϸ@@@@@@";drawRow(3, 0, 79, '*');drawRow(5, 0, 79, '*');drawRow(20, 0, 79, '*');drawRow(22, 0, 79, '*');SetPos(35, 10);cout << "��Ϸ˵����";SetPos(35, 12);cout << "a,s,d,w ���Ʒɻ��ƶ�.";SetPos(35, 14);cout << "k����/ѡ��.";SetPos(35, 16);cout << "e �˳�  p ��ͣ��";drawFrame(25, 9, 60, 17, '=', '|');while (1){if (_kbhit()){char x = _getch();if(x=='k') return 1;}}
}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 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 << "+";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 / 4;SetPos(60, 6);cout << score;if (rank != rankf){SetPos(60, 7);if (x == 6)title = "��ǿ��ͭ";else 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()
{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){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��";
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;
}int main()
{srand((int)time(0));HideCursor();Game game;int a = drawMenu();system("cls");drawPlaying();game.Playing();system("pause");return 0;}
//乱码问题是由于编码格式不同,在IDE里可以自动转换。
//观众老爷,顺手给点个赞吧!!!!!!!!!!!!!!!!!!!!!!

本文链接:https://www.ngui.cc/51cto/show-473.html
Copyright © 2010-2022 ngui.cc 版权所有 |关于我们| 联系方式| 豫B2-20100000