铁码冰河 发表于 2021-3-19 15:10

打飞机游戏3.0



方向键控制,空格开火
#include <stdio.h>
#include "mine.h"


//画面尺寸
#define High 21
#define Width 13

//变量区:

int canvas={0};//二维数组记录游戏画面中对应的元素
//0是空白,1是飞机,2是子弹,3是敌机

int plane_x,plane_y;//飞机坐标位置

#define EnemyNum 5//敌机数目

int enemy_x,enemy_y;//敌机坐标

int bullet;//判断子弹等级

int speed,speedb;//控制敌机下落速度 speed 量变 speedb 质变

int score;//得分

int life;//生命

int hit;//判断碰撞和击中

int headnum;//控制头部

void head(){
    //名字

    switch(headnum%3){
      case 0:printf(" >>【 鹰 击 长 空 】<<\n");break;
      case 1:printf(">> 【 鹰 击 长 空 】 << \n");break;
      case 2:printf("   >>【 鹰 击 长 空 】<<\n");break;
    }

}

void start(){
    //数据初始化

    HideCursor();

    plane_x=High-1;

    plane_y=(Width-1)/2;

    headnum=0;

    int k;
    for(k=0;k<EnemyNum;k++){
      enemy_x=random(5);
      enemy_y=random(Width);
      canvas]]=3;
    }
    canvas=1;
   
    speedb=40;
    speed=0;

    score=0;
    life=10;
    hit=0;
    bullet=0;//表示子弹等级为0

}

void jifenban(){
    //计分板

    int i;
   
    printf(" 【得分:%2d】",score);

   
    printf("【火力等级:");
   
    for(i=0;i<=bullet;i++){
      printf("★");
    }
    for(;i<3;i++){
      printf("☆");
    }
    printf("】");

    printf("\n 【生命: ");
   
    for(i=0;i<life;i++){
      printf("◆");
    }

    for(;i<10;i++){
      printf("◇");
    }
    printf("】");

}

void showup(){
    //画面显示

    cls();
   
    head();

    int i,j;

      for(i=0;i<High;i++){

            printf("       ┃ ");

            for(j=0;j<Width;j++){

                if(canvas==4){

                  canvas=0;


                  printf("X");//击中目标
                  

                }

                else if(canvas==1){

                  printf("A"); //输出飞机A

                }

                else if(canvas==2){

                  printf("!");//输出子弹

                }

                else if(canvas==3){

                  printf("W");//输出敌机

                }


                else{

                  printf(" "); //输出空格

                }
            }

            printf("┃\n");
      }
   
    if(hit){

      printf("\a");

      sleep(20);

      hit=0;

    }

}

void wginputupdate(){

    //输入无关更新

    headnum++;

    int i,j,k;

      for(i=0;i<High;i++){

            for(j=0;j<Width;j++){

                if(canvas==2){
                  
                  for(k=0;k<EnemyNum;k++){
                        if(i==enemy_x && j==enemy_y){
                            //子弹击中
                            canvas]]=4;
                           
                            score++;

                            enemy_x=random(5);

                            enemy_y=random(Width);


                            canvas]]=3;

                            hit=1;

                            break;
                        }

                        else if(i==enemy_x+1 && j==enemy_y){
                            //敌机在上,子弹在下

                            score++;

                            canvas]]=4;
                           
                            canvas=0;

                            hit=1;
                           

                            enemy_x=random(5);

                            enemy_y=random(Width);

                            canvas]]=3;

                            break;

                        }

                        else if(i==enemy_x+2 && j==enemy_y && speed==speedb-1){
                            //防止子弹和敌机同时到达一个点

                            score++;

                            canvas]]=0;

                            canvas+1]]=4;
                           
                            canvas=0;

                            hit=1;

                            enemy_x=random(5);

                            enemy_y=random(Width);

                            canvas]]=3;

                            break;

                        }
                  }
                        if(!hit){

                            canvas=0;

                            if(i>0){
                              canvas=2;//子弹向上移动
                            }

                        }
                  

                }

                else if(canvas==1){
                  
                  for(k=0;k<EnemyNum;k++){
                        if(i==enemy_x && j==enemy_y){
                            //很明显的相撞
                            canvas]]=4;
                           
                            score--;

                            life=life-3;

                            enemy_x=random(5);

                            enemy_y=random(Width);


                            canvas]]=3;

                            plane_x=High-1;
                            plane_y=Width/2;
                            canvas=1;
                           
                            hit=1;

                            break;
                        }


                        else if(i==enemy_x+1 && j==enemy_y && speed==speedb-1){
                            //防止我机和敌机同时到达一个点

                            score--;
                            life=life-3;

                            canvas]]=0;

                            canvas=4;

                            hit=1;

                            enemy_x=random(5);

                            enemy_y=random(Width);

                            canvas]]=3;

                            plane_x=High-1;
                            plane_y=Width/2;
                            canvas=1;

                            break;

                        }
                  }

                }

            }
      }

      
             speed++;
      

      

            if(speed==speedb){
                //敌机自动下落
               
                for(k=0;k<EnemyNum;k++){

                  canvas]]=0;
                  enemy_x++;
                  canvas]]=3;

                if(enemy_x>High-1){
                  
                  //敌机跑出下边界
                  life--;
                  canvas]]=0;
                  enemy_x=random(5);
                  enemy_y=random(Width);
                  canvas]]=3;
                  hit=2;
                  score--;

                }

                speed=0;

                switch(score/20){

                  case 1:speedb=30;break;
                  case 2:speedb=20;bullet=1;break;
                  case 3:speedb=10;bullet=2;break;
                  case 4:speedb=5;break;
                  default:break;

                }
            }
      }

    if(score<0)
      score=0;
}

