飞机大战小游戏

#创作灵感#

某天翻了翻自己的程序目录,翻到了一个《打飞机》的作品。但粗话有那么亿点多,就改良了一下,顺便加了一个九九乘法表进去。警告很多,也希望各位大神为我的作品给点建议,谢谢

如有侵权请联系我我会把文章删掉

特点

优化了代码,我之前的那个利用ACLLib做的飞机大战在渣机上特别是GPU性能不太好的电脑上,如果玩家不主动攻击飞机的话会越来越卡。网上的作品一般都调用了第三方库,这边是用了conio.h头文件,把飞机、战机、子弹都渲染在“黑色框框”里(其实呢没有用图片),让作品在渣机特别是GPU不行的电脑上也能流畅运行

按键

开局选难度,有两个难度,用w和s选难度。简单难度呢就是把答案放在那里,你就操作战机去打数字就行了。而困难难度呢就是数字随机出现。

跟每个游戏一样,操控战机也是wasd控制。

发射子弹是k按键

暂停游戏是p按键

退出游戏是e按键,不过退出游戏就判负了。

其他

当你击落其他飞机时会加分,如果击中数字就会先存入十位再存入个位数。在简单难度中如果你没击中对应数字就会循环出现直到你击中了它。在困难模式中就要看你的运气啦!如果答案正确加分的分数会成倍增加,当然答案错误就会减半

大概就这么多,直接上代码吧!

#include<iostream>
#include<windows.h>
#include<conio.h>
#include<time.h>
#include<string>
using namespace std;
/*=============== all the structures ===============*/
int level;

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}; //[警告]缩小‘ i’从‘ int’到‘ SHORT’{ aka‘ SHORT int’}[-缩小]
	//[警告]缩小‘ j’从‘ int’到‘ SHORT’{ aka‘ SHORT int’}[-缩小]
	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}; //[警告]缩小‘ x1’从‘ int’到‘ SHORT’{ aka‘ SHORT int’}[-缩小]
	//[警告]缩小‘ y1’从‘ int’到‘ SHORT’{ aka‘ SHORT int’}[-缩小]
	COORD b = {x2, y2}; //[警告]缩小‘ x2’从‘ int’到‘ SHORT’{ aka‘ SHORT int’}[-缩小]
	//[警告]缩小‘ y2’从‘ int’到‘ SHORT’{ aka‘ SHORT int’}[-缩小]
	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, 5);    //	写公式
	cout << "计算:";
	SetPos(52, 6);
	cout << "得分:";
	SetPos(52, 7);
	cout << "称号:";
	SetPos(52, 8);
	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}; //[警告]缩小‘ x’从‘ int’到‘ SHORT’{ aka‘ SHORT int’}[-缩小]
	//[警告]缩小‘ y’从‘ int’到‘ SHORT’{ aka‘ SHORT int’}[-缩小]
	return c;
}

int judgeNumAndRes(int num, int res) {
	if (res == num) {
		return 1;
	} else {
		return 0;
	}
}



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() {
	SetConsoleTitle("九九乘法表益智飞机大战 作者:***");
	SetPos(30, 1);
	cout << "九九乘法表 益智飞机大战";
	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 << "制作:***";
	int j = 11;
	SetPos(12, j);
	cout << ">>";
	level = 1;
	//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 << "缓慢的移动速度,乘法数字出现";
						level = 1;
					}
					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 << "快速的移动速度,随机数字出现";
						level = 2;
					}
					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];
		Frame buff;// Buff
		int score;
		char num;//字符串
		int number;//随机数
		int rank;
		int rankf;
		int math_a; //乘数a
		int math_b; //乘数b
		int res_a; //十位
		int res_b; //个位
		int res_c; //1是个位数答案 2是十位数答案
		int res_flag;  // -1 错误,0 开始/看十位 1 十位正确看个位 2正确
		string title;
		int flag_rank;
		int flagBuff;// 倍数的标签
		int plane;

		Game ();

		//初始化所有
		void initPlane();
		void initBullet();
		void initEnemy();
		void initBuff();
		void initMath();

		//初始化其中一个
		//void initThisBullet( COORD );
		//void initThisEnemy( Frame );

		void planeMove(char);
		void bulletMove();
		void buffMove();
		void enemyMove();

		//填充所有
		void drawPlane();
		void drawPlaneToNull();
		void drawBullet();
		void drawBulletToNull();
		void drawEnemy();
		void drawEnemyToNull();
		void drawBuff();
		void drawBuffToNull();

		//填充其中一个
		void drawThisBulletToNull( COORD );
		void drawThisEnemyToNull( Frame );
		void drawThisBuffToNull( Frame );

		void Pause();
		void Playing();
		void judgePlane();
		void judgeEnemy();
		void judgeBuff();
		void judgeMath();//判断对错

		void Shoot();

		void GameOver();
		void printMath();
		void printScore();
};

