十字消除,休闲小游戏,在规定时间内,只要是十字线能连接到的相同颜色的方块,就能获得相应的得分,如果点击后没有能够消除的方块会扣除时间,是一款益智小游戏。
我们将编写十字消除游戏,用户点击空白方块,沿其上下左右方向寻找第一个彩色方块,如果有两个或两个以上颜色一致,就将其消除。在进度条时间结束前消除足够的方块,可以进入下一关。
绘制过程
首先实现随机颜色方块的表示与绘制,鼠标点击与十字消除算法;然后绘制了提示框,绘制倒计时进度条;接着进行了得分计算、胜负判断、多关卡功能的开发;学习了地址与指针的概念,并利用地址传递使得程序更加模块化;最后学习了指针和数组的知识,应用动态数组实现了游戏尺寸的动态大小调整
在规定时间内,只要是十字线能连接到的相同颜色的方块,就能获得相应的得分,如果点击后没有能够消除的方块会扣除时间。
操作方法
鼠标点击两个或多个颜色相同方块的十字线的中心,便能成功消除方块。
注意是点击空白格子而不是彩色方块哦,点错会扣时间,点左下角的[显示图标提示]可切换到图标模式
代码示例:
#include #include #include #include #include # define blocksize 40 // 小方块的长宽大小# define colortypenum 9 // 除了空白方块外,其他方块的颜色的个数struct block // 小方块结构体{ int x,y; // x y坐标 int colorid; // 对应颜色的下标 int i,j; // 小方块在二维数组中的i j下标};// 全局变量int rownum; // 游戏画面一共rownum行小方块int colnum; // 游戏画面一共colnum列小方块block **blocks = null; // 动态二维数组指针,存储所有方块数据colorref colors[colortypenum+1]; // 颜色数组,小方块可能的几种颜色int score; // 得分数,也就是消去的方块的个数float maxtime; // 这一关游戏的总时长float totaltime; // 减去扣分项后的游戏总时长float remaintime; // 剩余时间clock_t start, finish; // 用于计时的变量int level = 1; // 当前关卡序号int nozeroblocknum; // 非空白区域的砖块的个数void drawblockhint(int i,int j,colorref color,int isfill) // 绘制出一个提示线框出来{ setlinecolor(color); setfillcolor(color); if (isfill==1) // 鼠标点击中的方块,画填充方块提示 fillrectangle(blocks[i][j].x,blocks[i][j].y,blocks[i][j].x+blocksize,blocks[i][j].y+blocksize); if (isfill==0) // 上下左右四个方向找到的4个方块,画线框提示 rectangle(blocks[i][j].x,blocks[i][j].y,blocks[i][j].x+blocksize,blocks[i][j].y+blocksize);}void writerecordfile(int recordscore) //保存最高分数据文件{ file *fp; fp = fopen(.\gamerecord.dat,w); fprintf(fp,%d,recordscore); fclose(fp);}int readrecordfile() //读取最高分数据文件{ int recordscore; file *fp; fp = fopen(.\gamerecord.dat,r); // 如果打不开的话,就新建一个文件,其得分记录为0分 if (fp==null) { writerecordfile(0); return 0; } else // 能打开这个文件,就读取下最高分记录 { fscanf(fp,%d,&recordscore); fclose(fp); return recordscore; }}void startup() // 初始化函数{ int i,j; start = clock(); // 记录当前运行时刻 if (level>1) // 如果不是第1关,则先清除二维数组内存,再重新开辟内存空间 { for (i=0;i
=0;search++) { if (blocks[clicked_i-search][clicked_j].colorid!=0) // 找到第一个颜色不是空白的方块 { fourblocks[0] = blocks[clicked_i-search][clicked_j]; // 赋给这个存储的数组 break; } } // 向下找 for (search=0;clicked_i+search=0;search++) { if (blocks[clicked_i][clicked_j-search].colorid!=0) // 找到第一个颜色不是空白的方块 { fourblocks[2] = blocks[clicked_i][clicked_j-search]; // 赋给这个存储的数组 break; } } // 向右找 for (search=0;clicked_j+search 这一节主要讲解了指针的相关语法知识,学习了倒计时的方法,实现了十字消除游戏。读者可以尝试在本章代码基础上继续改进:
1、实现随着游戏的进行,通过关卡要求消除方块的比例越来越高;
2、利用文件读写,实现关卡数据与最高分的记录与读取。
读者也可以参考本章的开发思路,尝试设计并分步骤实现消消乐、消灭星星、宝石迷阵等各种消除类游戏。
MAXQ3180 低功耗、多功能、多相AFE
一种改进的多传感器加权融合算法
海尔首创阻氧干湿分储技术,成功抢占行业制高点
家电制造企业如何利用APS高级排产优化企业生产管理?
什么是可编程任意电源
C语言十字消除游戏!详细思路+源码分享
MAX2022低噪声、高线性度、直接变换正交调制器/解调器
影碟机的总谐波失真
5G通讯关键之——毫米波技术解析
透明LED显示屏选购指南及注意点
Win7和Win10玩游戏哪个好
压电偏转镜的概念/种类/特点/应用/安装操作说明
您需要了解的有关射频匹配网络的5件事
如何制作带有Pololu QTR-8RC和L293D电机驱动器的Arduino线路跟随器机器人
【匠歆出品】“The 4th AutoCS 2023智能汽车信息安全大会”于上海明捷万丽酒店圆满落幕
利用火箭脉冲技术真的可以从月球陨石坑中收集水?
6.55MWh+的磷酸铁锂动力电池系统 亿纬配套首艘换电集装箱船开建
多学科间数据交互在SIMPACK中的实现
基于磁电偶极子的透射阵和反射阵天线
GEPCI-5565PIORC-210000反射内存卡优势