C++:简易的空战游戏

孤街醉人 提交于 2020-08-12 08:59:21

1.游戏编写的基本思路:

**0.建立x,y轴:**横向表示y轴,纵向表示x轴,零点在左上角。
定义飞机的位置为position_x, position_y,按下“WASD”分别使position_x, position_y的值增大或减小以实现飞机移动。
定义子弹的位置为bullet_x, bullet_y,定义敌机位置enemy_x, enemy_y,定义得分score,定义等级level,定义难度hard。
利用gotoxy函数防止屏幕闪烁,利用HideCursor()函数隐藏光标,使画面平静,防止闪烁。


(主函数中调用了5个函数)
**1.startshow():**显示开始界面。其中包含了对游戏操作的说明。

**2.startup():**数据初始化。定义了游戏界面x轴为18,y轴为30,飞机的初始位置、子弹和敌机的位置、分数、等级、难度的初始化。

然后在while(分数>=0)中的循环里包含了以下3个函数。

*3.show():显示画面。调用gotoxy(0,0),使光标移动到原点位置,以下重画清屏。输出飞机“”,输出子弹“o”,输出敌机“@”,并输出显示分数、等级等信息。

**4.updateWithoutInput():**与用户输入无关的更新。关于一些自动更新。当飞机的位置与敌机的位置重合时,分数减1,敌机纵坐标为0,横坐标在界面内随机出现,飞机位置更新到界面中间。分数减至负数,则游戏失败,并停止游戏。当子弹的位置和敌机的位置重合时,则分数加1,敌机纵坐标为0,横坐标在界面内随机出现。每当分数达到10的倍数,则游戏等级加1,游戏难度增加,即敌机下降速度加快,等级增加到6级,游戏胜利,并停止游戏。

**5.updateWithInput():**与用户输入有关的更新。关于用户输入信息的更新。分别按“WASD”控制飞机的移动,并控制飞机只能在规定界面内移动,防止玩家操控飞机飞出边界。按“空格键”输出子弹。按“ESC”暂停游戏。按“任意键”继续游戏。

2.源代码

#include<iostream>
#include<stdlib.h>
#include<conio.h>
#include<windows.h>
using namespace std;

//函数外全局变量定义
int position_x, position_y;  //飞机位置
int bullet_x, bullet_y;  //子弹位置
int high, width;   //游戏的画面尺寸
int enemy_x, enemy_y;  //敌机位置
int score;  //游戏得分
int level;  //游戏等级
int hard;  //游戏难度

void HideCursor()  //隐藏光标
{
	CONSOLE_CURSOR_INFO cursor_info = { 1,0 };  //第二个值为0表示隐藏光标
	SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info);
}

void gotoxy(int x, int y)  //光标移动到(x,y)位置,并清屏 (防止屏闪)
{
	HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
	COORD pos;
	pos.X = x;
	pos.Y = y;
	SetConsoleCursorPosition(handle, pos);
}

void startshow()
{

	char defence[18][30] = {};  //边框
	for (int k = 0; k < 18; k++)
	{
		defence[k][0] = '*';
		defence[k][29] = '*';
		for (int l = 0; l < 30; l++)
		{
			if (k == 0 || k == 17)
			{
				defence[k][l] = '*';
			}
		}
	}

	for (int k = 0; k < 18; k++)
	{
		for (int l = 0; l < 30; l++)
		{
			cout << " " << defence[k][l];
		}
		cout << endl;
	}

	gotoxy(0, 0);  //将光标移动到原点

	for (int i = 0; i < 7; i++)
		cout << '\n';
	for (int i = 0; i < 13; i++)
		cout << " ";
	cout << "Welcome!" << endl;
	for (int i = 0; i < 13; i++)
		cout << " ";
	cout << "Press 'W' 'A' 'S' 'D'  to move around!" << endl;
	for (int i = 0; i < 13; i++)
		cout << " ";
	cout << "Press 'Spacekey' to attack!" << endl;
	for (int i = 0; i < 13; i++)
		cout << " ";
	cout << "Press 'Enter' to start!" << endl;
	for (int i = 0; i < 13; i++)
		cout << " ";
	cout << "By  全栈攻城师." << endl;

	gotoxy(0, 0);  //将光标移动到原点
	for (int i = 0; i < 7; i++)
		cout << '\n';
	cout << " *" << endl << " *" << endl << " *" << endl << " *" << endl << " *" << endl;
	cin.get();
	system("cls");
	return;
}

