分享19级同学大一上学期用C语言实现的泡泡龙。分步骤代码、可执行程序可从百度网盘下载:

提取码:jcuc

C语言大作业 - 泡泡龙https://www.zhihu.com/video/1207418112053768192

一、游戏介绍

1.1 游戏界面

五彩泡泡龙以紫色为游戏背景,游戏刚开始的初始界面由8行不同颜色的泡泡组成,游戏界面左下角显示所得的分数,游戏界面的下面正中显示发射泡泡的箭头和将要发射的泡泡。当打开游戏界面时,会有背景音乐循环播放,当泡泡消除时会有泡泡消除的音效。等泡泡落到第15行,背景音乐停止,还会在屏幕正中央显示“游戏结束”和获得的分数。

1.2 游戏规则及操作方法

打开游戏后,移动鼠标可以控制箭头的方向,点击鼠标左键可以发射泡泡。当碰到边框时泡泡会反弹,最后泡泡不动后会修正自己的位置到合适的位置,如果相连的泡泡相同颜色的数量大于3,则这些泡泡消除。消除几个泡泡,分数就会加几分。如果在泡泡消除过后,如果有泡泡与它周围任何一个泡泡都不连接,则这些泡泡也消除,但不计入分数。如果有5次没有消除泡泡,则泡泡往下移两行,如果泡泡到了第15行,则游戏结束。

二、开发思路和包含的主要技术方法

2.1 游戏画面显示

泡泡要有不同的随机颜色,就想到了飞机大战中用不同的整数表示不同的元素,很方便也很巧妙,就用不同的整数来表示不同颜色的泡泡。应用到了数组,实现许多泡泡的显示。泡泡和箭头都是用EasyX插件画出来的,箭头随着鼠标的移动用到了鼠标交互。其中泡泡要分奇数偶数行,这样才能实现一个泡泡周围有6个泡泡相邻,从而实现相邻相同颜色泡泡消除及无连接泡泡掉落。与箭头相关的一些数值计算需要很细心。

2.2 泡泡发射和碰撞测试

泡泡发射用到了先画一个泡泡,延时后再擦除,实现了泡泡发射。泡泡发射涉及两个泡泡,一个是放在箭头起点的泡泡,一个是发射后不断移动的泡泡,这两个泡泡的颜色每一次要相同,需要把每种泡泡的颜色和具体的整数对应起来,从而实现有据可寻。碰撞就是两个泡泡外切,就是两圆圆心之间的距离小于两倍的半径。依据这个方法做碰撞测试。因为有奇数行和偶数行的泡泡,所以需要进行两次循环比较,得出两个最小坐标,再进行比较得出两个之中距离屏幕上已有泡泡最小的坐标。把这个坐标记录下来,为下一步奠定基础。

2.3 泡泡的位置修正

泡泡按照箭头方向发射后,位置不是刚开始初始化的位置,如果不做修正,会很乱,也不利于下一步泡泡的消除。就找到和发射泡泡稳定后离他最近的初始化的位置,然后把发射泡泡的位置放在这个位置。

2.4 寻找相同颜色的泡泡

当发射泡泡定位后如果跟三个或三个以上相连的泡泡同色,就可以进行消除。从新放上去的泡泡开始,检查它周围的泡泡,如果同色,则再检查这个泡泡周围泡泡的颜色……在这个函数中就运用到了递归。

2.5 泡泡掉落、分数显示及音乐的播放

当有5次没有实现泡泡消除的话泡泡就会整体下移两行。第1行和第2行随机生成两行随机颜色的泡泡。这也是游戏结束的依据。分数、显示运用了EasyX插件实现,音乐的播放用了老师上课讲的方法。

三、实现的主要步骤及对应的核心代码

3.1 游戏界面的显示

这个包括游戏框架的搭建,变量的定义,头文件的引入,8排泡泡的显示,箭头的显示及箭头随着鼠标移动。

//在计算好的位置画圆,并设置颜色for(i=1;i<=13;i=i+2)

for(j=1;j<=rownumber;j++)

{

for(k=0;k<=5;k++)

{

if(bubble[i][j]==k)

{

Setcolor(k);

fillcircle(20+(2*j-1)*radius,20+(2*i-1)*radius,radius);

}

}

}

3.2 实现小球发射并进行碰撞测试

//检测发射泡泡是否与屏幕上显示出来的泡泡碰撞int iscrash(float m,float n)

{

int i,j;

//奇偶行坐标不一样,分开讨论for(i=1;i<=12;i=i++)

for(j=1;j<=rownumber;j++)

{

//检查与奇数行中与背景颜色不一样的泡泡是否与发射泡泡相撞if((i%2!=0)&&(bubble[i][j]!=6))

{

//两个泡泡圆心距离小于泡泡的两个半径为相撞if(pow(20+(2*j-1)*radius-m,2)+pow(20+(2*i-1)*radius-n,2)<=pow(2.0*radius,2))

return 1;

}

//检查与偶数行中与背景颜色不一样的泡泡是否与发射泡泡相撞if((i%2==0)&&(bubble[i][j]!=6))

{

if(pow(20+(2*j)*radius-m,2)+pow(20+(2*i-1)*radius-n,2)<=pow(2.0*radius,2))

return 1;

}

}

return 0;

}

