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

在上一章中,小编主要讲述了如何通过方向键控制光标的移动、如何判断并获取同色小球、判断同色小球是否合法以及使同色小球消失一段时间。
本章,小编将接着上一章的内容,为大家介绍小球下落,补充新小球、时间和分数的刷新以及游戏结束时的界面等的代码实现。
1.小球下落,补充新小球 编程思路:以被置黑的小球(数组元素)为参考,每遍历数组中的一个元素,就将其上方的小球依次往下移动40(从相邻的上端拾取颜色,再重绘颜色相同的圆),最上端的小球再通过随机数产生。
将小球下落,补充新小球的过程写成函数的形式:
void ballsfall()
{
for(int i=0; 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个同色小球,如果当前光标在上方的那个小球位置,按键消去,没有问题;但当前光标在下方的那个小球位置时,按键消去,当前光标位置小球被置黑了,这是什么原因造成的呢?


C语言游戏开发之消消乐3
文章图片
按键前 C语言游戏开发之消消乐3
文章图片
按键后,当前光标位置被置黑 请读者思考一下~
这是由于当前光标在下方的那个小球位置时,按键消去,小球被置黑,此时当前光标位置从相邻的上端拾取到的颜色是黑色,自然会绘制一个黑色的小球,就出现了上述的情况。
怎么修复这个bug呢?
我们先得将ballsArr[ ]数组中的小球排序,纵坐标小的在数组元素的前面,反之亦然。(这里小编用的是冒泡排序,常用的排序方法希望大家掌握)
void rank()
{
int i,j;
posType temp;
for(i=0; i {
for(j=0; 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);
【C语言游戏开发之消消乐3】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 {
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

    推荐阅读