前言
三消游戏核心算法总结
需求分析
这里只说最经典的玩法,就是三个同色相连的就消除,其他的玩法,比如全行消除、全屏同色消除、连击消除等就先不管。
一个三消游戏流程:
- 开局随机生成舞台,包含不同颜色的方块。
- 拖动后有三个同色方块连起来,就消除,如果没有就不能拖动。
- 消除计算分数,一局游戏时间有限制。
游戏流程
简化的游戏流程控制伪代码
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每一个方块,在原位置新建一个空类型方块。
计算分数;
填充;
}
整体大致就这样吧,略有出入,大差不大,算法如此,但是还有动画、音效等。