本文实例为大家分享了C语言实现空战游戏的具体代码,供大家参考,具体内容如下
一、项目描述和成果展示
项目描述: 在以往的程序中进行了改进。
例如: 可以发射多个子弹
可以有多个敌机
飞机大战 1.0版
飞机大战 2.0版
现在这个版本是3.0版 这个版本的各个功能基本完善
效果图如下:
二、发射多个子弹
代码如下:
#include<stdio.h>
#include<string.h>
#include<conio.h>
#include<Windows.h>
#define High 25 //游戏的尺寸
#define Width 50
//全局变量
int position_x,position_y;//飞机的位置
int canvas[High][Width]={0};
//二维数组存储游戏画布中对应的元素
//0为空格 1为飞机 2为子弹 3为敌机
void gotoxy(int x,int y)//将光标移动到(x,y)位置
{
HANDLE handle=GetStdHandle(STD_OUTPUT_HANDLE);
COORD pos;
pos.X=x;
pos.Y=y;
SetConsoleCursorPosition(handle,pos);
}
void startup()//数据的初始化
{
position_x=High/2;
position_y=Width/2;
canvas[position_x][position_y]=1;
}
void show()//显示画面
{
int i,j;
gotoxy(0,0);//将光标移动到原点位置,以下重画清屏
for(i=0;i<High;i++)
{
for(j=0;j<Width;j++)
{
if(canvas[i][j]==0)
printf(" ");//输出空格
else if(canvas[i][j]==1)
printf("*");//输出空格
else if(canvas[i][j]==2)
printf("|");//输出子弹
}
printf("\n");
}
}
void updateWithoutInput()//与用户输入无关的更新
{
int i,j;
for(i=0;i<High;i++)
{
for(j=0;j<Width;j++)
{
if(canvas[i][j]==2)//子弹向上移动
{
canvas[i][j]=0;
if(i>0)
canvas[i-1][j]=2;
}
}
}
}
void updateWithInput()//与用户输入有关的更新
{
char input;
if(kbhit())//判断是否有输入
{
input=getch();//根据用户的不同输入来移动
if(input=='a'||input=='A')
{
canvas[position_x][position_y]=0;
position_y--;//位置左移
canvas[position_x][position_y]=1;
}
else if(input=='d'||input=='D')
{
canvas[position_x][position_y]=0;
position_y++;//位置右移
canvas[position_x][position_y]=1;
}
else if(input=='w'||input=='W')
{
canvas[position_x][position_y]=0;
position_x--;//位置上移
canvas[position_x][position_y]=1;
}
else if(input=='s'||input=='S')
{
canvas[position_x][position_y]=0;
position_x++;//位置下移
canvas[position_x][position_y]=1;
}
else if(input==' ')//发射子弹
{
canvas[position_x-1][position_y]=2;
//发射子弹的初始位置在飞机的正上方
}
}
}
int main()
{
startup();//数据的初始化
while(1)//游戏循环执行
{
show();//显示画面
updateWithoutInput();//与用户输入无关的更新
updateWithInput();//与用户输入有关的更新
}
return 0;
}
效果图如下:
三、多个敌机
代码如下:
#include<stdio.h>
#include<string.h>
#include<conio.h>
#include<Windows.h>
#define High 25 //游戏的尺寸
#define Width 50
#define EnemyNum 5//敌机的个数
//全局变量
int position_x,position_y;//飞机的位置
int enemy_x[EnemyNum],enemy_y[EnemyNum];//敌机的位置
int canvas[High][Width]={0};
//二维数组存储游戏画布中对应的元素
//0为空格 1为飞机 2为子弹 3为敌机
int score;//得分
void gotoxy(int x,int y)//将光标移动到(x,y)位置
{
HANDLE handle=GetStdHandle(STD_OUTPUT_HANDLE);
COORD pos;
pos.X=x;
pos.Y=y;
SetConsoleCursorPosition(handle,pos);
}
void startup()//数据的初始化
{
int k;
position_x=High-1;
position_y=Width/2;
canvas[position_x][position_y]=1;
for(k=0;k<EnemyNum;k++)
{
enemy_x[k]=rand()%2;
enemy_y[k]=rand()%Width;
canvas[enemy_x[k]][enemy_y[k]]=3;
}
score=0;
}
void show()//显示画面
{
int i,j;
gotoxy(0,0);//将光标移动到原点位置,以下重画清屏
for(i=0;i<High;i++)
{
for(j=0;j<Width;j++)
{
if(canvas[i][j]==0)
printf(" ");//输出空格
else if(canvas[i][j]==1)
printf("*");//输出空格
else if(canvas[i][j]==2)
printf("|");//输出子弹
else if(canvas[i][j]==3)
printf("+");//输出敌机
}
printf("\n");
}
printf("得分:%3d\n",score);
Sleep(20);
}
void updateWithoutInput()//与用户输入无关的更新
{
int i,j,k;
for(i=0;i<High;i++)
{
for(j=0;j<Width;j++)
{
if(canvas[i][j]==2)//子弹向上移动
{
for(k=0;k<EnemyNum;k++)
{
if( (i==enemy_x[k])&&(j==enemy_y[k]) )//子弹击中敌机
{
score++;//分数加一
canvas[enemy_x[k]][enemy_y[k]]=0;
enemy_x[k]=rand()%2;//产生新的飞机
enemy_y[k]=rand()%Width;
canvas[enemy_x[k]][enemy_y[k]]=3;
canvas[i][j]=0;//子弹消失
}
}
//子弹向上移动
canvas[i][j]=0;
if(i>0)
canvas[i-1][j]=2;
}
}
}
for(k=0;k<EnemyNum;k++)
{
if( (position_x==enemy_x[k])&&(position_y==enemy_y[k]) )//敌机撞到我机
{
printf("失败\n");
Sleep(3000);
system("pause");
exit(0);
}
if(enemy_x[k]>High)//敌机跑出屏幕
{
canvas[enemy_x[k]][enemy_y[k]]=0;
enemy_x[k]=rand()%2;//产生新的飞机
enemy_y[k]=rand()%Width;
canvas[enemy_x[k]][enemy_y[k]]=3;
score--;//减分
}
static int speed=0;
if(speed<36)
speed++;
if(speed==36)
{
//敌机下落
for(k=0;k<EnemyNum;k++)
{
canvas[enemy_x[k]][enemy_y[k]]=0;
enemy_x[k]++;
speed=0;
canvas[enemy_x[k]][enemy_y[k]]=3;
}
}
}
}
void updateWithInput()//与用户输入有关的更新
{
char input;
if(kbhit())//判断是否有输入
{
input=getch();//根据用户的不同输入来移动
if(input=='a'||input=='A')
{
canvas[position_x][position_y]=0;
position_y--;//位置左移
canvas[position_x][position_y]=1;
}
else if(input=='d'||input=='D')
{
canvas[position_x][position_y]=0;
position_y++;//位置右移
canvas[position_x][position_y]=1;
}
else if(input=='w'||input=='W')
{
canvas[position_x][position_y]=0;
position_x--;//位置上移
canvas[position_x][position_y]=1;
}
else if(input=='s'||input=='S')
{
canvas[position_x][position_y]=0;
position_x++;//位置下移
canvas[position_x][position_y]=1;
}
else if(input==' ')//发射子弹
{
canvas[position_x-1][position_y]=2;
//发射子弹的初始位置在飞机的正上方
}
}
}
int main()
{
startup();//数据的初始化
while(1)//游戏循环执行
{
show();//显示画面
updateWithoutInput();//与用户输入无关的更新
updateWithInput();//与用户输入有关的更新
}
return 0;
}
效果图如下:
四、增加子弹升级功能
当分数达到一定的值自动升级炮弹,当分数下降一定数值后炮弹下降一个等级。
代码如下:
#include<stdio.h>
#include<string.h>
#include<conio.h>
#include<Windows.h>
#define High 25 //游戏的尺寸
#define Width 40
#define EnemyNum 5//敌机的个数
//全局变量
int position_x,position_y;//飞机的位置
int enemy_x[EnemyNum],enemy_y[EnemyNum];//敌机的位置
int canvas[High][Width]={0};
//二维数组存储游戏画布中对应的元素
//0为空格 1为飞机 2为子弹 3为敌机
int score;//得分
int BulletWidth;//子弹的宽度
int EnemyMoveSpeed;//敌机的移动速度
void gotoxy(int x,int y)//将光标移动到(x,y)位置
{
HANDLE handle=GetStdHandle(STD_OUTPUT_HANDLE);
COORD pos;
pos.X=x;
pos.Y=y;
SetConsoleCursorPosition(handle,pos);
}
void startup()//数据的初始化
{
int k;
position_x=High-1;
position_y=Width/2;
canvas[position_x][position_y]=1;
for(k=0;k<EnemyNum;k++)
{
enemy_x[k]=rand()%2;
enemy_y[k]=rand()%Width;
canvas[enemy_x[k]][enemy_y[k]]=3;
}
score=0;
BulletWidth=0;
EnemyMoveSpeed=20;
}
void show()//显示画面
{
int i,j;
gotoxy(0,0);//将光标移动到原点位置,以下重画清屏
for(i=0;i<High;i++)
{
for(j=0;j<Width;j++)
{
if(canvas[i][j]==0)
printf(" ");//输出空格
else if(canvas[i][j]==1)
printf("*");//输出空格
else if(canvas[i][j]==2)
printf("|");//输出子弹
else if(canvas[i][j]==3)
printf("+");//输出敌机
}
printf("\n");
}
printf("════════════════════════════════════════\n");
printf("得分:%3d\n",score);
system("date /t");
system("time /t");
Sleep(20);
}
//定义隐藏光标函数
void HideCursor()
{
CONSOLE_CURSOR_INFO cursor;
cursor.bVisible = FALSE;
cursor.dwSize = sizeof(cursor);
HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleCursorInfo(handle, &cursor);
}
void updateWithoutInput()//与用户输入无关的更新
{
int i,j,k;
for(i=0;i<High;i++)
{
for(j=0;j<Width;j++)
{
if(canvas[i][j]==2)//子弹向上移动
{
for(k=0;k<EnemyNum;k++)
{
if( (i-1==enemy_x[k])&&(j==enemy_y[k]) )//子弹击中敌机
{
score++;//分数加一
if(score%5==0&&EnemyMoveSpeed>3)//达到一定积分后敌机变快
EnemyMoveSpeed--;
if(score/5)//达到一定积分后子弹变厉害
{
BulletWidth=0;
BulletWidth=BulletWidth+score/5;
if(BulletWidth>5)//子弹加到一定威力后,会固定不变
BulletWidth=5;
}
canvas[enemy_x[k]][enemy_y[k]]=0;
enemy_x[k]=rand()%2;//产生新的飞机
enemy_y[k]=rand()%Width;
canvas[enemy_x[k]][enemy_y[k]]=3;
canvas[i][j]=0;//子弹消失
}
}
//子弹向上移动
canvas[i][j]=0;
if(i>0)
canvas[i-1][j]=2;
}
}
}
for(k=0;k<EnemyNum;k++)
{
if( (position_x==enemy_x[k])&&(position_y==enemy_y[k]) )//敌机撞到我机
{
printf("失败\n");
Sleep(3000);
system("pause");
exit(0);
}
if(enemy_x[k]>High)//敌机跑出屏幕
{
canvas[enemy_x[k]][enemy_y[k]]=0;
enemy_x[k]=rand()%2;//产生新的飞机
enemy_y[k]=rand()%Width;
canvas[enemy_x[k]][enemy_y[k]]=3;
score--;//减分
if(score%5==0&&score>0)//减的分数过多,子弹威力下降
{
BulletWidth--;
EnemyMoveSpeed++;
}
}
static int speed=0;
if(speed<EnemyMoveSpeed)
speed++;
if(speed==EnemyMoveSpeed)
{
//敌机下落
for(k=0;k<EnemyNum;k++)
{
canvas[enemy_x[k]][enemy_y[k]]=0;
enemy_x[k]++;
speed=0;
canvas[enemy_x[k]][enemy_y[k]]=3;
}
}
}
}
void updateWithInput()//与用户输入有关的更新
{
char input;
if(kbhit())//判断是否有输入
{
input=getch();//根据用户的不同输入来移动
if(input=='a'||input=='A')
{
canvas[position_x][position_y]=0;
position_y--;//位置左移
if(position_y==0)
position_y++;
canvas[position_x][position_y]=1;
}
else if(input=='d'||input=='D')
{
canvas[position_x][position_y]=0;
position_y++;//位置右移
if(position_y==Width-1)
position_y--;
canvas[position_x][position_y]=1;
}
else if(input=='w'||input=='W')
{
canvas[position_x][position_y]=0;
position_x--;//位置上移
if(position_x==0)
position_x++;
canvas[position_x][position_y]=1;
}
else if(input=='s'||input=='S')
{
canvas[position_x][position_y]=0;
position_x++;//位置下移
if(position_x==High)
position_x--;
canvas[position_x][position_y]=1;
}
else if(input==' ')//发射子弹
{
int left =position_y-BulletWidth;
int right=position_y+BulletWidth;
if(left<0)
left=0;
if(right>Width-1)
right=Width-1;
int k;
for(k=left;k<=right;k++)//发射子弹
canvas[position_x-1][k]=2;
//发射子弹的初始位置在飞机的正上方
}
}
}
int main()
{
startup();//数据的初始化
HideCursor();
system("title 游戏中");
system("color 09");
while(1)//游戏循环执行
{
show();//显示画面
updateWithoutInput();//与用户输入无关的更新
updateWithInput();//与用户输入有关的更新
}
return 0;
}
效果图如下:
五、增加一些小功能
增加一个主菜单
里面增加了一些小的功能
代码如下:
#include<stdio.h>
#include<string.h>
#include<conio.h>
#include<Windows.h>
#define High 25 //游戏的尺寸
#define Width 40
#define EnemyNum 5//敌机的个数
//全局变量
int position_x,position_y;//飞机的位置
int enemy_x[EnemyNum],enemy_y[EnemyNum];//敌机的位置
int canvas[High][Width]={0};
//二维数组存储游戏画布中对应的元素
//0为空格 1为飞机 2为子弹 3为敌机
int score;//得分
int BulletWidth;//子弹的宽度
int EnemyMoveSpeed;//敌机的移动速度
void gotoxy(int x,int y)//将光标移动到(x,y)位置
{
HANDLE handle=GetStdHandle(STD_OUTPUT_HANDLE);
COORD pos;
pos.X=x;
pos.Y=y;
SetConsoleCursorPosition(handle,pos);
}
void startup()//数据的初始化
{
int k;
position_x=High-1;
position_y=Width/2;
canvas[position_x][position_y]=1;
for(k=0;k<EnemyNum;k++)
{
enemy_x[k]=rand()%2;
enemy_y[k]=rand()%Width;
canvas[enemy_x[k]][enemy_y[k]]=3;
}
score=0;
BulletWidth=0;
EnemyMoveSpeed=20;
}
void show()//显示画面
{
int i,j;
gotoxy(0,0);//将光标移动到原点位置,以下重画清屏
for(i=0;i<High;i++)
{
for(j=0;j<Width;j++)
{
if(canvas[i][j]==0)
printf(" ");//输出空格
else if(canvas[i][j]==1)
printf("*");//输出空格
else if(canvas[i][j]==2)
printf("|");//输出子弹
else if(canvas[i][j]==3)
printf("+");//输出敌机
}
printf("\n");
}
printf("════════════════════════════════════════\n");
printf("得分:%3d\n",score);
system("date /t");
system("time /t");
printf("提示:按 z 键回到主菜单");
Sleep(20);
}
//定义隐藏光标函数
void HideCursor()
{
CONSOLE_CURSOR_INFO cursor;
cursor.bVisible = FALSE;
cursor.dwSize = sizeof(cursor);
HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleCursorInfo(handle, &cursor);
}
int updateWithoutInput()//与用户输入无关的更新
{
int i,j,k;
for(i=0;i<High;i++)
{
for(j=0;j<Width;j++)
{
if(canvas[i][j]==2)//子弹向上移动
{
for(k=0;k<EnemyNum;k++)
{
if( (i-1==enemy_x[k])&&(j==enemy_y[k]) )//子弹击中敌机
{
score++;//分数加一
if(score%5==0&&EnemyMoveSpeed>3)//达到一定积分后敌机变快
EnemyMoveSpeed--;
if(score/5)//达到一定积分后子弹变厉害
{
BulletWidth=0;
BulletWidth=BulletWidth+score/5;
if(BulletWidth>5)//子弹加到一定威力后,会固定不变
BulletWidth=5;
}
canvas[enemy_x[k]][enemy_y[k]]=0;
enemy_x[k]=rand()%2;//产生新的飞机
enemy_y[k]=rand()%Width;
canvas[enemy_x[k]][enemy_y[k]]=3;
canvas[i][j]=0;//子弹消失
}
}
//子弹向上移动
canvas[i][j]=0;
if(i>0)
canvas[i-1][j]=2;
}
}
}
for(k=0;k<EnemyNum;k++)
{
if( (position_x==enemy_x[k])&&(position_y==enemy_y[k]) )//敌机撞到我机
{
system("cls");
printf("失败\n");
printf("得分:%d\n",score);
printf("正在返回主菜单\n");
Sleep(3000);
return 1;
}
if(enemy_x[k]>High)//敌机跑出屏幕
{
canvas[enemy_x[k]][enemy_y[k]]=0;
enemy_x[k]=rand()%2;//产生新的飞机
enemy_y[k]=rand()%Width;
canvas[enemy_x[k]][enemy_y[k]]=3;
score--;//减分
if(score%5==0&&score>0)//减的分数过多,子弹威力下降
{
BulletWidth--;
EnemyMoveSpeed++;
}
}
static int speed=0;
if(speed<EnemyMoveSpeed)
speed++;
if(speed==EnemyMoveSpeed)
{
//敌机下落
for(k=0;k<EnemyNum;k++)
{
canvas[enemy_x[k]][enemy_y[k]]=0;
enemy_x[k]++;
speed=0;
canvas[enemy_x[k]][enemy_y[k]]=3;
}
}
}
return 0;
}
void updateWithInput(char input)//与用户输入有关的更新
{
if(input=='a'||input=='A')
{
canvas[position_x][position_y]=0;
position_y--;//位置左移
if(position_y==0)
position_y++;
canvas[position_x][position_y]=1;
}
else if(input=='d'||input=='D')
{
canvas[position_x][position_y]=0;
position_y++;//位置右移
if(position_y==Width-1)
position_y--;
canvas[position_x][position_y]=1;
}
else if(input=='w'||input=='W')
{
canvas[position_x][position_y]=0;
position_x--;//位置上移
if(position_x==0)
position_x++;
canvas[position_x][position_y]=1;
}
else if(input=='s'||input=='S')
{
canvas[position_x][position_y]=0;
position_x++;//位置下移
if(position_x==High)
position_x--;
canvas[position_x][position_y]=1;
}
else if(input==' ')//发射子弹
{
int left =position_y-BulletWidth;
int right=position_y+BulletWidth;
if(left<0)
left=0;
if(right>Width-1)
right=Width-1;
int k;
for(k=left;k<=right;k++)//发射子弹
canvas[position_x-1][k]=2;
//发射子弹的初始位置在飞机的正上方
}
}
void gamemenu()//游戏菜单
{
int temp=0;
int i,j;
char input;
for(i=0;i<High;i++)//数组初始化
{
for(j=0;j<Width;j++)
{
canvas[i][j]=0;
}
printf("\n");
}
startup();//数据的初始化
system("cls");
while(1)
{
show();//显示画面
temp=updateWithoutInput();//与用户输入无关的更新
if(kbhit())//判断是否有输入
{
input=getch();
updateWithInput(input);//与用户输入有关的更新
if(input=='z'||input=='Z')
temp=1;
}
if(temp==1)
{
system("cls");
break;
}
}
}
void help()//帮助菜单
{
char input;
system("cls");
printf("\n\n\n\n\n\n\n\n");
printf("---------------------------------------\n");
printf(" 帮助菜单 \n\n");
printf(" 1. 按空格发射炮弹 \n");
printf(" 2. a 键左移 \n");
printf(" 3. d 键右移 \n");
printf(" 4. w 键上移 \n");
printf(" 5. s 键下移 \n");
printf("---------------------------------------\n");
printf("\n\n提示:按 z 键回到主菜单\n");
printf("\n\n 祝您玩的愉快!\n");
while(1)
{
input=getch();
if(input=='z')
{
break;
}
}
}
void quit()//退出菜单
{
exit(0);
}
void menu()//主菜单
{
char change;
system("cls");
printf("\n--------------------------------------------\n");
printf(" 8\n");
printf(" 88\n");
printf(" 888\n");
printf(" 8888\n");
printf(" 8888888888888\n");
printf(" 8888\n");
printf(" 888\n");
printf(" 88\n");
printf(" 8\n");
printf("\n\n\n Welcome to fly war!\n");
printf("\n\n\n\n");
printf(" 主菜单 \n\n");
printf(" 1. 进入游戏 \n");
printf(" 2. 帮助菜单 \n");
printf(" 3. 退出游戏 \n");
printf("---------------------------------------\n");
printf("\n\n 祝您玩的愉快!\n");
change=getch();
switch(change)
{
case '1':
gamemenu();//游戏菜单
break;
case '2':
help();//帮助菜单
break;
case '3':
quit();//退出菜单
break;
}
}
int main()
{
HideCursor();
system("title 游戏中");
system("color 09");
system("mode 50,30");
while(1)//游戏循环执行
{
menu();
}
return 0;
}
效果图如下:
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程网。