C语言实现打飞机

#include<stdio.h>
 #include<stdlib.h>
 #include<windows.h>
 #include<time.h>
 
#define U 1
 #define D 2
 #define L 3
 #define R 4
 
typedef struct node                                 //己方飞机的节点
 {
         int x;
         int y;
         struct node *next;
 }node;
 
typedef struct Bullet
 {
         int x;
         int y;
         int status;                                      //0  1 表示此处是否有子弹
         struct Bullet *next;
 }Bullet;                                           //子弹模型节点
 
typedef struct Enemy
 {
         int x;
         int y;
         int status;                                     //0    1 表示此节点是否存在飞机
 }Enemy;                                                 //敌机节点
 
// 全局变量//
 node *head,*p;
 Enemy Ehead[30];
 Bullet *HBullet,*q,*H;
 int Status,score=0;
 int BulletStatus,s=1;
 int add_1=1,add_2=0;
 
//函数声明//
 void Pos();                                               //固定光标
 void CreateMap();                                   //创建游戏界面
 void CreateAircraft();                              //创建自己的飞机
 void printAircraft();                               //打印自己的飞机
 void Aircraftmove();                                  //自己飞机的移动
 void CreateEnemyAircraftModel();                          //创建敌机的模型 结构体数组
 void CreateEnemyAircraft();                             //创建一架敌方飞机
 void EnemyAircraftMove();                           //敌机的移动
 void CreateBulletModel();                            //创建子弹的模型
 void Shoot();                                        //发射子弹
 void Bulletmove();                                    //子弹的移动
 int GetBulletStatus();                                 //获取是否有子弹存在
 void JudgeCollide();                                     //判定是否击中敌机
 void JudgeGameOver();                                       //判定是否与敌机相撞  
                                            //为了防止在运行别的函数时这个函数无法运行,所以讲起嵌入每一个循环的函数中,保证不遗漏任何情况.
 void Pause();                                              //暂停
 void ControlGame();                                       //控制游戏主程序
 void GameStart();                                         //游戏开的的预先运行函数集合
 void EndGame();                                             //结束游戏
 /*   
                   ■              飞机的基本模型    
                                ■■■            第一行为机头,         敌机的设定只需用到机头,机身仅仅只是打印出来,并没有实际内容
                                 ■■■            下两行为机身
 
*/
 void Pos(int x,int y)//设置光标位置
 {
         COORD pos;
         pos.X=x;
         pos.Y=y;
         HANDLE hOutPut;
         hOutPut=GetStdHandle(STD_OUTPUT_HANDLE);
         SetConsoleCursorPosition(hOutPut,pos);
 }
 
void CreateMap()
 {
         system("mode con cols=100 lines=55");
         int i;
         for(i=0;i<=67;i+=2)//上下边
         {
                 Pos(i,0);
                 printf("■");
                 Pos(i,50);
                 printf("■");
         }
         for(i=0;i<=50;i++)//左右边
         {
                 Pos(0,i);
                 printf("■");
                 Pos(66,i);
                 printf("■");
 
        }
         Pos(80,8);
         printf("您的得分%d",score);
         Pos(70,20);
         printf("Space:发射子弹");
         Pos(70,22);
         printf("ESC:退出游戏");
         Pos(70,24);
         printf("Enter:暂停");
         Pos(70,26);
         printf("用↑.↓.←.→控制飞机");
         Pos(70,28);
         printf("F1:加速敌机的产生");
         Pos(70,30);
         printf("F2:减缓敌机的产生");
         Pos(80,40);
         printf("特别说明:");
         Pos(70,42);
         printf("敌机从地图下飞出不结束游戏");
 }
 
void CreateAircraft()
 {
         node *q;
         int i;
         head=(node*)malloc(sizeof(node));//链表形式创建飞机,x,y分别为显示的坐标
         head->x=32;
         head->y=47;
         q=head;
         for(i=0;i<=4;i+=2)
         {
                 p=(node*)malloc(sizeof(node));
                 head->next=p;
                 p->x=30+i;
                 p->y=48;
                 head=p;
         }
         for(i=0;i<=4;i+=2)
         {
                 p=(node*)malloc(sizeof(node));
                 head->next=p;
                 p->x=30+i;
                 p->y=49;
                 head=p;
         }
         p->next=NULL;
         head=q;
         p=head;
 } 

void printAircraft()
 {
         while(p!=NULL)
         {
                 Pos(p->x,p->y);
                 printf("■");
                 p=p->next;
         }
         p=head;
 
}
 