Game::Game() {
	initPlane();
	initBullet();
	initEnemy();
	score = 0;
	rank = 25;
	rankf = 0;
	flag_rank = 0;
	flagBuff = 1;
	res_flag = 0;
	plane = 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}; //[警告]缩小“(((int)((Game *) this)-> Game: : Bult [ i ] . _ COORD: : Y) + 1”从“ int”到“ SHORT”{ aka‘ SHORT int’}[-缩小]
			SetPos(pos);
			cout << " ";
		}
}


void Game::initMath() {
	res_flag = 0;
	//显示倍数
	SetPos(62, 8);
	cout << flagBuff << " 倍  ";

	math_a = rand() % 9 + 1;
	math_b = rand() % 9 + 1;
	int res = math_a * math_b;
	res_a = res / 10;
	res_b = res % 10;
	//如果答案是个位数
	if (res_a == 0) {
		res_c = 1;
		SetPos(60, 5);
		cout << math_a << " * " << math_b << " = ";
		//	cout<<math_a<<" * "<<math_b<<" = "<<res_b<<" ";
	} else {
		res_c = 2;
		SetPos(60, 5);
		cout << math_a << " * " << math_b << " = ";
		//	cout<<math_a<<" * "<<math_b<<" = "<<res_a<<res_b;
	}
}

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::initBuff() {
	//初始值
	//重新换数字(分等级)
	if (level == 1) {
		if (res_c == 1) {
			num = res_b + '0';
		} else {
			if (res_flag == 0) {
				num = res_a + '0';
			} else {
				num = res_b + '0';
			}
		}
	} else if (level == 2) {
		number = rand() % 10 + 1;
		num = number + '0' - 1;
	} else {
		num = 0 + '0' - 1;
	}
	COORD a = {1, 1};
	COORD b = {45, 15};
	buff.position[0] = random(a, b);
	buff.position[1].X = buff.position[0].X + 3;
	buff.position[1].Y = buff.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::drawBuff() {
	drawFrame(buff.position[0], buff.position[1], num, num);
}

void Game::drawBuffToNull() {
	drawFrame(buff.position[0], buff.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}; //[警告]缩小“(((int)((Game *) this)-> Game: : Bult [ i ] . _ COORD: : Y) + 1”从“ int”到“ SHORT”{ aka‘ SHORT int’}[-缩小]
				drawThisBulletToNull( pos );
				bullet[i].Y = 30;
			}

		}
	}
}

void Game::buffMove() {
	for (int j = 0; j < 2; j++)
		buff.position[j].Y++;

	if (24 == buff.position[1].Y) {
		COORD a = {1, 1};
		COORD b = {45, 3};
		buff.position[0] = random(a, b);
		buff.position[1].X = buff.position[0].X + 3;
		buff.position[1].Y = buff.position[0].Y + 2;
		//重新换数字(分等级)
		if (level == 1) {
			if (res_c == 1) {
				num = res_b + '0';
			} else {
				if (res_flag == 0) {
					num = res_a + '0';
				} else {
					num = res_b + '0';
				}
			}
		} else if (level == 2) {
			number = rand() % 10 + 1;
			num = number + '0' - 1;
		} else {
			num = 0 + '0' - 1;
		}
	}
}

