服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C/C++ - C语言游戏项目球球大作战实现流程

C语言游戏项目球球大作战实现流程

2022-09-02 13:26MAX在码字 C/C++

这篇文章主要为大家详细介绍了如何用C语言实现流行游戏球球大作战,文中示例代码介绍的非常详细,如果过程中有问题在文末还有视频讲解,感兴趣的小伙伴们可以参考一下

时间在流去,我们在长大

嗨,这里是狐狸~~C语言游戏项目球球大作战实现流程

         今天是2022年1月11日,今天突然发现好久没有给你们更新项目了,今天来教大家一个新的项目,一个游戏项目——球球大作战。

         球球大作战在宇宙深处一片遍布着荆棘之花的神秘星云中,生活着一群名叫“波拉哩”(译名“球球”)的奇特生物。他们外表萌萌,却有着勇敢的心。他们是天生的战斗种族,为战斗而生,为战斗而亡。

         传说中,这群波拉哩的共同祖先是一只叫“塔坦”的超级波拉哩,塔坦的职责就是守护宇宙瑰宝“荆棘之花”,它拥有强大的能量,会分出分身,变化万物,唯一的弱点就是贪吃。

         一天,塔坦终于禁不住诱惑,偷食了“荆棘之花”,结果身体爆裂,成为了数以亿计的小波拉哩。从此,波拉哩的族群就受到了贪食的诅咒,只能在这片星云中无休止的战斗,如果停止战斗,生命便会流失,消亡在茫茫的星空之中。在漫漫的历史长河里,只有最强大的波拉哩才能冲过这片黑暗星云,打破命运的枷锁,去寻找那传说中的光明与和平。

         为了那甜蜜的希望,波拉哩们战斗着。他们必须奋力奔跑,让自己变大变大再变大,才能对抗比自己更强的存在。哪怕经历无数失败也必须重新凝聚力量,直到成为最强壮的那个。

C语言游戏项目球球大作战实现流程

项目代码 

 直接进入代码阶段吧,大家认真观看。

1、结构体

?
1
2
3
4
5
6
7
8
9
10
11
12
struct Ball //小球结构,玩家,食物,人工智障
{
    int x;
    int y;
    int r;//半径
    DWORD color;//颜色
    bool flag;//是否存在
};
int score = 0;//分数
struct Ball food[FOOD_NUM];
struct Ball player;//玩家
struct Ball ai[AI_NUM];

2、初始化

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
void GameInit()
{
    //播放背景音乐
    mciSendString("open ./BallBGM.mp3 alias BGM", 0, 0, 0);
    //mciSendString("play BGM repeat", 0, 0, 0);
    //设置随机数种子 时间是在不断的变化的
    srand((unsigned)time(NULL));
    //找到每一个元素
    for (int i = 0; i < FOOD_NUM; i++)
    {
        food[i].x = rand() % WIDTH;
        food[i].y = rand() % HEIGHT;
        food[i].flag = true;//刚开始食物是存在的,没有被吃掉
        food[i].r = rand() % 6 + 1;
        food[i].color = RGB(rand() % 256, rand() % 256, rand() % 256);
    }
    //初始化玩家数据
    player.x = rand() % WIDTH;
    player.y = rand() % HEIGHT;
    player.r = 18;//只要比最大的食物大就可以了
    player.flag = true;
    player.color= RGB(rand() % 256, rand() % 256, rand() % 256);
    //初始化ai
    for (int i = 0; i < AI_NUM; i++)
    {
        ai[i].x = rand() % WIDTH;
        ai[i].y = rand() % HEIGHT;
        ai[i].r = rand() % 10 + 5;
        ai[i].flag = true;
        ai[i].color = RGB(rand() % 256, rand() % 256, rand() % 256);
    }
}

3、绘制函数 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
void GameDraw()
{
    //防止闪屏
    BeginBatchDraw();
    setbkcolor(WHITE);
    cleardevice();//清屏
    for (int i = 0; i < FOOD_NUM; i++)
    {
        if (food[i].flag)
        {
            setfillcolor(food[i].color);//设置填充颜色
            solidcircle(food[i].x, food[i].y, food[i].r);//画一个填充圆
        }
        else
        {
            food[i].x = rand() % WIDTH;
            food[i].y = rand() % HEIGHT;
            food[i].flag = true;//刚开始食物是存在的,没有被吃掉
            food[i].r = rand() % 6 + 1;
            food[i].color = RGB(rand() % 256, rand() % 256, rand() % 256);
        }
    }
    //绘制玩家
    setfillcolor(player.color);//设置填充颜色
    solidcircle(player.x, player.y, player.r);
    settextcolor(GREEN);
    settextstyle(30, 0, "黑体");
    setbkmode(0);//设置文字背景透明
    outtextxy(player.x-50, player.y, "我是最亮的崽");
    //输出分数
    settextcolor(BLACK);
    char str[20];
    sprintf(str,"分数:%d",score);//格式化字符串
    outtextxy(20, 20, str);
    //绘制ai
    for (int i = 0; i < AI_NUM; i++)
    {
        if (ai[i].flag)
        {
            setfillcolor(ai[i].color);//设置填充颜色
            solidcircle(ai[i].x, ai[i].y, ai[i].r);//画一个填充圆
        }
    }
    EndBatchDraw();
}