3.3 实现发射出的泡泡位置的修正

//修正位置测试,当泡泡发射到屏幕上时,对它最后的的位置进行修改,使它排列成为一个整齐,有序的图形,使游戏界面更有序,并且以便后面泡泡的消除操作void locate(int r,float p,float q)

{

int i,j;

int distanceshortbubble1_x,distanceshortbubble1_y; //在奇数列距离发射泡泡位置最小的泡泡位置int distanceshortbubble2_x,distanceshortbubble2_y; //在偶数列距离发射泡泡位置最小的泡泡位置//用来与泡泡之间距离作比较float min1=99999,min2=99999;

//在奇数列找到距离发射泡泡最短距离的泡泡位置for(i=1;i<=13;i=i+2)

for(j=1;j<=rownumber;j++)

{

if(pow(20+(2*j-1)*radius-p,2)+pow(20+(2*i-1)*radius-q,2)

{

distanceshortbubble1_x=i;

distanceshortbubble1_y=j;

min1=pow(20+(2*j-1)*radius-p,2)+pow(20+(2*i-1)*radius-q,2);

}

}

//在偶数列找到距离发射泡泡最短距离的泡泡位置//与奇数行类似//比较得出一个距离发射泡泡最短距离的泡泡位置{

//两者比较得出距离屏幕上泡泡最小的坐标}

}

3.4 实现泡泡消除和掉落

void findsamecolorbubble(int u,int v)

{

//把符合消除条件泡泡的坐标放在数组里,以便进行泡泡消除操作row[samecolornumber]=u;

col[samecolornumber]=v;

samecolornumber++;

//检查四周泡泡颜色是否和当前泡泡一样,奇数行和偶数行泡泡要检查四周的泡泡的坐标有一部分不一样,需要分开写一部分if(u%2!=0)

{

//如果颜色一样并且没处理过就进行检查if((bubble[u][v]==bubble[u-1][v-1])&&(isappear[u-1][v-1]==0))

{

//把坐标记录下来,并且把isappear数组里相应的值赋为1,表示这个坐标已检查过row[samecolornumber]=u-1;

col[samecolornumber]=v-1;

isappear[u-1][v-1]=1;

//继续寻找findsamecolorbubble(u-1,v-1);

}

}

if(u%2==0)

{

if((bubble[u][v]==bubble[u-1][v+1])&&(isappear[u-1][v+1]==0))

{

row[samecolornumber]=u-1;

col[samecolornumber]=v+1;

isappear[u-1][v+1]=1;

findsamecolorbubble(u-1,v+1);

}

//与上面类似}

}

3.5 实现音乐、分数显示

//在游戏界面输出分数settextcolor(RGB(255, 0, 0));

settextstyle(25, 0, _T("微软雅黑"));

_stprintf_s(str1, _T("分数:%d"), score);

outtextxy(20, 600, str1);

//在游戏界面显示剩余时间settextcolor(RGB(255, 255, 0));

settextstyle(25, 0, _T("微软雅黑"));

_stprintf_s(str2, _T("剩余时间:%2d s"), sec);

outtextxy(20, 550, str2);

mciSendString(_T("open background.mp3 alias bkmusic"),NULL,0,NULL); //背景音乐mciSendString(_T("play bkmusic repeat"),NULL,0,NULL); //循环播放

四、心得体会及总结

这一次做游戏的过程真的让我有很多收获。跟着老师的课学了之后,感觉真的很神奇。做这个游戏之前觉得自己选的游戏挺简单的,但是事实并不是那样。在做这个游戏的这几周中,碰到许多挫折,很多次想过放弃。你觉得怎么都是对的,但是就是编译运行后就是实现不了,不知道自己哪里错了,很心烦,有可能一下午一点进展都没有。最后,庆幸自己坚持了下来,也收获了很多。

第一,在做游戏之前,一定要有一个大概规划,不能做一步想一步,可能到了后面发现这一步实现不了,前一步应该怎么样怎么样,就要大量改动前面的东西,浪费很多时间。

第二,一定要了解清楚函数的功能。在实现发射泡泡轨迹过程中,因为不太清楚FlushBatchDraw函数的功能,少写了它,导致泡泡发射轨迹就是显示不出来,怎么检查也检查不出来,走了许多弯路。

第三,在写一个函数之前,查一下有没有已经定义好了,在这个过程就写了一个remove函数,但是这个函数好像已经有了,导致运行不正确。

第四,我还知道了在一个函数里面数组不能开的太大,否则会造成溢出。在递归的函数里isappear数组开的太大,导致运行到那里就闪退,我以为我递归没有写出口,一直找,也浪费了许多时间。

对于编程语言这种课程,看是远远不够的,只有自己动手去敲才能真正地把这个知识点给弄懂。在这个学习游戏编程和做游戏的这个过程中,真的收获了很多。

java泡泡龙开源_2019级C语言大作业 - 泡泡龙相关推荐

  1. 2010C语言添加背景图片_2019级C语言大作业 - 火柴人试炼之地

    C语言大作业 - 火柴人试炼之地https://www.zhihu.com/video/1200491618794606592 分享19级同学大一上学期用C语言实现的火柴人试炼之地.分步骤代码.图片音 ...

  2. c语言输出数字漏斗图形_2019级C语言大作业 - 十步万度

    分享19级同学大一上学期用C语言实现的十步万度,可从码云下载: 期末作业/十步万度​gitee.com C语言大作业 - 十步万度https://www.zhihu.com/video/1215683 ...

  3. 2019级C语言大作业 - 泡泡龙

    分享19级同学大一上学期用C语言实现的泡泡龙.分步骤代码.可执行程序可从百度网盘下载: 链接:https://pan.baidu.com/s/1r5S3oH54hM3OQeIQuwnjjQ 提取码:j ...

  4. 2020级C语言大作业 - 王国保卫战

    王国保卫战 C语言大作业 分享20级同学大一上学期用C语言(及少量C++)实现的王国保卫战.由于同学们刚学了三个月的编程,实现还不够完善,工程代码.图片音乐素材可以从百度网盘下载: 链接:https: ...

  5. 2020级C语言大作业 - 丛林大作战

    丛林大作战_C语言大作业 分享20级同学大一上学期用C语言(及少量C++)实现的丛林大作战游戏.由于同学们刚学了三个月的编程,实现还不够完善,工程代码.图片音乐素材可以从百度网盘下载: 链接:http ...

  6. 2019级C语言大作业 - 火柴人试炼之地

    火柴人试炼之地 C语言大作业 分享19级同学大一上学期用C语言实现的火柴人试炼之地.分步骤代码.图片音乐素材.可执行程序可以从百度网盘下载: 链接:https://pan.baidu.com/s/1X ...

  7. 2020级C语言大作业 - 三国杀

    三国杀 C语言大作业 分享20级同学大一上学期用C语言(及少量C++)实现的简化版三国杀游戏.由于同学们刚学了三个月的编程,实现还不够完善,工程代码.图片音乐素材可以从百度网盘下载: 链接:https ...

  8. c语言倒计时不影响进程_2017级C语言大作业 - 见缝插针

    分享17级同学大一上学期用C语言实现的见缝插针.分步骤代码.图片音乐素材.可执行程序可从百度网盘下载: 链接:https://pan.baidu.com/s/1dblHmOD2z0cUiJk3XSqu ...

  9. 2021级C语言大作业 - 霓虹深渊

    分享21级同学大一上学期用C语言(及少量C++)实现的霓虹深渊游戏.由于同学们刚学了三个月的编程,实现还不够完善,工程代码.图片音乐素材可以从百度网盘下载: 链接:https://pan.baidu. ...

最新文章

  1. DbUtils工具类使用
  2. php alert 乱码
  3. YOLO_ Real-Time Object Detection 实时目标检测
  4. java字节码提取if语句_终于找到了!有了它你就可以读懂字节码了!
  5. springmvc进不到controller_Spring、SpringMVC、MyBatis的整合
  6. 特斯拉亚洲最大超级充电站正式运营,可同时提供20辆车的快充服务
  7. idft重建图像 matlab_不可见成为可见!超材料和 AI 融合,洛桑联邦理工破译了声音图像...
  8. Landlock:一种新型Linux安全模块
  9. 跨平台数据库ODB实战1-ODB安装
  10. JS日期时间格式化函数
  11. html的单元格加线,html表格单元格添加斜下框线的方法
  12. 计算机学科代表的思维,【判断题】计算思维,是指计算机、软件及计算相关学科中的科学家和工程技术人员的思维模式。计算思维又称构造思维,它以设计和构造为特征, 以计算机学科为代表。...
  13. IE8补充前后缀快捷键
  14. PLC远程监控与数据采集方案
  15. linux arm xenomai,Wiki - Xenomai
  16. C语言考试知识点汇总(实践知识点)
  17. 将才与帅才的十二个差异
  18. 用Labelmx条码打印软件在A4纸上批量打印条码标签
  19. 【Revit二次开发】链接模型坐标系/族坐标系与模型坐标系转换
  20. 老程序员再就业:美国州长急聘,上古语言 COBOL 的春天要来了?

热门文章

  1. PHP服务器获取客户端IP地址
  2. tcp粘包及如何解决
  3. 《Head First 设计模式》之策略模式
  4. 浅谈客户端,服务器端,终端
  5. 4.1内网穿透-holer,实现外网访问地址,此处用于webhook地址
  6. cadence学习笔记 从ultra librarain网站下载封装并生成封装文件
  7. 数据库安装mysql失败解决方案
  8. 字节面试官必问的Mysql锁机制
  9. 超像素分割与超像素合并/区域合并/多尺度分割
  10. 异质信息网络表征学习综述