void Game::enemyMove() {
	for (int i = 0; i < 8; i++) {
		if (level == 1) {
			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;
			}
		} else {
			for (int j = 0; j < 2; j++)
				enemy[i].position[j].Y = enemy[i].position[j].Y + 2;
			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::drawThisBuffToNull( Frame buff ) {
	drawFrame(buff, ' ', ' ');
}

void Game::judgeEnemy() {
	for (int i = 0; i < 8; i++)
		for (int j = 0; j < 10; j++)
			if ( judgeCoordInFrame(enemy[i], bullet[j]) ) {
				score = score + 1 * flagBuff;
				plane++;
				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::judgeBuff() {
	for (int j = 0; j < 10; j++)
		if ( judgeCoordInFrame(buff, bullet[j]) ) {
			//显示射击的数字(个位,十位)
			if (res_flag == 0) {
				SetPos(68, 5);
				cout << num;
			} else {
				SetPos(69, 5);
				cout << num;
			}
			//判断公式
			judgeMath();
			//重新换数字(分等级)
			if (level == 1) {
				if (res_c == 1) {
					num = res_b + '0';
				} else {
					if (res_flag == 0) {
						num = res_a + '0';
					} else {
						num = res_b + '0';
					}
				}
			} else if (level == 2) {
				number = rand() % 10 + 1;
				num = number + '0' - 1;
			} else {
				num = 0 + '0' - 1;
			}
			drawThisBuffToNull( buff );
			COORD a = {1, 1};
			COORD b = {45, 3};
			buff.position[0] = random(a, b);
			buff.position[1].X = buff.position[0].X + 3;
			buff.position[1].Y = buff.position[0].Y + 2;
			drawThisBulletToNull( bullet[j] );
			bullet[j].Y = 30;
		}
}

void Game::judgeMath() {

	//int res_c; 1是个位数答案 2是十位数答案
	//int res_flag;   -1 错误,0 开始/看个位 1 个位正确看十位 2十位正确
	int flag = 0;
	//判断答案是个位数
	if (res_c == 1) {
		int num_b = num - '0';
		flag = judgeNumAndRes(num_b, res_b);
		//判断个位数是否正确(1*1=1)
		if (flag == 1) {
			//倍数 +1
			if (flagBuff <= 10) {
				flagBuff++;
			}
			SetPos(62, 8);
			cout << flagBuff << " 倍  ";
			//显示正确
			SetPos(70, 8);
			cout << "上题正确";
			//重新出题
			Sleep(80);
			printMath();
		} else {
			//倍数 -1
			if (flagBuff > 1) {
				flagBuff--;
			}
			SetPos(62, 8);
			cout << flagBuff << " 倍  ";
			//显示错误
			SetPos(70, 8);
			cout << "上题错误";
			//重新出题
			Sleep(80);
			printMath();
		}

	} else { //判断答案是十位数
		if (res_flag == 0) {
			//判断十位
			int num_a = num - '0';
			flag = judgeNumAndRes(num_a, res_a);
		} else {
			//判断个位
			int num_b = num - '0';
			flag = judgeNumAndRes(num_b, res_b);
		}



		if (flag == 1 && res_flag == 0) {
			//十位数正确
			res_flag = 1;

		} else if (flag == 0 && res_flag == 0) {
			//十位数不正确
			if (flagBuff > 1) {
				flagBuff--;
			}
			SetPos(62, 8);
			cout << flagBuff << " 倍  ";

			//显示错误
			SetPos(70, 8);
			cout << "上题错误";
			//重新出题
			Sleep(80);
			printMath();
		} else if (flag == 1 && res_flag == 1) {
			//个位数正确
			//倍数 +1
			//倍数 +1
			if (flagBuff <= 10) {
				flagBuff++;
			}
			SetPos(62, 8);
			cout << flagBuff << " 倍  ";

			//显示正确
			SetPos(70, 8);
			cout << "上题正确";
			res_flag = 0;

			//重新出题
			Sleep(80);
			printMath();
		} else if (flag == 0 && res_flag == 1) {
			//个位数不正确
			//倍数 -1
			if (flagBuff > 1) {
				flagBuff--;
			}
			SetPos(62, 8);
			cout << flagBuff << " 倍  ";

			//显示错误
			SetPos(70, 8);
			cout << "上题错误";
			res_flag = 0;
			//重新出题
			Sleep(80);
			printMath();
		} else {
			//显示异常
			SetPos(70, 8);
			cout << "异常";
			res_flag = 0;
			//重新出题
			printMath();
		}
	}

}

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::printMath() {
	math_a = rand() % 9 + 1;
	math_b = rand() % 9 + 1;
	int res = math_a * math_b;
	res_a = res / 10;
	res_b = res % 10;
	//如果答案是个位数
	if (res_a == 0) {
		res_c = 1;
		SetPos(60, 5);
		cout << math_a << " * " << math_b << " = " << "      ";
		//	cout<<math_a<<" * "<<math_b<<" = "<<res_b<<" ";
	} else {
		res_c = 2;
		SetPos(60, 5);
		cout << math_a << " * " << math_b << " = " << "      ";
		//	cout<<math_a<<" * "<<math_b<<" = "<<res_a<<res_b;
	}
}

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 == 6)
			title = "青铜飞行员";
		else if ( x == 5)
			title = "白银飞行员";
		else if ( x == 4)
			title = "黄金飞行员";
		else if ( x == 3 )
			title = "皇冠飞行员" ;
		else if ( x == 2 )
			title = "钻石飞行员";
		else if ( x == 1 )
			title = "王牌飞行员";
		else
			title = "无敌飞行员" ;
		cout << title;
	}
	rankf = rank;
}

void Game::Playing() {
	//HANDLE MFUN;
	//MFUN= CreateThread(NULL, 0, MusicFun, NULL, 0, NULL);


	drawEnemy();
	drawPlane();
	initMath();
	initBuff();

	int flag_bullet = 0;
	int flag_enemy = 0;
	int flag_buff = 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();
			judgeBuff();
		}
		flag_bullet++;
		if ( 5 == flag_bullet )
			flag_bullet = 0;

		/* 处理敌人 */
		if ( 0 == flag_enemy ) {
			drawEnemyToNull();
			enemyMove();
			drawEnemy();
			judgePlane();
		}

		/* 处理Buff */
		if ( 0 == flag_buff ) {
			/* 输出乘法 */
			//printMath();
			drawBuffToNull();
			buffMove();
			drawBuff();
			judgePlane();
		}

		flag_enemy++;
		flag_buff++;

		if ( flag_enemy >= rank )
			flag_enemy = 0;
		if ( flag_buff >= rank )
			flag_buff = 0;

		/* 输出得分 */
		printScore();
	}
}

