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

 更新时间:2022年05月12日 08:39:00   作者:无限的菜鸟  
这篇文章主要为大家详细介绍了C语言实现飞机游戏的第一部分,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文实例为大家分享了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;
    char input; //此处声明变量用于检测输入
    
    while(1){
        system("cls"); //清屏,Linux改为clear
        //输出上方空行
        for(i=0; i<x; i++)
            printf("\n");
        //输出左侧空格
        for(j=0; j<y; j++)
            printf(" ");
        printf("*"); //飞机使用 * 表示
        printf("\n");
    
        scanf("%c", &input); //检测输入
        if(input == 'a')
            y --;
        if(input == 'd')
            y ++;
        if(input == 's')
            x ++;
        if(input == 'w')
            x --;
    }
    return 0;
}

说明 :

scanf 函数中,%c 表示输入值类型为字符(char),&input表示把输入的值赋给 input 。

getch 控制飞机移动

之前我们使用 scanf 函数来控制移动,它要求每次输入之后按下回车才能继续,交互效果不好。

为了优化效果,我们使用 getch 函数,不需要回车就能得到输入字符。首先要包含 <conio.h>。

注意

一般Unix/Linnux系统没有<conio.h>头文件,需要从互联网下载使用。

除此之外,还需要 kbhit 函数来 监听 用户输入,如果用户输入,此函数返回 1 ,否则返回 0 ,从而避免不输入就暂停的情况。

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
int main(){
    int i,j;
    int x = 5;
    int y = 10;
    char input; //此处声明变量用于检测输入
    
    while(1){
        system("cls"); //清屏,Linux改为clear
        //输出上方空行
        for(i=0; i<x; i++)
            printf("\n");
        //输出左侧空格
        for(j=0; j<y; j++)
            printf(" ");
        printf("*"); //飞机使用 * 表示
        printf("\n");
    
        if(kbhit()){ //判断是否有输入
            input = getch();
                if(input == 'a')
                    y --;
                if(input == 'd')
                    y ++;
                if(input == 's')
                    x ++;
                if(input == 'w')
                    x --;
        }
    }
    return 0;
}

更炫酷的飞机

谁家的飞机就一个 “ * ” 啊?
你以为这是闪闪的红星吗?

仅仅用一个简单的星号来代替飞机未免有些太草率了!

所以得想办法在输出飞机那里做一个更炫酷的替换方案。

//更炫酷的飞机
for(j=0; j<y; j++)
    printf(" ");
printf("  *  \n"); //飞机头
for(j=0; j<y; j++)
    printf(" ");
printf("*****\n"); //飞机身
for(j=0; j<y; j++)
    printf(" ");
printf(" * * \n"); //飞机尾

发射激光

通常我们看到的飞机游戏都是可以哒哒哒的,所以我们现在也来给我们的飞机加个发射激光的功能。

可以定义一个变量 isFire 来表示激光状态,默认为 0 ,按下空格后改变为 1 ,此后可以加判断句,若为 1 ,则输出激光(用 “|” 表示),否则无输出。

if(isFire == 0) 
{    //无激光,正常输出空行
    for(i=0; i<x; i++)
    printf("\n");
}
else
{    //有激光,在飞机上方输出“|”
    for(i=0; i<x; i++) //首先遍历x坐标,确保上方每行都有激光
    {
        for(j=0; j<y; j++)
            printf(" "); //在y坐标之前输出空行
        printf("  |\n"); //到达对应飞机头的坐标输出“|” 
    }
    isFire = 0; //每次输出激光后把isFire的值归零,不然会一直输出
}

打靶练习

在加入敌人之前,我们首先要完成打靶,也就是先要清楚怎么判断敌人是否被消灭。

我们以 “+” 表示靶子,使用变量 isKilled 来记录其是否被击中,当其值为0时说明未击中,输出靶子;否则不再输出靶子。

首先定义关于靶子的量:

int ny = 5; //ny表示靶子y坐标,默认在第一行
int isKilled = 0; //击中状态为0

然后在死循环中首行输出靶子:

if(!isKilled){
    for(j=0; j<ny; j++)
        printf(" ");
    printf("+\n");
}

这里判断条件中 ! 是指 “非” ,因为默认 isKilled 是 0 ,也就是 “否” 的意思,那么这儿条件就是 “非否” ,双重肯定表否定嘛。那么当 isKilled 为 1 的时候条件就成了 “非是”,即不执行输出。

最后输出激光后要判断是否击中:

if(y + 2 == ny){
    isKilled = 1;
}

这里 y + 2 是因为激光在飞机中心输出,而飞机中心距 y 坐标有2个空格。

注意这一段代码必须插入在输出激光后面,且要在 isFire 归零之前(要是 isFire 先归零了那你还打个锤子)。

小结

完整代码:

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
int main(){
    int i,j;
    int x = 5;
    int y = 10;
    char input; //此处声明变量用于检测输入
    int ny = 5; //ny表示靶子y坐标,默认在第一行
    int isKilled = 0; //击中状态为0
    int isFire = 0; //激光状态为0
    
    while(1){
        system("cls"); //清屏,Linux改为clear
        if(isFire == 0) 
        {    //无激光,正常输出空行
            for(i=0; i<x; i++)
                printf("\n");
        }
        else
        {    //有激光,在飞机上方输出“|”
            for(i=0; i<x; i++) //首先遍历x坐标,确保上方每行都有激光
            {
                for(j=0; j<y; j++)
                    printf(" "); //在y坐标之前输出空行
                printf("  |\n"); //到达对应飞机头的坐标输出“|” 
            }
            if(y + 2 == ny)
                isKilled = 1;
            isFire = 0; //每次输出激光后把isFire的值归零,不然会一直输出
        }
        //更炫酷的飞机
        for(j=0; j<y; j++)
            printf(" ");
        printf("  *  \n"); //飞机头
        for(j=0; j<y; j++)
            printf(" ");
        printf("*****\n"); //飞机身
        for(j=0; j<y; j++)
            printf(" ");
        printf(" * * \n"); //飞机尾
        printf("\n");
    
        if(kbhit()){ //判断是否有输入
            input = getch();
                if(input == 'a')
                    y --;
                if(input == 'd')
                    y ++;
                if(input == 's')
                    x ++;
                if(input == 'w')
                    x --;
        }
    }
    return 0;
}

思考题:

1.打个移动靶?

目前游戏还是很简单,大家先不要急,以后会有更多更复杂的游戏。

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

相关文章

  • 算法之排序算法的算法思想和使用场景总结

    算法之排序算法的算法思想和使用场景总结

    这篇文章主要介绍了算法之排序算法的算法思想和使用场景总结,本文讲解了插入排序、交换排序、选择排序等几大类排序算法的特点、思想和使用场景,需要的朋友可以参考下
    2014-08-08
  • C语言实现带头双向环形链表

    C语言实现带头双向环形链表

    这篇文章主要为大家详细介绍了C语言实现带头双向环形链表,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-11-11
  • VS Code安装及C、C++环境配置详细教程(Windows系统)

    VS Code安装及C、C++环境配置详细教程(Windows系统)

    这篇文章主要介绍了VS Code安装及C、C++环境配置详细教程(Windows系统),本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-02-02
  • C++ Boost Parameter超详细讲解

    C++ Boost Parameter超详细讲解

    Boost是为C++语言标准库提供扩展的一些C++程序库的总称。Boost库是一个可移植、提供源代码的C++库,作为标准库的后备,是C++标准化进程的开发引擎之一,是为C++语言标准库提供扩展的一些C++程序库的总称
    2022-11-11
  • 详解C++编程中多级派生时的构造函数和访问属性

    详解C++编程中多级派生时的构造函数和访问属性

    这篇文章主要介绍了详解C++编程中多级派生时的构造函数和访问属性,是C++入门学习中的基础知识,需要的朋友可以参考下
    2015-09-09
  • 动态数组C++实现方法(分享)

    动态数组C++实现方法(分享)

    下面小编就为大家带来一篇动态数组C++实现方法(分享)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-05-05
  • C语言container of()函数案例详解

    C语言container of()函数案例详解

    这篇文章主要介绍了C语言container of()函数案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-08-08
  • C++深入浅出讲解隐藏this指针的用法

    C++深入浅出讲解隐藏this指针的用法

    在C++中,每一个对象都能通过this指针来访问自己的地址。this 指针是所有成员函数的隐含参数。因此,在成员函数内部,它可以用来指向调用对象
    2022-05-05
  • c++利用windows函数实现计时示例

    c++利用windows函数实现计时示例

    这篇文章主要介绍了c++利用windows函数实现计时示例,需要的朋友可以参考下
    2014-05-05
  • C++中为什么要使用动态内存

    C++中为什么要使用动态内存

    大家好,本篇文章主要讲的是C++中为什么要使用动态内存,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下
    2022-02-02

最新评论