美文网首页
C语言游戏开发之消消乐3

C语言游戏开发之消消乐3

作者: 世缘 | 来源:发表于2019-02-12 16:24 被阅读0次

            在上一章中,小编主要讲述了如何通过方向键控制光标的移动、如何判断并获取同色小球、判断同色小球是否合法以及使同色小球消失一段时间。

            本章,小编将接着上一章的内容,为大家介绍小球下落,补充新小球、时间和分数的刷新以及游戏结束时的界面等的代码实现。


    1.小球下落,补充新小球

            编程思路:以被置黑的小球(数组元素)为参考,每遍历数组中的一个元素,就将其上方的小球依次往下移动40(从相邻的上端拾取颜色,再重绘颜色相同的圆),最上端的小球再通过随机数产生。

            将小球下落,补充新小球的过程写成函数的形式:

    void ballsfall()

    {

    for(int i=0;i<index;i++)

    //遍历数组中的元素(同色小球)

    {

    for(int k=ballsArr[i].y;k>70;k-=40)

    //从相邻的上端拾取颜色,

    再重绘颜色相同的圆

    {

    setfillcolor(getpixel(ballsArr[i].x,k-40));

    setlinecolor(getpixel(ballsArr[i].x,k-40));

    fillcircle(ballsArr[i].x,k,18);

    }

    //最上端的小球再通过随机数产生

    (补充新小球)

    COLORREF c1=colorArr[rand()%6];

    setfillcolor(c1);

    setlinecolor(c1);

    fillcircle(ballsArr[i].x,70,18);

    }

    }

    程序编译运行后,有时候又出现了bug。

            就比如上下相邻的2个同色小球,如果当前光标在上方的那个小球位置,按键消去,没有问题;但当前光标在下方的那个小球位置时,按键消去,当前光标位置小球被置黑了,这是什么原因造成的呢?

    按键前 按键后,当前光标位置被置黑

            请读者思考一下~

            这是由于当前光标在下方的那个小球位置时,按键消去,小球被置黑,此时当前光标位置从相邻的上端拾取到的颜色是黑色,自然会绘制一个黑色的小球,就出现了上述的情况。

            怎么修复这个bug呢?

            我们先得将ballsArr[ ]数组中的小球排序,纵坐标小的在数组元素的前面,反之亦然。(这里小编用的是冒泡排序,常用的排序方法希望大家掌握)

    void rank()

    {

        int i,j;

        posType temp;

        for(i=0;i<index;i++)

        {

            for(j=0;j<index-i-1;j++)

            {

                if(ballsArr[j].y>ballsArr[j+1].y)

                {

                    temp=ballsArr[j];

                    ballsArr[j]=ballsArr[j+1];

                    ballsArr[j+1]=temp;

                }

            }

        }

    }

            将rank()函数添加到ballsfall()函数里的for循环前面即可~


    2.时间和分数的刷新

    void gameplay()

    {

        int score=0;//分数

        for(int i=300;i>0;i--)//时间

        {

            if(i%10==0)

            {

                drawtime(i/10);

            }

            if(KEY_DOWN(VK_UP)&&cur.y>70)

            {

                drawcursor(cur,BLACK);

                cur.y-=40;

                drawcursor(cur,WHITE);

            }   

            else if(KEY_DOWN(VK_DOWN)&&

            cur.y<630)

            {

                drawcursor(cur,BLACK);

                cur.y+=40;

                drawcursor(cur,WHITE);

            }     

            else if(KEY_DOWN(VK_LEFT)

            &&cur.x>280)

            {

                drawcursor(cur,BLACK);

                cur.x-=40;

                drawcursor(cur,WHITE);

            }

            else if(KEY_DOWN(VK_RIGHT)

            &&cur.x<720)

            {

                drawcursor(cur,BLACK);

                cur.x+=40;

                drawcursor(cur,WHITE);

            } 

            else if(KEY_DOWN(VK_RETURN)

            ||KEY_DOWN(VK_SPACE)) { //获得光标所在位置周围的同色小球,计算同色小球的个数,并存入数组 

        getsamecolorballs(cur,getpixel(cur.x,cur.y)); //同色小球消失一段时间(将数组中元素置黑)

            if(index>1)

            {

                for(int k=0;k<index;k++)

                {

                    setfillcolor(BLACK); 

                    setlinecolor(BLACK);

                fillcircle(ballsArr[k].x,ballsArr[k].y,18);

                }

                //小球下落

                Sleep(500);

                ballsfall();

                score+=index;

                drawscore(score);

            }

            index=0;

            }

            Sleep(100);

        }

    }

    刷新分数:   

    先定义一个整型变量score,初始值为0,然后通过getsamecolorballs()函数计算出同色小球的个数,累加到score,最后调用drawscore()函数即可。

    刷新时间:

    for(int i=300;i>0;i--)//时间

    {

        if(i%10==0)

        {

            drawtime(i/10);

        }

        …

        Sleep(100);

    }

            通过for循环,整个循环持续时间为300*100毫秒,即30秒,当i为10的整数倍时,调用drawtime()函数,参数为i/10。


    3.游戏结束时的界面

    在gameplay()函数里添加下面代码:

    cleardevice();//清除屏幕内容

    settextcolor(RGB(255,0,0));//设置文字颜色

    settextstyle(80, 0, _T("黑体"));//设置文字样式

    char s[] = "Game over";

    outtextxy(300, 300, s);//输出字符串

    drawscore(score);//输出最终得分

    Sleep(500);

            到此为止,小编就将代码编写模块介绍完了。结合之前的两章内容,就是~消消乐~游戏开发的全部过程。如果还有不明白的地方,可以参考一下【消消乐】源代码

            此时此刻,你是否有些激动~是不是正玩转着自己编写调试成功的消消乐~是不是感觉不可思议(大佬勿看,写给小白的)~

            小编之所以创作~消消乐~“三部曲”,主要提起大家对C语言的认知和兴趣,当然不局限于C语言这一门编程语言。

            目前,小编大学学习的专业是电气自动化,学院开了C语言课程,有不少同学认为学习C语言既枯燥又无用。所以,我希望通过本教程,让大家意识到,学习C语言还是挺有趣味的;C语言的实际应用也多,可以开发小游戏,而对于我们电气自动化来说,51单片机,stm32单片机都要用C语言来开发完成项目。

            希望读者们关注我的简书,也希望广大读者能多多提出意见,我将与大家一起成长,谢谢!

    链接:        C语言游戏开发之消消乐1

                        C语言游戏开发之消消乐2

    相关文章

      网友评论

          本文标题:C语言游戏开发之消消乐3

          本文链接:https://www.haomeiwen.com/subject/xqwfeqtx.html