消除星星
标签: 消灭星星小游戏
学习人数: 10.7k

前面我们经过了一系列的铺垫,终于到了最重要的一步,即消除星星。

 

可能有同学没有玩过这款小游戏,我们先百度一下游戏规则:

《消灭星星》是一款消除类游戏。游戏目标是将两个或两个以上颜色相同的方块即可消除,消除掉尽可能更多星星,获得更高的分数。

一款非常容易上瘾的消除类游戏,游戏的规则很简单:只需点击两个或两个以上颜色相同的方块即可消除。没有时间限制,每个阶段都有一个目标,完成即可进入下一关。

 

我们先不考虑积分和关卡的问题,提取其中最重要的玩法信息,只需点击两个或两个以上颜色相同的方块即可消除。

 

第一步:分析消除的规则

当我们消除了一些同色的星星之后,就会空出一些位置出来。

如何填补这些空出来的位置呢?

遵循以下规则:

1、如果中间空了行,从上往下落

2、如果中间空了列,从右往左靠

 

第二步:如何寻找周围的同色星星

我们使用遍历的方法即可,往四个方向去找,一直到找不到即结束。

算法代码实现如下:

int direct[4][2] = { 0, 1, 1, 0, 0, -1, -1, 0 };//上下左右四个方向
void FindStar(int x, int y, int color) {
	for (int i = 0; i < 4; i++) {
		int tx = x + direct[i][0];
		int ty = y + direct[i][1];
		if (mpt[tx][ty] == color) {
			mpt[tx][ty] = 0;//0表示空
			FindStar(tx, ty, color);
		}
	}
}

 

第三步:不断点击,不断消除星星

点击之后对应的数组值置为0,表示空白。

这里要特别注意两个点:

1、空白不能继续点

2、每次重新绘图都要一张新的背景图,因为旧的背景已经花了

3、使用循环刷新的方式来模拟游戏的过程

代码如下:

#include<opencv2/opencv.hpp>
#include<opencv2/core/core.hpp>
#include<opencv2/imgproc/imgproc.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<stdio.h>
using namespace cv;

const int WIDTH = 15;
const int HEIGHT = 20;

int mpt[WIDTH][HEIGHT] = { 0 };
Mat image_background;
Mat image_background_new;
Mat image_red;
Mat image_yellow;
Mat image_green;
Mat image_purple;
Mat image_blue;

enum
{
	CV_EVENT_MOUSEMOVE = 0,//移动
	CV_EVENT_LBUTTONDOWN = 1,//左键按下
	CV_EVENT_RBUTTONDOWN = 2,//右键按下
	CV_EVENT_MBUTTOND...
登录查看完整内容


课后作业

完成本节课的内容


登录后开始许愿

暂无评论,来抢沙发