void yginputupdate(){
    //输入有关更新
    char input;
    if(kbhit()){

      input=getch();

      if(input==-32){

            input=getch();

            canvas=0;
            
            switch(input){

                case 72:plane_x--;break;
                case 80:plane_x++;break;
                case 75:plane_y--;break;
                case 77:plane_y++;break;
                default:break;

            }

            if(plane_y<=0){
                plane_y=0;
            }
            if(plane_y>=Width-1){
                plane_y=Width-1;
            }
            if(plane_x<=1){
                plane_x=1;
            }
            if(plane_x>=High-1){
                plane_x=High-1;
            }

            canvas=1;
      }

      else if(input=' '){

            int left,right,i;
            
            left=plane_y-bullet;
            right=plane_y+bullet;

            if(left<0){
                left=0;
            }

            if(right>Width-1){
                right=Width-1;
            }

            for(i=left;i<=right;i++){

                canvas=2;

            }

      }
      
      else{
            input=getchar();
            input=getchar();
      }

    }
}

int main(){

    start();//数据初始化

    while(life>0){
      
      showup();//画面显示

      wginputupdate();//输入无关更新

      yginputupdate();//输入有关更新

      if(score==100){
            printf("\a");
            break;
      }

      jifenban();

    }

    if(score==100){
      system("cls");
      char c;
      printf("\n\n\n\n\n\n\n\t\t\t > Game Pass! <");
      switch(life){
            case 1:c='E';break;;
            case 2:;
            case 3:c='D';break;;
            case 4:;
            case 5:c='C';break;;
            case 6:;
            case 7:c='B';break;;
            case 8:;
            case 9:c='A';break;;
            case 10:c='S';break;
            default:break;
      }
      printf("\n\n\t\t\t > Level%c   <",c);
      sleep(3000);
    }
   
    else {

      system("cls");
      printf("\n\n\n\n\n\n\n\t\t\t > Game Over! <");
      sleep(3000);

    }

}

铁码冰河 发表于 2021-3-19 15:30

cooked 发表于 2021-3-19 15:27
想学着写写,这是用C写的吗?有啥推荐用的编辑器吗

VSCode {:301_998:}

化作星星守护你 发表于 2021-3-19 15:14

这乍一看,我想崴了

大鹏飞飞 发表于 2021-3-19 15:18

真他娘的是个人才

雨作 发表于 2021-3-19 15:22

把意大利炮拿出来

cooked 发表于 2021-3-19 15:27

想学着写写,这是用C写的吗?有啥推荐用的编辑器吗{:301_997:}

傻w潴 发表于 2021-3-19 15:28

和我想的打飞机不一样啊老铁{:301_971:}

tritan 发表于 2021-3-19 15:30

打飞机还需要代码么,需要的是手艺{:301_1004:}

A陈尘 发表于 2021-3-19 15:52

看起来很好玩

opqrsgu 发表于 2021-3-19 15:57

这游戏,颜值何在?直男游戏鉴定完毕!但还是要给楼主点个赞。有值得学习的东西。
页: [1] 2
查看完整版本: 打飞机游戏3.0