【C/C++小游戏】控制台飞机大战

  • 谁说控制台只能用来刷题?
  • 谁说做游戏只能用第三方库?
  • 控制台当然能用来做游戏! 

只需要三个头文件(指 devc++),那就是:

bits/stdc++.h        万能头文件,不用说了

conio.h                 专门检测键盘按键

windows.h            这是最重要的一个,能对控制台最很多风骚操作!

代码放在最后面,来看看有哪些特殊操作!

1  gotoxy 函数:

这是一个常用的函数,虽然要自己写。它的作用是用来移动光标到特定的位置,输出的内容会覆盖原来的内容。

2  setsize 函数:

用 system 命令实现在 cmd 中输入指令,调整窗口大小。

3  color 函数

改变输出文字的颜色(前景、背景)。

数字对应的颜色,参考文章:C++ 设置控制台字体主题,颜色和背景颜色_爱学习的蓝调的博客-优快云博客_setconsolecolor

4  HideCursor 函数:

把光标隐藏了,要不然那玩意儿闪来闪去,看得难受。 

好了,就这些函数,直接抄!

其余的代码就是飞机大战的算法,没什么难度。 

#include <bits/stdc++.h>
#include <conio.h>
#include <windows.h>
#define width 40
#define height 12
#define enemynum 4
using namespace std;

int posx, posy;
int score;
int canvas[height][width];
int enemy_x[enemynum], enemy_y[enemynum];
int enemyspeed;
int speed;
bool home;

void setsize(int col, int row)
{
	char cmd[64];
	sprintf(cmd, "mode con cols=%d lines=%d", col, row);
	system(cmd);
}

void color(int fore, int back)
{
	SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), (back << 4) + fore);
}

void gotoxy(int x, int y)
{
	HANDLE hout;
	COORD pos;
	pos.X = x;
	pos.Y = y;
	hout = GetStdHandle(STD_OUTPUT_HANDLE);
	SetConsoleCursorPosition(hout, pos);
} 

void HideCursor()
{
	CONSOLE_CURSOR_INFO cursor_info = {1, 0};
	SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info);
}

void Init()
{
	posx = 8;
	posy = 5;
	score = 0;
	enemyspeed = 8;
	speed = 0;
	canvas[posx][posy] = 1;
	home = false;
	for (int i = 0; i < enemynum; i++)
	{
		enemy_x[i] = rand() % (height - 2) + 1;
		enemy_y[i] = width - 2 - rand() % 2;
		canvas[enemy_x[i]][enemy_y[i]] = 2;
	}
}

void Show(bool hidescore)
{
	for (int i = 0; i < height; i++)
	{
		for (int j = 0; j < width; j++)
		{
			if (i == 0 || i == height-1 || j == 0 || j == width - 1)
			{
				color(0, 6);
				printf(" ");
			}
			else if (canvas[i][j] == 0)
			{
				color(0, 14);
				printf(" ");
			}
			else if (canvas[i][j] == 1)
			{
				color(9, 14);
				
				printf(">");
			}
			else if (canvas[i][j] == 2)
			{
				color(4, 14);
				printf("*");
			}
			else if (canvas[i][j] == 3)
			{
				color(9, 14);
				printf("-");
			}
			color(15, 0);
		}
		printf("\n");
	}
	if (!hidescore)
	{
		color(0, 6);
		printf("               ");
		color(8, 6);
		printf("Score: %2d", score);
		color(0, 6);
		printf("                \n");
		printf("                                        \n");
		color(15, 0);
	}
}

void Update()
{
	if (posx <= 0) posx = 1;
	if (posx >= height - 1) posx = height - 2; 
	canvas[posx][posy] = 1;
	speed++;
	if (speed == enemyspeed)
	{
		speed = 0;
		for (int i = 0; i < enemynum; i++)
		{
			canvas[enemy_x[i]][enemy_y[i]] = 0;
			enemy_y[i]--;
			if (enemy_y[i] <= 0)
			{
				enemy_x[i] = rand() % (height - 2) + 1;
				enemy_y[i] = width - 2 - rand() % 2;
			}
			canvas[enemy_x[i]][enemy_y[i]] = 2;
		}
	}
	if (canvas[posx][posy] == 2 || score < 0)
	{
		color(4, 14);
		printf("Game Over!\n");
		printf("Press Any Button To Continue...\n");
		system("pause");
		home = true;
		color(15, 0);
	}
	for (int i = 0; i < height; i++)
	{
		for (int j = width - 1; j >= 0; j--)
		{
			if (canvas[i][j] == 3)
			{
				int hide = false;
				for (int k = 0; k < enemynum; k++)
				{
					if (enemy_x[k] == i && enemy_y[k] == j + 1)
					{
						canvas[i][j+1] = 0;
						canvas[i][j] = 0;
						hide = true;
						enemy_x[k] = rand() % (height - 2) + 1;
						enemy_y[k] = width - 2 - rand() % 2;
						canvas[enemy_x[k]][enemy_y[k]] = 2;
						score++;
					}
				} 
				canvas[i][j] = 0;
				if (j <= width - 2 && !hide) canvas[i][j+1] = 3;
			}
		}
	}
	for (int k = 0; k < enemynum; k++)
	{
		if (enemy_y[k] == 1)
		{
			canvas[enemy_x[k]][enemy_y[k]] = 0;
			enemy_x[k] = rand() % (height - 2) + 1;
			enemy_y[k] = width - 2 - rand() % 2;
			canvas[enemy_x[k]][enemy_y[k]] = 2;
			score--;
		}
	}
}

void Input()
{
	char input;
	if (_kbhit())
	{
		input = _getch();
		if (input == 'w')
		{
			canvas[posx][posy] = 0;
			posx -= 1;
		}
		else if (input == 's')
		{
			canvas[posx][posy] = 0;
			posx += 1;
		}
		else if (input == ' ')
		{
			canvas[posx][posy+1] = 3;
		}
	}
}

void Home()
{
	setsize(width, height+3);
	gotoxy(0, 0);
	Show(true);
	gotoxy(15, 3);
	color(12, 14);
	printf("飞机大战");
	gotoxy(12, 5);
	printf("Plane Fighting");
	Sleep(50);
	gotoxy(6, 7);
	printf("Press Any Button To Start...");
	gotoxy(10, 8);
	system("pause");
	gotoxy(0, 0);
}

int main(){
	SetWindowLongPtrA(GetConsoleWindow(), GWL_STYLE, GetWindowLongPtrA(GetConsoleWindow(),GWL_STYLE)& ~WS_SIZEBOX & ~WS_MAXIMIZEBOX & ~WS_MINIMIZEBOX);
	SetConsoleTitle("飞机大战");
	setsize(width, height+3);
	home = false;
	while (true)
	{
		setsize(width, height+3);
		memset(canvas, 0, sizeof(canvas));
		system("cls");
		HideCursor();
		Home();
		Init();
		while (true)
		{
			Show(false);
			Update();
			Input();
			gotoxy(0, 0);
			HideCursor();
			Sleep(20);
			if (home)
				break;
		}
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值