目录
前言
声明:本游戏参考《c语言课程设计与游戏开发实践教程》。
空战游戏视频效果如下:
空战
- 这里我做的飞机就是一个单独的符号,可以通过键盘控制飞机飞行并且发射子弹(可以连续发射子弹)。
- 有一定数量的多台敌机,敌机会以一定速度向前飞行。发射子弹可以消灭敌机,如果和敌机相撞或者没有击中敌机会game over!
- 我之前发过飞机游戏1.0和2.0,这个3.0相比于上一款,可以出现多台敌机,发射子弹可以连续进行,画面效果也各更加稳定。当然,代码长度也会更长,大概将近两百行代码。
知识点
- 二维数组,循环,if语句。这三个是本游戏用到的重点。学会这个游戏之后可以让你对二维数组的理解更加深刻。同时,因为整个程序几乎都是在while(1)循环中,所以不同函数和语句之间的不同顺序都会影响到程序的进行,还请大家仔细体会。
- gotixy函数,rand函数,方便的getch函数,kbhit函数,隐藏光标函数。如果对这个几个函数不了解,可以看该文章:http://t.csdn.cn/RGzD1(文章目录就可以找到函数介绍)。
- static:该类型修饰的变量只在该函数内生效,并且在该函数调用结束之后该数据可以保存。如果运用在全局变量,那么该变量只在这个文件中生效。
完整代码如下🐎(代码中附有详解哦)
完整代码
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <conio.h>
#define high 25
#define width 50
#define enemy_num 5
int x,y; //飞机位置
int a[high][width]={0}; //二维数组
int enemy_x[enemy_num],enemy_y[enemy_num];
//储存多台敌机坐标
int score;
//0为空格,1为飞机,2为子弹 ,3为敌机
void gotoxy(int x,int y)
{
HANDLE handle=GetStdHandle(STD_OUTPUT_HANDLE);
COORD pos;
pos.X=x;
pos.Y=y;
SetConsoleCursorPosition(handle,pos);
}
void HideCursor()
{
CONSOLE_CURSOR_INFO cursor_info={1,0};
SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE),&cursor_info);
}
void start() //该函数用于初始化数据
{
x=width/2;
y=high-1;
a[y][x]=1;
score=0;
int i;
for(i=0;i<enemy_num;i++)
{
enemy_x[i]=rand()%width;
enemy_y[i]=rand()%2;
a[enemy_y[i]][enemy_x[i]]=3;
}
}
void show() //该函数用于显示画面
{
gotoxy(0,0);
int i,n;
for(i=0;i<high;i++)
{
for(n=0;n<width;n++)
{
if(a[i][n]==0)
printf(" ");
else
if(a[i][n]==1)
printf("+");//这是飞机
else
if(a[i][n]==2)
printf("|");
else
if(a[i][n]==3)
printf("!");
}
printf("|");
printf("\n");
}
for(n=0;n<width;n++)
printf("-");
printf("\n");
printf("击败敌机数量为%d驾\n",score);
}
void unput() //该函数用于实现敌机下落、敌机被击中后重现、敌机与飞机碰撞等基本功能
{
int i,n,t,k;
for(i=0;i<high;i++)
{
for(n=0;n<width;n++)
{
if(a[i][n]==2)
{
for(k=0;k<enemy_num;k++)
{
if((i==enemy_y[k])&&(n==enemy_x[k]))
{
score++;
a[enemy_y[k]][enemy_x[k]]=0;
enemy_y[k]=rand()%2;
enemy_x[k]=rand()%width;
a[enemy_y[k]][enemy_x[k]]=3;
a[i][n]=0;
}
a[i][n]=0;
if(i>0)
a[i-1][n]=2;
}
}
}
}
//让敌机自然下落,但是减慢敌机前进速度
static int speed=0;
if(speed<20)
speed++;
//如果碰到敌机就game over!
for(t=0;t<enemy_num;t++)
{//很多程序都在这个循环运行
if((enemy_y[t]==y)&&(enemy_x[t]==x))
{
printf("Game Over!\n");
system("pause");
exit(0);
}
if(enemy_y[t]>high)
{
a[enemy_y[t]][enemy_x[t]]=0;
enemy_y[t]++;
a[enemy_y[t]][enemy_x[t]]=3;
score--;
}
//如果敌机跑出屏幕还未被击败,分数-1
}
//循环20次敌机下落一次
if(speed==20)
{
for(t=0;t<enemy_num;t++)
{
a[enemy_y[t]][enemy_x[t]]=0;
enemy_y[t]++;
speed=0;
a[enemy_y[t]][enemy_x[t]]=3;
}
}
}
void put() //该函数可以让用户可以通过键盘控制飞机方向和发射子弹。
{
char move;
if(kbhit())
{
move=getch();
if(move=='a')
{
a[y][x]=0;
x--;
a[y][x]=1;
//位置移动之后原来的位置值从1变为0,现在的位置从0变为1
}
if(move=='d')
{
a[y][x]=0;
x++;
a[y][x]=1;
}
if(move=='w')
{
a[y][x]=0;
y--;
a[y][x]=1;
}
if(move=='s')
{
a[y][x]=0;
y++;
a[y][x]=1;
}
if(move==' ')
{
a[y-1][x]=2;
}
}
}
int main()
{
start();
while(1)
{
show();
unput();
put();
HideCursor();
}
return 0;
}
//当你不明白这个程序为什么这样做、为什么不像我想象的那样做的时候,先看下去整体看一遍,搞明白他整体想干什么,
//第一次看的时候不要纠结局部 ,等你搞明白他为什么这样做之后你再创新
大致思路
- 整个画面存放于一个二维数组之中,通过给不同的数组赋不同的值,然后分别让不同的值显示不同的画面,这样就呈现出一个矩阵。其中数组值是0为空格,1为飞机,2为子弹 ,3为敌机。
- 通过函数start给不同数组分别赋值0、1、2、3,接下来在函数show中让不同值的数组输出不同的内容,这样画面就呈现出矩阵。注意start函数被引用时一定要放在主函数中的while(1)外面,因为假如start放在里面,数据就会一直被初始化,没有办法移动。
- 呈现出基本画面之后,开始实现功能。所有功能几乎都在unput函数中实现。这里会实现敌机的自然下落、敌机被击中后消失并且随即重现、敌机与飞机碰撞后游戏结束。
- put函数就是可以使用户通过键盘来控制飞机上下左右飞行,按空格发射子弹。
- 主函数中,先在while(1)中调用start函数初始化数据,再把其他函数调用放在while(1)中。这样可以使程序一直运行。
如果有不懂的地方可以随时问我
就酱,拜拜~