首发地址:https://www.cnblogs.com/saw96x/p/12465195.html
笔者也算是学了小半年的c++,之前都停留在控制台做做题,最近觉得这样实在是差点成就感,于是就想试试写一写简单的小游戏,在用打砖块,flappy bird等小游戏练练手后,在查阅书籍,查找一些网络资料后写了一个完成度还算高的空战小游戏的控制台应用,希望能对其他觉得迷茫的c++新手提供一些方向
游戏的完成效果:
先看看游戏的主要框架:
#include<iostream>
#include<cstdlib>
#include<conio.h>
#include<windows.h>
using namespace std;
//宏定义
#define High 15 //游戏界面高度
#define Width 25 //游戏界面宽度
#define EnemyNum 6 //敌机数量
//全局变量
int pos_x,pos_y; //飞机坐标
int canvas[High][Width]={
0}; //背景画布,用二维数组表示
int enemy_x[EnemyNum],enemy_y[EnemyNum]; //敌机的坐标,因为有多架敌机,用一维数组表示
int BulletWidth; //子弹宽度,实现散弹功能
int EnemySpeed; //敌机速度,实现动态难度
int score; //得分
复制代码
复制代码
int main(){
HideCursor();//隐藏光标
startup();//游戏参数初始化
while(1){
//循环保持游戏进程
show();//输出游戏画面
UpdateWithoutInput();//与用户输入无关的数据更新
UpdateWithInput();//与用户输入有关的数据更新
}
return 0;
}
大部分简单的游戏实现都可以依靠这类框架实现,还可以增加一个判断游戏是否进行函数作为循环条件,增加重新开始游戏的功能函数等等,这些就留给读者实现吧
让我们按顺序来看看这些函数的原理和实现方法吧
首先是隐藏光标函数,作为控制台应用,有个光标在屏幕乱闪肯定极其破坏游戏体验,那么就需要隐藏它。来看看这个函数长什么样:
void HideCursor(){
CONSOLE_CURSOR_INFO cursor_info={
1,0};
SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE),&cursor_info);
}
这个函数的原理呢,我也不知道,是在网上抄的,windows.h头文件的详细解析在网上笔者没有找到,如果读者能对其有所了解自然是再好不过了
然后是游戏参数的初始化,这个函数也毫无理解难度:
void startup(){
pos_x=High-1; //x是纵坐标
pos_y=Width/2; //y是横坐标
canvas[pos_x][pos_y]=1; //在画布中飞机相应的位置设定值为1,表示这个位置是飞机
for(int i=0;i<EnemyNum;i++){
//给每架敌机设定随机的出现位置
enemy_y[i]=rand()%Width;
enemy_x[i]=rand()%2;
canvas[enemy_x[i]][enemy_y[i]]=3; //在画布中敌机相应的位置设定值为3,表示这个位置是敌机
}
score=0;
BulletWidth=0;
EnemySpeed=13; //速度其实是刷新的时间间隔,因此速度越小速度越快
}
接下来是输出游戏画面的函数了,算是重头戏:
void show(){
gotoxy(0,0); //让输出内容的光标回到左上角
for(int i=0;i<High;i++){
//这两行是对画布元素值
for(int j=0;j<Width;j++){
//逐一扫描
if(canvas[i][j]==0) //如果值为0
printf(" "); //输出空格,表示空白
else if(canvas[i][j]==1) //如果值为1
printf("*"); //输出*,表示飞机
else if(canvas[i][j]==2) //如果值为2
printf("|"); //输出|,表示子弹
else if(canvas[i][j]==3) //如果值为3
printf("@"); //输出@,表示敌机
}
printf("\n"); //扫描完一行,换行开始下一行
}
printf("Score:%3d\n",score); //输出分数
Sleep(20); //停留2毫秒,作为刷新频率
}
大概讲解一下输出画面的思路。首先将二维数组作为画布背景,其中的元素值代表画面上的游戏对象,如果值是0,就说明此处是空白;如果是1,代表是飞机;如果是2,代表是飞机发射的子弹;如果是3,代表是敌机。然后通过对此画布二维数组遍历,通过其值来判断输出的内容。那么怎么实现动画效果呢,当再一次调用此函数时,第一行的gotoxy(0,0)会将输出光标移动到窗口左上角,此时再次输出画面,就会实现其中元素的移动效果啦,gotoxy不是标准库函数,同样需要window.h来自己编写,具体原理不用管,直接copy使用就是了:
void gotoxy(int x,