C语言实现打飞机游戏

本文实例为大家分享了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();
 }

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

(0)

相关推荐

  • C语言实现打飞机小游戏

    本文实例为大家分享了C语言实现打飞机小游戏的具体代码,供大家参考,具体内容如下 编译环境:vs2019 需求: 在同一个平面内,控制大炮发射的三个方向,空格发射炮弹,敌军和友军飞机会一直随机在天上飞过,击中天上飞行的敌军飞机加一分,击中友军飞机减一分 思路: 先初始化程序,再画出说明和地图,接着进入无限循环,循环中分别实现飞机不停地在天上飞.通过awd空格键控制游戏内容.符合游戏条件时加分三个主要步骤. 做法: 首先要实现飞机的动画效果,本质是要在控制台上输出三条x轴上输出一个字符串,并要让这三

  • C语言实现打飞机游戏

    本文实例为大家分享了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

  • C语言实践设计开发飞机游戏

    目录 一.前言 二.从设计初始菜单界面开始 三.游戏操作指南——guide函数 四.游戏的主体gamebody() ①简化通用的游戏框架 ②头文件一览 ③清屏函数的实现 ④光标隐藏函数 ⑤Initgame函数 ⑥show函数的实现 ⑦与用户输入有关的更新- updateWithinput ⑧与用户输入无关的更新-updateWithoutinput ⑨组合而成的gamebody函数 ⑩不足与展望 一.前言 [设计难度 : ★☆☆☆☆ [参考书籍:<C语言课程设计与游戏开发实践教程> [主要涉及

  • C语言实现飞机游戏(1)

    本文实例为大家分享了C语言实现飞机游戏的具体代码,供大家参考,具体内容如下 本节我们将在上一节 弹跳小球 实现基础上完成简单的飞机游戏. scanf 控制飞机移动 我们可以使用 scanf 函数来检测输入,分别使用 a , s , d , w .来控制 x , y 坐标来实现飞机移动. #include <stdio.h> #include <stdlib.h> int main(){     int i,j;     int x = 5;     int y = 10;     

  • C语言实现飞机游戏(2)

    本文实例为大家分享了C语言实现飞机游戏的具体实现代码,供大家参考,具体内容如下 本节我们将在上一节的基础上对飞机游戏进行改造完善. 基本框架 从本节起,为了避免把所有代码都放进main函数而使得代码看起来臃肿,我们将通过以下基本框架来实现游戏内容. //全局变量定义 int main(){     startup(); //游戏初始化     while(1) //游戏循环体     {         show(); //显示界面         updateWithoutInput(); /

  • C语言实现飞机游戏(豪华版)的示例代码

    目录 前言 一.飞机显示与控制 二.发射子弹 三.击中敌机 四.多台敌机 五.发射散弹 前言 这是飞机游戏的第三版,我们已经实现了基础版和进阶版的飞机游戏  ,但是存在的问题很明显:已经发射出去的子弹会随着飞机位置的实时改变而改变,并且不能实现连发.如果第一次看此文章,可能有部分代码(例如基本游戏框架,清屏功能,键盘控制,数据处理)不了解其功能,建议看看之前写的博客用c实现最简单的飞机游戏和用c实现进阶版飞机游戏 应用数组,可以更方便地记录复杂的数据,实现更复杂的显示.逻辑判断与控制.本篇文章利

  • 利用C语言实现一个最简单的飞机游戏

    目录 前言 一.利用scanf控制飞机移动 二.getch控制飞机移动 三.显示复杂的飞机图案 四.发射激光 五.打靶练习 前言 在前面弹跳小球的基础上实现一个简单的飞机游戏,主要包括飞机的显示.控制移动.显示复杂图案.发射激光.打靶练习等功能. 目前的飞机还很简单,大家不要着急,一步一步来,在后面会实现更复杂的飞机游戏效果.比如 如何让靶子移动起来? 如何统计和显示击中得分? 如何实现子弹散弹效果? 一.利用scanf控制飞机移动 第一步利用scanf输入不同的字符,按a.s.d.w键后改变坐

  • C语言实现飞机游戏(进阶版)的示例代码

    目录 前言 一.代码重构 二.新式子弹代替激光 三.优化敌方战机 四.增加积分模块 五.更好的清屏功能 前言 没有学习函数,以上功能都在main()中实现是有点痛苦的.在学了函数之后会模块化重构相应的游戏,大家经历过上面的痛苦才能真正理解函数的好处.如果只是被动地学习语法知识,做些简单的算法题,是很难体会到函数封装的重要性的. 我们前面制作的用c语言实现一个最简单的飞机游戏但存在如下缺陷: 可能会遇到子弹运动时无法输入 键盘控制比较卡 不按键时敌人不会自动移动等问题,且敌人只出现一次 屏幕图标闪

  • C语言代码实现飞机大战

    本文实例为大家分享了C语言实现简单飞机大战的具体代码,供大家参考,具体内容如下 这个游戏的功能很单一,也就是"飞机大战",哈哈哈哈.总共只有300多行代码左右,你也可以想想它会有多简陋,把它复制下来编译一下可以直接执行,需要的同学可以自取~ PS:我运行的环境是 dev c++,前提你要在C99的环境中执行 以下是源代码 #include<stdio.h> #include<stdio.h> #include<windows.h> //将用户从键盘获

  • JavaScript仿微信打飞机游戏

    首先实现微信打飞机游戏,首先会有自己和敌机,采用canvas绘图来生成自己和敌人. 1.生成自己,且可以通过左右键来进行左右移动. //生成自己,且可以左右移动 //控制飞机向右移动的函数 function moveRight(event){ context.clearRect(aligh,100,47,47); //防止飞机移除背景外 if(aligh < 260){ var img = new Image(); img.src = "../images/self.png";

随机推荐