广告位联系
返回顶部
分享到

C语言实现打飞机游戏的代码

C语言 来源:互联网搜集 作者:秩名 发布时间:2020-03-04 13:19:18 人浏览
摘要

不说废话了,代码如下: #includestdio.h#includestdlib.h#includewindows.h#includetime.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

不说废话了,代码如下:

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


版权声明 : 本文内容来源于互联网或用户自行发布贡献,该文观点仅代表原作者本人。本站仅提供信息存储空间服务和不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权, 违法违规的内容, 请发送邮件至2530232025#qq.cn(#换@)举报,一经查实,本站将立刻删除。
原文链接 : https://blog.csdn.net/qq_42577465/article/details/90716603?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task
相关文章
  • C++中类的六大默认成员函数的介绍

    C++中类的六大默认成员函数的介绍
    一、类的默认成员函数 二、构造函数Date(形参列表) 构造函数主要完成初始化对象,相当于C语言阶段写的Init函数。 默认构造函数:无参的构
  • C/C++实现遍历文件夹最全方法总结介绍

    C/C++实现遍历文件夹最全方法总结介绍
    一、filesystem(推荐) 在c++17中,引入了文件系统,使用起来非常方便 在VS中,可以直接在项目属性中调整: 只要是C++17即以上都可 然后头文件
  • C语言实现手写Map(数组+链表+红黑树)的代码

    C语言实现手写Map(数组+链表+红黑树)的代码
    要求 需要准备数组集合(List) 数据结构 需要准备单向链表(Linked) 数据结构 需要准备红黑树(Rbtree)数据结构 需要准备红黑树和链表适配策略
  • MySQL系列教程之使用C语言来连接数据库

    MySQL系列教程之使用C语言来连接数据库
    写在前面 知道了 Java中使用 JDBC编程 来连接数据库了,但是使用 C语言 来连接数据库却总是连接不上去~ 立即安排一波使用 C语言连接 MySQL数
  • 基于C语言实现简单学生成绩管理系统

    基于C语言实现简单学生成绩管理系统
    一、系统主要功能 1、密码登录 2、输入数据 3、查询成绩 4、修改成绩 5、输出所有学生成绩 6、退出系统 二、代码实现 1 2 3 4 5 6 7 8 9 10 11
  • C语言实现共享单车管理系统

    C语言实现共享单车管理系统
    1.功能模块图; 2.各个模块详细的功能描述。 1.登陆:登陆分为用户登陆,管理员登陆以及维修员登录,登陆后不同的用户所执行的操作
  • C++继承与菱形继承的介绍

    C++继承与菱形继承的介绍
    继承的概念和定义 继承机制是面向对象程序设计的一种实现代码复用的重要手段,它允许程序员在保持原有类特性的基础上进行拓展,增加
  • C/C++指针介绍与使用介绍

    C/C++指针介绍与使用介绍
    什么是指针 C/C++语言拥有在程序运行时获得变量的地址和操作地址的能力,这种用来操作地址的特殊类型变量被称作指针。 翻译翻译什么
  • C++进程的创建和进程ID标识介绍
    进程的ID 进程的ID,可称为PID。它是进程的唯一标识,类似于我们的身份证号是唯一标识,因为名字可能会和其他人相同,生日可能会与其他
  • C++分析如何用虚析构与纯虚析构处理内存泄漏

    C++分析如何用虚析构与纯虚析构处理内存泄漏
    一、问题引入 使用多态时,如果有一些子类的成员开辟在堆区,那么在父类执行完毕释放后,没有办法去释放子类的内存,这样会导致内存
  • 本站所有内容来源于互联网或用户自行发布,本站仅提供信息存储空间服务,不拥有版权,不承担法律责任。如有侵犯您的权益,请您联系站长处理!
  • Copyright © 2017-2022 F11.CN All Rights Reserved. F11站长开发者网 版权所有 | 苏ICP备2022031554号-1 | 51LA统计