C语言控制台小游戏 | 打飞机

开飞机打飞机

极度简陋版,做着玩
在这里插入图片描述
/20.3.27/

基本描述

  1. 玩家控制一架飞机,用 * 表示;
  2. 敌机只有一架,随机位置飞来,用 @ 表示;
  3. 子弹能发一颗 ,用 | 表示;//暂且叫做子弹吧,要不然叫导弹?感觉叫啥都行
  4. 子弹击中敌机后,子弹和敌机消失,得一分;
  5. 被敌机撞到后,游戏结束
  6. 上下左右由WSAD控制,空格 发射子弹;

存在缺陷

  1. 只有一架飞机,飞完就没了
  2. 只有一颗子弹,打完了再打,之前的就没了
  3. 有几率打不中,飞机和子弹恰好遇到,下一个循环恰好错过时,miss

C语言源代码

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <windows.h>

int high, wid;  //游戏场景的高和宽
int plane_h, plane_w;   //飞机位置
int bullet_h, bullet_w;     //子弹位置
int enemy_h, enemy_w;  //敌机位置
int interval; //同个计次来模拟时间间隔
int itv_enemy; //敌机移动的时间间隔
int score;  //分数


void Startup();   //游戏数值初始化
void Show();    //游戏界面输出
void UpdateInput();    //与输入无关的游戏状态更新
void UpdateNormal();    //因输入导致的游戏状态更新


int main()
{
    Startup();  //初始化
    while(1){   //游戏循环
        Show();
        UpdateInput();
        UpdateNormal();
    }
    return 0;
}

void Startup(){
    score=0;
    high=25;   //初始化场景高度
    wid=60;    //初始化场景宽度
    plane_h=15;    //初始化飞机竖直坐标
    plane_w=10;     //初始化飞机水平坐标
    bullet_h=-1;    //初始化子弹竖直坐标
    bullet_w=10;    //初始化子弹水平坐标
    enemy_h=-1;     //初始化敌机竖直坐标
    srand(time(NULL));
    enemy_w=rand()%wid;    //初始化敌机水平坐标
    interval=0;      //初始化时间间隔计数
    itv_enemy=5;	//初始化敌机移动时间间隔
}
void Show(){
    HideCursor();   //隐藏光标
    gotoxy(1,1);    //回调光标、刷新画面
    for(int i=0;i<high;i++){
        for(int j=0;j<wid;j++){
            if( i==plane_h && j==plane_w ){ //当前位置为飞机位置
                printf("*");
            }
            else if( i==bullet_h && j==bullet_w ){  //当前位置为子弹位置
                printf("|");
            }
            else if( i==enemy_h && j==enemy_w ){  //当前位置为敌机位置
                printf("@");
            }
            else if( i<high && j<wid ){  //当前位置无物,且在边界内
                printf(" ");
            }
        }
        printf("|\n");  //输出右边界
    }
    for(int i=0;i<wid;i++){ //输出下边界
        printf("-");
    }
    printf("*\n\n得分:%d",score);
}
void UpdateInput(){
    char key;  //检测按下的键
    if(kbhit()){ //当键按下
       key=getch(); //获取键值
       if(key=='w'||key=='W'){  //当按下w键,上移
            if(plane_h>0)plane_h--;
       }
       if(key=='s'||key=='S'){  //当按下s键,下移
            if(plane_h<high-1)plane_h++;
       }
       if(key=='a'||key=='A'){  //当按下a键,左移
            if(plane_w>0)plane_w--;
       }
       if(key=='d'||key=='D'){  //当按下d键,右移
            if(plane_w<wid-1)plane_w++;
       }
       if(key==' '){            //当按下空格键,发射子弹
            bullet_h=plane_h-1;
            bullet_w=plane_w;
       }

    }
}
void UpdateNormal(){

    if(bullet_h>-1&&bullet_h<high){ //子弹未到边界时,向上移动
        bullet_h--;
    }
    if(enemy_h<high && interval%itv_enemy==0){ //敌机未到下边界时,向下移动,
    /////////////////////////////////////////////每次移动的时间间隔为itv_enemy
        enemy_h++;
    }
    if(bullet_h==enemy_h && enemy_w==bullet_w){ //子弹打到敌机,两两消失
        enemy_h=high;
        bullet_h=-1;
        printf("\a"); //击中响铃
        score++;
    }
    if(plane_h==enemy_h && plane_w==enemy_w){ //敌机撞到玩家飞机,游戏结束
        printf("\t游戏结束!");
        exit(0);
    }
    if(interval<=100){  //时间间隔计次
        interval++;
    }
    else{
        interval=0;
    }
}
void gotoxy(int x,int y){ //回调光标
    COORD pos;
    pos.X=x-1;
    pos.Y=y-1;
    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),pos);
}

void HideCursor(){ //隐藏光标函数
	CONSOLE_CURSOR_INFO cursor;
	cursor.bVisible = FALSE;
	cursor.dwSize = sizeof(cursor);
	HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
	SetConsoleCursorInfo(handle, &cursor);
}


参考

  • 河海大学童晶老师的课程(做游戏,学编程)
发布了188 篇原创文章 · 获赞 31 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_44421292/article/details/105150220