当前位置:首页 > 开发教程 > C语言 >

C语言实现空战游戏

时间:2022-05-16 13:32 来源:未知 作者:知遇我 收藏

这篇文章主要为大家详细介绍了C语言实现空战游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文实例为大家分享了C语言实现空战游戏的具体代码,供大家参考,具体内容如下

一、项目描述和成果展示

项目描述: 在以往的程序中进行了改进。
例如: 可以发射多个子弹
可以有多个敌机

飞机大战 1.0版
飞机大战 2.0版

现在这个版本是3.0版 这个版本的各个功能基本完善

效果图如下:

C语言实现空战游戏

C语言实现空战游戏

二、发射多个子弹

代码如下:

#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;
}

效果图如下:

C语言实现空战游戏

三、多个敌机

代码如下:

#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;
}

效果图如下:

C语言实现空战游戏

四、增加子弹升级功能

当分数达到一定的值自动升级炮弹,当分数下降一定数值后炮弹下降一个等级。

代码如下:

#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;
}

效果图如下:

C语言实现空战游戏

五、增加一些小功能

增加一个主菜单
里面增加了一些小的功能

代码如下:

#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;
}

效果图如下:

C语言实现空战游戏

C语言实现空战游戏

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持源码搜藏网。


下一篇:没有了

C语言阅读排行

最新文章