使用C/C++开发一个字符版的飞机大战,玩家可以上下左右移动,空格键开火,子弹为激光,敌机可以自我移动,玩家发射的激光如果击中敌机,绘画简易版爆炸效果。
开发环境:Dev-C++ 5
介绍:使用表示主角飞机,使用表示敌机,使用表示敌机被击中的形态,使用表示正在开火的主角飞机,"|"表示激光。当敌机被击中后,分数score++并且在一个随机的位置生成新的敌机,这里限制了敌机只能在第0行到第4行以及第0列到第width-3列交错的区域内移动,通过多次循环移动一次敌机,确保了玩家飞机的机动性更强。
制作过程:
使用x、y变量记录主角飞机的左上角顶点位于第x行第y列;
使用target_x、target_y变量记录敌机的左上角顶点位于第target_x行第target_y列;
使用target_x_v、target_y_v变量记录敌机垂直方向和水平方向的速度;
使用isFire记录玩家是否按下了开火键,如果玩家按空格键开火,将1赋值给isFire变量,当发射完激光后,将0重新赋值回isFire;
使用score记录分数,击中敌机,分数+1;
使用input记录玩家按下的按键,使用getch()可以不按下回车就触发按键事件;
使用width和height记录游戏区域共有width列height行;
使用count记录第几次循环了,每到第五次循环,敌机进行一次移动。
int i,j;
int x = 15;
int y = 10;
int score = 0;
int isFire = 0;
int target_x = 1;//敌机点坐标
int target_y = 1;
int target_x_v = 1;//敌机纵向速度,值为正数向下移动,值为负数向上移动
int target_y_v = 1; //敌机横向速度,值为正数向右移动,值为负数向左移动
int width = 40;
int height = 22;
int count = 0;//每循环五次,敌机移动一次
char input;
由于使用传统的system("cls")清屏会有严重的闪烁效果,这里使用windows.h下的SetConsoleCursorPosition(Handle handle,COORD pos)来将光标进行移动pos点处,每次循环前先执行下该方法,从而实现清屏效果。
//将光标移动到(x,y)处,实现清屏效果
void goToXY(int x,int y){
HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
COORD pos;
pos.X = x;
pos.Y = y;
SetConsoleCursorPosition(handle,pos);
}
除此之外,光标的闪烁效果也是比较严重的,这里可以使用HideCursor()函数对光标进行隐藏。
//隐藏光标
void HideCursor(){
CONSOLE_CURSOR_INFO cursor_info = {1,0};
SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE),&cursor_info);
}
重点说下打印玩家飞机和敌机以及碰撞检测: