美文网首页
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