void Game::GameOver() {
	system("cls");
	COORD p1 = {28, 9};
	COORD p2 = {53, 15};
	drawFrame(p1, p2, '=', '|');
	SetPos(36, 12);
	string str = "K.O.!";
	for (int i = 0; i < str.size(); i++) { //[警告]比较不同符号的整数表达式: ‘ int’和‘ std: : _ _ cxx11: : basic _ string < char > : : size _ type’{ aka‘ unsigned int’}[-Wsign-ratio ]
		Sleep(80);
		cout << str[i];
	}
	Sleep(1000);
	system("cls");
	drawFrame(p1, p2, '=', '!');
	SetPos(31, 11);
	cout << "击落敌机:" << plane << " 架";
	SetPos(31, 12);
	cout << "得  分:" << score;
	SetPos(31, 13);
	cout << "获得称号:" << title;
	SetPos(30, 16);
	Sleep(1000);
	cout << "继续? 是(y)| 否(n)\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();
}

希望我的作品会越来越好!

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C语言飞机大战小游戏是一个基于控制台的游戏,源代码中引用了plane.h头文件来定义游戏所需的函数和常量。main函数调用了game函数开始游戏,并在游戏结束后使用system("pause")来暂停程序。 在plane.h中,定义了Showmap函数用于打印地图,game函数用于调用开始游戏,Move函数用于控制飞机的移动,Buttle函数用于生成子弹,FadeButtle函数用于消除子弹,Plan函数用于生成敌机,FeoButtle函数用于生成敌机的子弹,Judge函数用于判断游戏的胜负。 在Plan函数中,使用了随机数种子srand((unsigned)time(NULL))来生成随机数,然后根据随机数来确定敌机的坐标。敌机的坐标不能与墙壁重合,也不能与我方飞机碰撞。当找到合适的坐标后,将地方飞机的数据设置为4,并打破循环。 通过调用这些函数和利用随机数生成敌机的坐标,可以实现一个简单的C语言飞机大战小游戏。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [C语言编写飞机大战游戏项目](https://blog.csdn.net/B85951005/article/details/126037896)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值