void Aircraftmove()
 {
         JudgeGameOver();
         JudgeCollide();
         Sleep(50);
         if(Status==U)                //向上飞行
         {
                 while (p!=NULL)
                 {
                         p->y=p->y-1;
                         Pos(p->x,p->y);
                         printf("■");
                         p=p->next;
                 }
                 p=head;
                 Pos(p->x-2,p->y+3);
                 printf("  ");
                 Pos(p->x,p->y+3);
                 printf("  ");
                 Pos(p->x+2,p->y+3);
                 printf("  ");
         }
         if(Status==D)              //向下飞行
         {
                 while (p!=NULL)
                 {
                         p->y=p->y+1;
                         Pos(p->x,p->y);
                         printf("■");
                         p=p->next;
                 }
                 p=head;
                 Pos(p->x,p->y-1);
                 printf("  ");
                 Pos(p->x-2,p->y);
                 printf("  ");
                 Pos(p->x+2,p->y);
                 printf("  ");
         }
         if(Status==L)               //向左飞行
         {
                 while (p!=NULL)
                 {
                         p->x=p->x-2;
                         Pos(p->x,p->y);
                         printf("■");
                         p=p->next;
                 }
                 p=head;
                 Pos(p->x+2,p->y);
                 printf("  ");
                 Pos(p->x+4,p->y+1);
                 printf("  ");
                 Pos(p->x+4,p->y+2);
                 printf("  ");
         }
         if(Status==R)                  //向右飞行
         {
                 while (p!=NULL)
                 {
                         p->x=p->x+2;
                         Pos(p->x,p->y);
                         printf("■");
                         p=p->next;
                 }
                 p=head;
                 Pos(p->x-2,p->y);
                 printf("  ");
                 Pos(p->x-4,p->y+1);
                 printf("  ");
                 Pos(p->x-4,p->y+2);
                 printf("  ");
         }
 
}
 
void CreateEnemyAircraftModel()
 {                               
        int j;
         for(j=1;j<=30;j++)              //结构体数组表示敌军飞机最多同时存在30架,也许不可能有那么多,数字用的稍大.
         {                               //每一个值表示一架飞机,敌机只需知道其机头坐标
                 Ehead[j].x=-1;
                 Ehead[j].y=1;
                 Ehead[j].status=0;
         }
 }
 
void CreateEnemyAircraft()//创建出一架新的飞机
 {
         JudgeCollide();
         JudgeGameOver();
         srand((unsigned)time(NULL));
         int j;
         for(j=1;j<=20;j++)
         {
                 if(Ehead[j].status==0)
                 {
                         JudgeGameOver();
                         while(Ehead[j].x%2!=0)  //保证机头x为偶数,对其格子.
                         {
                                 Ehead[j].x=rand()%62+3;
                         }
                         Ehead[j].y=1;
                         Ehead[j].status=1;
                         Pos((Ehead[j].x),(Ehead[j].y));
                         printf("■");
                         break;
                 }
         }
 }
 
