飞机大战源代码
大家都喜欢玩游戏,但是如何用C++完成一款比较完整的游戏呢?请按照如下说明完成空战游戏的开发。
.敌机数量>1, 飞机发射的子弹数量>1,所以用二维数组记录游戏画面中对应的元素,0表示输出空格,1表示输出飞机,2输出子弹,3输出敌机。
- 空战游戏开始有趣了,但是一些错误处理不够,也可以增加更多的游戏情节。
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 frame
SetPos(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里可以自动转换。
//观众老爷,顺手给点个赞吧!!!!!!!!!!!!!!!!!!!!!!