C语言实现像素鸟游戏

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

本文实例为大家分享了C语言实现像素鸟游戏的具体代码,供大家参考,具体内容如下

在进入更复杂的学习之前,我们最后实现一个小游戏——像素鸟。

下落的小鸟

首先我们写好游戏代码框架并实现小鸟下落和上升(按空格)的功能:

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

//全局变量
int high,width;    //画面尺寸
int bird_x,bird_y;    //小鸟坐标
int barl_y,barl_xTop,barl_xDowm;    //障碍物

void gotoxy(int x, int y)    //移动光标便于清屏重画
{
    HANDLE handle = GetStdHandle(STD_UOTPUT_HANDLE);
    CROOD pos;
    pos.X = x;
    pos.Y = y;
    SetConsoleCursorPosition(handle, pos);
}

void startup()        //数据初始化
{
    high = 15;
    width = 20;
    bird_x = 0;
    bird_y = width/3;
}

void show()        //显示画面
{
    gotoxy(0,0);
    int i,j;

    for(i=0; i<high; i++)
    {
        for(j=0; j<width; j++)
        {
            if((i==bird_x)&&(j==bird_y))
                printf("@");
            else
                printf(" ");
        }
        print("\n");    //每经一次行循环就换行
    }
}

void updateWithoutInput()
{
    bird_x ++;
    sleep(150);
}

void updateWithInput()
{
    char input;
    if(kbhit())    //判断是否有输入
    {
        input = getch();
        if(input==' ')
            bird_x = bird_x - 2;
    }
}

int main()
{
    startup();
    while(1)
    {
        show();
        updateWithoutInput();
        updateWithInput();
    }
    return 0;
}

显示障碍物

我们在上一步的基础上完成障碍物的绘制,使用全局变量barl_y, barl_xTop, barl_xDown描述相关量,如图:

加入以下代码片段:

数据初始化

barl_y = width/2;
barl_xDown = high/2;
barl_xTop = high/3;

输出循环

...
else if ((j==barl_y)&&((i>barl_xDown)||(i<barl_xTop)))
    printf("*");
...

障碍物移动(在updateWithoutInput里)

barl_y --;

判定碰撞

接下来判定当障碍物 y 坐标到达小鸟位置时是否有碰撞发生,若有,则游戏失败,反之则得分加一。

加入如下代码段:

int score; //全局变量,得分

void startup()
{
    ...
    score = 0;    
    ...
}

void updateWithoutInput()
{
    ...
    if(bird_y == barl_y)
    {
        if((bird_x>=barl_xTop)&&(bird_x<=barl_xDown))
            score ++;
        else 
        {
            printf("GG\n");
            system("pause");
            exit(0);
        }
    }
    ...
}

循环障碍物

到这里我们就要是障碍物循环出现,因为不管怎么样也不应该只有一个障碍物吧!同时,在此还将利用 rand() 随机障碍物空隙坐标。

加入以下代码段:

if(barl_y <= 0)
{
    barl_y = width;
    int temp =rand() % int(high * 0.8);    //使用临时变量储存障碍物坐标信息
    barl_xDown = temp + high/10;
    barl_xTop = temp - high/10;
}

这里对临时变量加减高度除以十的操作是为了防止生成新障碍物的空隙在太过边缘的位置。

小结

完整代码如下(我是打字机器):

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

//全局变量
int high,width;    //画面尺寸
int bird_x,bird_y;    //小鸟坐标
int barl_y,barl_xTop,barl_xDowm;    //障碍物
int score;         //得分

void gotoxy(int x, int y)    //移动光标便于清屏重画
{
    HANDLE handle = GetStdHandle(STD_UOTPUT_HANDLE);
    CROOD pos;
    pos.X = x;
    pos.Y = y;
    SetConsoleCursorPosition(handle, pos);
}

void startup()        //数据初始化
{
    high = 15;
    width = 20;
    score = 0;    
    bird_x = 0;
    bird_y = width/3;
    barl_y = width/2;
    barl_xDown = high/2;
    barl_xTop = high/3;
}

