#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;
//设置坐标点COORD:x,y
void SetPos(COORD a)
{
HANDLE out = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleCursorPosition(out, a);
}
// 设置横纵坐标 x,y
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 m, int n1, int n2, char ch)
{
SetPos(n1, m);
for (int i = 0; i <= (n2 - n1); 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;
}
//判断两个frame对象是否碰撞
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, '-');
SetPos(28, 4);
cout << "w 和 s 选择, k 确定";
SetPos(15, 11);
cout << "1. Easy Mode";
SetPos(15, 13);
cout << "2. Hard Mode";
drawRow(20, 0, 79, '-');
drawRow(22, 0, 79, '-');
SetPos(47, 11);
cout << "敌人属性:";
SetPos(51, 13);
cout << "有着较慢的移动速度。";
SetPos(24, 21);
int j = 11;
SetPos(12, j);
cout << ">>";
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;
}
}
}
}
}
/*游戏类*/
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[6].X = centren.X;
position[1].X = centren.X - 2;
position[2].X = position[5].X = position[8].X = centren.X - 1;
position[3].X = position[7].X = position[9].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 = 5; i <= 7; i++)
position[i].Y = centren.Y - 1;
position[8].Y = centren.Y + 1;
position[9].Y = centren.Y + 1;
}
//画飞机
void Game::drawPlane()
{
for (int i = 0; i < 10; i++)
{
SetPos(position[i]);
if (i == 0 || i== 8 || i==9)
cout << "*";
else if (i == 5)
cout << "/";
else if (i == 6)
cout << "=";
else if (i == 7)
cout << "\\";
else if (i == 1 || i== 2)
cout << "<";
else if (i == 3 || i== 4)
cout << ">";
}
}
//飞机清空
void Game::drawPlaneToNull()
{
for (int i = 0; i < 10; 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 + 2;
enemy[i].position[1].Y = enemy[i].position[0].Y + 1;
}
}
//画敌机
void Game::drawEnemy()
{
for (int i = 0; i < 8; i++){
drawRow(enemy[i].position[0].Y, enemy[i].position[0].X, enemy[i].position[0].X, '\\');
drawRow(enemy[i].position[0].Y, enemy[i].position[0].X+1, enemy[i].position[0].X+1, '+');
drawRow(enemy[i].position[0].Y, enemy[i].position[0].X+2, enemy[i].position[0].X+2, '/');
drawRow(enemy[i].position[0].Y+1, enemy[i].position[0].X+1, enemy[i].position[0].X+1, '|');
}
}
//敌机清除
void Game::drawEnemyToNull()
{
for (int i = 0; i < 8; i++)
{
drawRow(enemy[i].position[0].Y, enemy[i].position[0].X, enemy[i].position[0].X, ' ');
drawRow(enemy[i].position[0].Y, enemy[i].position[0].X+1, enemy[i].position[0].X+1, ' ');
drawRow(enemy[i].position[0].Y, enemy[i].position[0].X+2, enemy[i].position[0].X+2, ' ');
drawRow(enemy[i].position[0].Y+1, enemy[i].position[0].X+1, enemy[i].position[0].X+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)
{
//飞机飞出画面,扣分
score -= 1;
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 + 2;
enemy[i].position[1].Y = enemy[i].position[0].Y + 1;
}
}
}
//飞机判决:坠毁判断
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, ' ', ' ');
drawRow(f.position[0].Y, f.position[0].X, f.position[0].X, ' ');
drawRow(f.position[0].Y, f.position[0].X+1, f.position[0].X+1, ' ');
drawRow(f.position[0].Y, f.position[0].X+2, f.position[0].X+2, ' ');
drawRow(f.position[0].Y+1, f.position[0].X+1, f.position[0].X+1, ' ');
}
// 敌机判决:击中加分
void Game::judgeEnemy()
{
for (int i = 0; i < 8; i++)
for (int j = 0; j < 10; j++)
if (judgeCoordInFrame(enemy[i], bullet[j]))
{
//击中,加分
score += 1;
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 + 2;
enemy[i].position[1].Y = enemy[i].position[0].Y + 1;
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 == 10 && flag_rank == 0)
{
rank -= 3;
flag_rank = 1;
}
else if (score == 25 && flag_rank == 1)
{
rank -= 5;
flag_rank = 2;
}
else if (score == 50 && 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;
/*分数为0,游戏结束*/
if (score < 0)
{
SetPos(62, 1);
cout << "分数不够";
Sleep(1000);
score = 0;
GameOver();
break;
}
/* 输出得分 */
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, 11);
cout << "得 分:" << score;
SetPos(31, 12);
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 = 25;
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 = 25;
system("cls");
drawPlaying();
game.Playing();
}
0.0分
0 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复