void EnemyAircraftMove()                          //模拟敌机向下飞行的函数
 {
         Sleep(100);
         if(s>=15)                  //控制敌机飞机的出现频率
         {
                 CreateEnemyAircraft();    
                s=1;
         }
         s=s+add_1;
         JudgeCollide();
         JudgeGameOver();
         int j;
         for(j=1;j<=30;j++)
         {
                 if(Ehead[j].status==1 && Ehead[j].y==1)      //特殊情况
                 {
                         Pos(Ehead[j].x,Ehead[j].y);
                         printf("  ");
                 }
                 if(Ehead[j].status==1 && Ehead[j].y==2)   //特殊情况
                 {
                         Pos(Ehead[j].x,Ehead[j].y);
                         printf("  ");
                         Pos(Ehead[j].x-2,Ehead[j].y-1);
                         printf("      ");
                 }
                 if(Ehead[j].status==1 && 3<=Ehead[j].y && Ehead[j].y<=49)
                 {
                         Pos(Ehead[j].x,Ehead[j].y);
                         printf("  ");
                         Pos(Ehead[j].x-2,Ehead[j].y-1);
                         printf("      ");
                         Pos(Ehead[j].x-2,Ehead[j].y-2);
                         printf("      ");
                 }
                 if(Ehead[j].status==1 && Ehead[j].y==50)//特殊情况
                 {
                         Pos(Ehead[j].x-2,Ehead[j].y-1);
                         printf("      ");
                         Pos(Ehead[j].x-2,Ehead[j].y-2);
                         printf("      ");
                 }
                 if(Ehead[j].status==1 && Ehead[j].y==51)//特殊情况
                 {
                         Pos(Ehead[j].x-2,Ehead[j].y-2);
                         printf("      ");
                 }
         }
         for(j=1;j<=20;j++)                      //将每一个敌机机头向下移动一位
         {
                 if(Ehead[j].status==1)
                 {
                         if(Ehead[j].y<=52)
                         {
                                 Ehead[j].y=Ehead[j].y+1;
                         }
                         if(Ehead[j].y>=53)
                         {
                                 Ehead[j].status=0;
                         }
                 }
         }
         for(j=1;j<=20;j++)
         {
                 if(Ehead[j].status==1 && Ehead[j].y==2)//特殊情况
                 {
                         Pos(Ehead[j].x,Ehead[j].y);
                         printf("■");
                         Pos(Ehead[j].x-2,Ehead[j].y-1);
                         printf("■■■");
                 }
                 if(Ehead[j].status==1 && 3<=Ehead[j].y && Ehead[j].y<=50)
                 {
                         Pos(Ehead[j].x,Ehead[j].y);
                         printf("■");
                         Pos(Ehead[j].x-2,Ehead[j].y-1);
                         printf("■■■");
                         Pos(Ehead[j].x-2,Ehead[j].y-2);
                         printf("■■■");
                 }
                 if(Ehead[j].status==1 && Ehead[j].y==51)//特殊情况
                 {
                         Pos(Ehead[j].x-2,Ehead[j].y-1);
                         printf("■■■");
                         Pos(Ehead[j].x-2,Ehead[j].y-2);
                         printf("■■■");
                 }
                 if(Ehead[j].status==1 && Ehead[j].y==52)//特殊情况
                 {
                         Pos(Ehead[j].x-2,Ehead[j].y-2);
                         printf("■■■");
                 }
         }
         JudgeGameOver();
 }
 
void CreateBulletModel()                       //创建子弹的模型
 {
         int i;
         q=(Bullet*)malloc(sizeof(Bullet));             
        q->x=0;
         q->y=1;
         q->status=0;
         H=q;
         for(i=2;i<=46;i++)                       //每行最多存在一个子弹,子弹的最大数值为地图上下边框所确定的值.所以一上下边框确定一个最大的链表.
         {
                 HBullet=(Bullet*)malloc(sizeof(Bullet));
                 HBullet->y=i;
                 HBullet->x=-1;
                 HBullet->status=0;
                 q->next=HBullet;
                 q=HBullet;
         }
         q->next=H;
         HBullet=H;
 }
 
void Shoot()                                         //发射子弹
 {
         JudgeGameOver();
         JudgeCollide();
         while(HBullet->next->y!=head->y)               
         {
                 HBullet=HBullet->next;
         }
         HBullet->x=head->x;
         HBullet->status=1;                                  //1表示此处有子弹
         Pos(HBullet->x,HBullet->y);
         printf("■");
         HBullet=H;
 }
 
void BulletMove()                 //子弹的飞行
 {                                  //与敌军飞机飞行同理
         JudgeGameOver();
         JudgeCollide();
         while(HBullet!=q)
         {
                 if(HBullet->status==1)
                 {
                         Pos(HBullet->x,HBullet->y);
                         printf("  ");
                 }
                 HBullet=HBullet->next;
         }
         HBullet=H->next;
         while(HBullet!=q)
         {
                 H->x=HBullet->x;
                 H->status=HBullet->status;
                 H=H->next;
                 HBullet=HBullet->next;
         }
 
        HBullet=HBullet->next;
         H=HBullet;
         while(HBullet!=q)
         {
                 if(HBullet->status==1)
                 {
                         Pos(HBullet->x,HBullet->y);
                         printf("■");
                 }
                 HBullet=HBullet->next;
         }
         HBullet=H;
         JudgeGameOver();
 }
 
int GetBulletStatus()        //获取地图中是否存在子弹,不存在子弹的时候BulletMove()将不运行
 {
         JudgeGameOver();
         JudgeCollide();
         while(HBullet!=q)
         {
                 if(HBullet->status==1)
                 {
                         BulletStatus=1;
                         break;
                 }
                 HBullet=HBullet->next;
         }
         HBullet=H;
         return 0;
 }
 