void show()        //显示画面
{
    gotoxy(0,0);
    int i,j;

    for(i=0; i<high; i++)
    {
        for(j=0; j<width; j++)
        {
            if((i==bird_x)&&(j==bird_y))
                printf("@");
            else if ((j==barl_y)&&((i>barl_xDown)||(i<barl_xTop)))
                printf("*");
            else
                printf(" ");
        }
        print("\n");    //每经一次行循环就换行
    }
}

void updateWithoutInput()
{
    bird_x ++;
    barl_y --;
    if(bird_y == barl_y)
    {
        if((bird_x>=barl_xTop)&&(bird_x<=barl_xDown))
            score ++;
        else 
        {
            printf("GG\n");
            system("pause");
            exit(0);
        }
    }
    if(barl_y <= 0)
    {
        barl_y = width;
        int temp =rand() % int(high * 0.8);    //使用临时变量储存障碍物坐标信息
        barl_xDown = temp + high/10;
        barl_xTop = temp - high/10;
    }
    sleep(150);
}

void updateWithInput()
{
    char input;
    if(kbhit())    //判断是否有输入
    {
        input = getch();
        if(input==' ')
            bird_x = bird_x - 2;
    }
}

int main()
{
    startup();
    while(1)
    {
        show();
        updateWithoutInput();
        updateWithInput();
    }
    return 0;
}

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

相关文章

  • C++中几种将整数转换成二进制输出的方法总结

    C++中几种将整数转换成二进制输出的方法总结

    下面小编就为大家带来一篇C++中几种将整数转换成二进制输出的方法总结。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-09-09
  • C C++ LeetCode题解在二叉树中增加一行示例详解

    C C++ LeetCode题解在二叉树中增加一行示例详解

    这篇文章主要为大家介绍了C C++ LeetCode题解在二叉树中增加一行示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-10-10
  • C/C++中可变参数的用法详细解析

    C/C++中可变参数的用法详细解析

    可变参数的使用方法远远不止以下介绍的几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    2013-09-09
  • C++开源库nlohmann/json的介绍和使用详解

    C++开源库nlohmann/json的介绍和使用详解

    nlohmann/json 是一个C++实现的JSON解析器,使用非常方便直观,这篇文章主要为大家详细介绍了nlohmann/json的简介和使用,需要的可以参考下
    2023-12-12
  • ReSharper 的安装使用详细教程

    ReSharper 的安装使用详细教程

    resharper安装教程是关于vs2012一个非常好用的插件的安装教程,建议大家尝试安装,今天通过本教程帮助大家学习ReSharper 的安装使用详细教程,感兴趣的朋友一起看看吧
    2021-06-06
  • 基于C++中sprintf的错误总结详解

    基于C++中sprintf的错误总结详解

    本篇文章是对C++中sprintf的错误进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • 一文详解C++中的引用与关键字auto

    一文详解C++中的引用与关键字auto

    引用就是给一个已经存在的变量取一个别名,与变量共用一段内存空间。关键字auto一般可以用来自动识别类型,本文主要来讲讲二者的相关知识,需要的可以参考一下
    2023-04-04
  • 深入解析C++编程中类的封装特性

    深入解析C++编程中类的封装特性

    这篇文章主要介绍了深入解析C++编程中类的封装特性,是C++入门学习中的基础知识,需要的朋友可以参考下
    2015-09-09
  • C++中浮点类型的具体使用

    C++中浮点类型的具体使用

    C++提供了不同精度的浮点类型,主要有 float、double 和 long double,这些浮点类型具有不同的字节大小和范围,用于满足不同应用场景的精度要求,本文主要介绍了C++中浮点类型的具体使用,感兴趣的可以了解一下
    2023-08-08
  • C++实现LeetCode(110.平衡二叉树)

    C++实现LeetCode(110.平衡二叉树)

    这篇文章主要介绍了C++实现LeetCode(110.平衡二叉树),本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-07-07

最新评论