前言

三消游戏核心算法总结

需求分析

这里只说最经典的玩法,就是三个同色相连的就消除,其他的玩法,比如全行消除、全屏同色消除、连击消除等就先不管。

一个三消游戏流程:

  1. 开局随机生成舞台,包含不同颜色的方块。
  2. 拖动后有三个同色方块连起来,就消除,如果没有就不能拖动。
  3. 消除计算分数,一局游戏时间有限制。

游戏流程

简化的游戏流程控制伪代码

void Start(){
	生成舞台;
}

void Update(){
	if(gameOver){
	    return;
	}
	if(时间结束){
		结束UI;
		gameOver = true;
	}
}

在update中只判断游戏时间,玩家只有拖动输入,有UI事件去控制。

舞台生成

首先舞台的大小要确定,比如是8*8的,这样要提前创建好64个槽位。

要有槽位类型,或者说是物体类型,注意物体类型和物体颜色是不同的。

物体类型可以有空类型,普通颜色类型,癞子类型等,能提供多种玩法,简化来说,这里只有空类型和普通颜色类型。

在64个槽位随机创建不同的普通颜色类型物体。

生成动画要确定,原地生成的话会简单一些,比较普遍的是从上方掉落。

生成之后有先调一遍消除逻辑,具体逻辑后面再说。

全部检测消除(){
	foreach(方块 in 舞台){
		if(方块 可消除){
			获得可消除方块列表,destroy每一个方块,在原位置新建一个空类型方块;
		}
	}
	if(有消除行为){
		填充;
		全部检测消除;
	}
}

填充也有不同的填充方式,原地随机生成填充是最简单的,但常见三消都是上面的落下来,新生成的在最上面。

落下来的填充方式,需要一行行填充,也就是可能填充多次。

填充(){
	for(从倒数第二行开始,遍历每一行)
		for(遍历该行的每一个方块){
			if(该方块下方的方块类型是空类型){
				该方块下移,该方块原本位置替换为空类型
			}
		}
	填充第一行;
	if(还有空的){
		填充;
	}
}

输入与消除

游戏的输入只有鼠标拖动,利用UI事件OnMouseEnter、OnMouseDown、OnMouseUp可以判断当前拖动的物体和拖动的目的地。

这样需要给每个方块物体加上一个脚本来监听这三个事件:
nMouseDown获得当前正拖动的方块,
OnMouseEnter获得当前拖动到的位置,
OnMouseUp表示拖动结束,进行消除判断。

判断是否可消除,就是看拖动后更改的两个方块,对应的行列是否满足同色方块>=3个。

如果可消除,就调全部消除逻辑,再重新填充。
伪代码如下

if(方块1可消除 || 方块2可消除){
	获得方块1可消除列表,destroy每一个方块,在原位置新建一个空类型方块。
	获得方块2可消除列表,destroy每一个方块,在原位置新建一个空类型方块。
	计算分数;
	填充;
}

整体大致就这样吧,略有出入,大差不大,算法如此,但是还有动画、音效等。