void JudgeCollide()         //判断是否集中敌机
 {        
        int j;
         while(HBullet!=q)
         {
                 for(j=1;j<=30;j++)
                 {
                         JudgeGameOver();
                         if(HBullet->status==1 && Ehead[j].status==1)
                         {
                                 if((HBullet->x==Ehead[j].x && HBullet->y==Ehead[j].y))
                                 {
                                         HBullet->status=0;
                                         Ehead[j].status=0;
                                         score=score+10+add_2;
                                         Pos(80,8);
                                         printf("您的得分%d",score);
                                         Pos(HBullet->x,HBullet->y);
                                         printf("  ");
                                         Pos(HBullet->x-2,HBullet->y-1);
                                         printf("      ");
                                         Pos(HBullet->x-2,HBullet->y-2);
                                         printf("      ");
                                 }
                                 if(HBullet->x+2==Ehead[j].x && HBullet->y==Ehead[j].y)
                                 {
                                         HBullet->status=0;
                                         Ehead[j].status=0;
                                         score=score+10+add_2;
                                         Pos(80,8);
                                         printf("您的得分%d",score);
                                         Pos(HBullet->x,HBullet->y);
                                         printf("  ");
                                         Pos(HBullet->x+2,HBullet->y);
                                         printf("  ");
                                         Pos(HBullet->x,HBullet->y-1);
                                         printf("      ");
                                         Pos(HBullet->x,HBullet->y-2);
                                         printf("      ");
                                 }
                                 if(HBullet->x-2==Ehead[j].x && HBullet->y==Ehead[j].y) 
                                {
                                         HBullet->status=0;
                                         Ehead[j].status=0;
                                         score=score+10+add_2;
                                         Pos(80,8);
                                         printf("您的得分%d",score);
                                         Pos(HBullet->x,HBullet->y);
                                         printf("  ");
                                         Pos(HBullet->x-2,HBullet->y);
                                         printf("  ");
                                         Pos(HBullet->x-4,HBullet->y-1);
                                         printf("      ");
                                         Pos(HBullet->x-4,HBullet->y-2);
                                         printf("      ");
                                 }
                         }
 
                }
                 HBullet=HBullet->next;
         }
         HBullet=H;
 }
 
void JudgeGameOver()   //判断是否撞机
 {
         int j;
         for(j=1;j<=30;j++)
         {
                 while(p!=NULL)
                 {
                         if(Ehead[j].x==p->x && Ehead[j].y==p->y)
                         {
                                 EndGame();
                         }
                         p=p->next;
                 }
         }
         p=head;
 }
 
void Pause()//暂停
 {
         while(1)
         {
                 Sleep(300);
                 if(GetAsyncKeyState(VK_RETURN))
                 {    
                        break;
                 }
         }
 }
 
void ControlGame()                                          // 控制主程序
 {
         while(1)
         {                
                JudgeGameOver();
                 JudgeCollide();
                 if(GetAsyncKeyState(VK_UP) && head->y!=1)
                 {
                         Status=U;
                         Aircraftmove();
                 }
                 else if(GetAsyncKeyState(VK_DOWN) && head->y+2!=49)
                 {
 
                        Status=D;
                         Aircraftmove();
                 }
                 else if(GetAsyncKeyState(VK_LEFT) && head->x-2!=2)
                 {
                         Status=L;
                         Aircraftmove();
                 }
                 else if(GetAsyncKeyState(VK_RIGHT) && head->x+2!=64)
                 {
                         Status=R;
                         Aircraftmove();
                 }
                 if(GetAsyncKeyState(VK_F1) && head->y!=1)
                 {
                         if(add_1<5) 
                        {
                         add_1=add_1+1;
                         add_2=add_2+2;
                         }
                 }
                 if(GetAsyncKeyState(VK_F2) && head->y!=1)
                 {
                         if(add_1>2 &&add_1 <=5) 
                        {
                         add_1=add_1-1;
                         add_1=add_2-2;
                         }
                 }
                 else if(GetAsyncKeyState(VK_RETURN))
                 {
                         Pause();
                 }
                 else if(GetAsyncKeyState(VK_SPACE))
                 {
                         Shoot();
                 }
                 else if(GetAsyncKeyState(VK_ESCAPE))
                 {
                         EndGame();
                 }
                 GetBulletStatus();
                 if(BulletStatus==1)
                 {
                         BulletMove();
                 }
                 EnemyAircraftMove();
                 JudgeGameOver();
         }
 }
 
void GameStart() 
{
         CreateMap();
         CreateAircraft();
         printAircraft();
         CreateEnemyAircraftModel();
         CreateBulletModel();
 }
 
void EndGame()
 {
         system("cls");
         Pos(35,25);
         printf("Game Over.");
         Pos(1,50);
         exit(0);
 }
 
void main()
 {
         GameStart();
         ControlGame();
 }

 

  • 30
    点赞
  • 74
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值