4、玩家控制函数 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
void keyControl(int speed)
{
    //获取键盘消息,按得是哪一个键  _getch();    GetAsyncKeyState() windows系统函数
    if ((GetAsyncKeyState('W') || GetAsyncKeyState(VK_UP)) && player.y >= 0)//按了上键 y不能小于0
    {
        player.y -= speed;
    }
    if ((GetAsyncKeyState('S') || GetAsyncKeyState(VK_DOWN)) && player.y <= HEIGHT)//按了下键
    {
        player.y += speed;
    }
    if ((GetAsyncKeyState('A') || GetAsyncKeyState(VK_LEFT)) && player.x >= 0)//按了左键
    {
        player.x -= speed;
    }
    if ((GetAsyncKeyState('D') || GetAsyncKeyState(VK_RIGHT)) && player.x <= WIDTH)//按了右键
    {
        player.x += speed;
    }
}

5、吃食物函数

?
1
2
3
4
5
6
7
8
9
10
11
12
13
void eatFood()
{
    for (int i = 0; i < FOOD_NUM; i++)
    {
        if (food[i].flag && distance(food[i], player) <= player.r)
        {
 
            food[i].flag = false;
            player.r += food[i].r / 4;
            score++;//加分
        }
    }
}

6、电脑移动函数

?
1
2
3
4
5
6
7
8
9
10
11
void aiMove()
{
    for (int i = 0; i < AI_NUM; i++)
    {
        if (ai[i].flag)
        {
            ai[i].x += rand() % 5-2;// ?%5={0,1,2,3,4}-2=={-2,-1,0,1,2}
            ai[i].y += rand() % 5 - 2;//0
        }
    }
}

7、主函数

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
int main(int argc,char *agv[])
{
    initgraph(WIDTH, HEIGHT);
    GameInit();
    while (1)
    {
        keyControl(1);
        GameDraw();
        eatFood();
        aiMove();
    }
 
    getchar();
    return 0;
}

总结

        OK,简单总结一下下,距离上次给大家分享项目好像已经过去很久了,今天的这个项目希望大家可以认真的去试试,难度不大,这个项目暂时是个单机版的,大家可以增加玩家联机对战也是可以的,画风也比较简单,这些都是可以自己去优化的,好叭,今天就到这里了哈。后续我还会发布更多的项目源或者学习资料,希望大家可以持续关注。

视频讲解

      今天没有效果展示,emmmm,有很大原因是因为那个录制有点麻烦,有兴趣的同学可以去看视频讲解,上面有详细的代码讲解,大家可以认真观看

https://www.bilibili.com/video/BV1Yu41127E4/

C语言游戏项目球球大作战实现流程

到此这篇关于C语言游戏项目球球大作战实现流程的文章就介绍到这了,更多相关C语言 球球大作战内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://blog.csdn.net/weixin_45713725/article/details/122418218

延伸 · 阅读

精彩推荐
  • C/C++Qt5.9实现简单复合图形

    Qt5.9实现简单复合图形

    这篇文章主要为大家详细介绍了Qt5.9实现简单复合图形,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    比卡丘不皮9462021-09-16
  • C/C++C++名称空间介绍

    C++名称空间介绍

    这篇文章主要介绍了C++名称空间,这是一个很重要的概念——名称空间,有些书本里翻译成了命名空间,对应的英文是namespace。下面来看文章对此的详细介...

    梁唐4882022-08-04
  • C/C++C++11的新特性简单汇总介绍 (二)

    C++11的新特性简单汇总介绍 (二)

    最近学习了C++11的新特性,将学习内容整理下来以巩固记忆,这里分享给大家,希望对大家学习C++11能够有所帮助...

    wangqiguo12072021-04-10
  • C/C++c++中临时变量不能作为非const的引用参数的方法

    c++中临时变量不能作为非const的引用参数的方法

    下面小编就为大家带来一篇c++中临时变量不能作为非const的引用参数的方法。小编觉得挺不错的现在就分享给大家,也给大家做个参考。一起跟随小编过来...

    C++教程网4392021-04-26
  • C/C++C语言通过gets和gets_s分别实现读取含空格的字符串

    C语言通过gets和gets_s分别实现读取含空格的字符串

    在遇到包含空格的字符串输入时该如何读取呢?如果使用scanf以%s格式去读取输入的字符串,遇到空格就读取结束了,显然这样是读取不了的。本文就将介绍...

    ww1719925822022-07-21
  • C/C++C++/CLI在vs上的安装和初步使用教程

    C++/CLI在vs上的安装和初步使用教程

    本文给大家介绍C++/CLI在vs上的安装和初步使用,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋...

    茗君(Major_s)4942021-11-21
  • C/C++Opencv提取连通区域轮廓的方法

    Opencv提取连通区域轮廓的方法

    这篇文章主要为大家详细介绍了Opencv提取连通区域轮廓的方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    Timmy_Y6992021-07-17
  • C/C++浅析C/C++中sort函数的用法

    浅析C/C++中sort函数的用法

    做项目的时候,排序是一种经常要用到的操作。如果每次都自己写个冒泡之类的O(n^2)排序,不但程序容易超时,而且浪费宝贵的时间,还很有可能写错。...

    C语言教程网10922021-01-31