- 谁说控制台只能用来刷题?
- 谁说做游戏只能用第三方库?
- 控制台当然能用来做游戏!
只需要三个头文件(指 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;
}
}
}