void startup() //数据初始化
{
	high = 18;
	width = 30;

	position_x = high / 2;
	position_y = width / 2;

	bullet_x = -1;
	bullet_y = position_y;

	enemy_x = 0;
	enemy_y = width / 2;

	score = 1;

	level = 1;
	hard = 20;

	HideCursor();  //隐藏光标

}

void show() //显示画面
{
	int i, j;

	gotoxy(0, 0);  //光标移动到原点位置,以下重画清屏

	for (i = 0; i < high; i++)
	{
		for (j = 0; j < width; j++)
		{
			if ((i == position_x) && (j == position_y))
				cout << "***";//输出飞机
			else if ((i == bullet_x) && (j == bullet_y))
				cout << "o";  //输出子弹
			else if ((i == enemy_x) && (j == enemy_y))
				cout << "@";  //输出敌机
			else
				cout << " ";  //输出空格
		}
		cout << '\n';
	}

	cout << "Score:" << score - 1 << endl;
	cout << "Level:" << level << endl;
	cout << "By 全栈攻城师." << endl;
}

void updateWithoutInput() //与用户输入无关的更新
{

	if ((bullet_x == enemy_x) && (bullet_y == enemy_y))
	{
		score++;
		enemy_x = 0;
		enemy_y = rand() % width;
		bullet_x = -1;
	}

	if ((enemy_x == position_x) && (enemy_y == position_y)|| 
		(enemy_x == position_x) && (enemy_y == position_y + 1)|| (enemy_x == position_x) && (enemy_y == position_y + 2))
	{
		score--;
		enemy_x = 0;
		enemy_y = rand() % width;
		position_x = high / 2;
		position_y = width / 2;
	}

	if (score % 10 == 0 && score != 0)
	{
		level++;
		if (hard > 0)
			hard -= 5;
		score++;
	}
	static int speed = 0;
	if (speed < hard)  //使敌机下落速度变慢
		speed++;

	if (bullet_x > -1)
		bullet_x--;

	if (enemy_x > high)
	{
		enemy_x = 0;
		enemy_y = rand() % (width-4);
		score--;
	}

	else
	{
		if (speed == hard)
		{
			enemy_x++;
			speed = 0;
		}
	}

}

void updateWithInput()  //与用户输入有关的更新
{
	char input;

	if (_kbhit())  //当按键时执行
	{
		input = _getch();

		if (input == 'a'&& position_y > 0)
			position_y--;
		if (input == 'd'&& position_y < 27)
			position_y++;
		if (input == 'w'&& position_x > 0)
			position_x--;
		if (input == 's'&& position_x < 17)
			position_x++;
		if (input == ' ')
		{
			bullet_x = position_x - 1;
			bullet_y = position_y + 1;
		}
		if (input == 27)  //按esc暂停游戏,按任意键继续游戏
			system("pause");
	}
}

int main()
{
	startshow();  //开始界面
	startup();  //数据初始化
	while ((score-1) >= 0)  //游戏循环执行
	{
		show();  
		updateWithoutInput(); 
		updateWithInput(); 
		if (level == 6)
			break;
	}

	system("cls");

	if (level == 6)  //等级达到6级则胜利
	{
		for (int i = 0; i < 13; i++)
			cout << " ";
		cout << "Victory!" << endl;
	}
	else
	{
		for (int i = 0; i < 13; i++)
			cout << " ";
		cout << "Defeat!" << endl;
	}

	system("pause");

}

3.程序测试用例:

开始界面:
在这里插入图片描述
游戏界面:
在这里插入图片描述


4.注意:

刚开始用system(“cls”)进行清屏,会发现屏幕闪烁严重,后来用gotoxy函数防止屏幕闪烁,并利用HideCursor()函数隐藏光标,使画面平静,防止闪烁。

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!