消消乐实现下坠_消消乐游戏算法实现

本文介绍了3消乐游戏的实现细节,包括地图初始化时避免死图的情况,3消规则的判断,以及消除后格子的下坠处理。文章通过代码展示了如何检查初始地图是否存在3个相同颜色的格子相邻,以及如何消除和填充消除后的空位,确保游戏的正常进行。
摘要由CSDN通过智能技术生成

先上前端效果图

3消乐地图初始化的时候不允许有下面两种情况的发生,就是不允许3个(3个以上已经包含3个,所以只要判断3个就可以了)相同颜色的格子连在一起,

下图是两种情况,细分分为6种情况,就是初始点为3个格子中的一个为一种情况,所以细分2*3=6种情况

代码中的方法是

private boolean isLine(int x, int y){....}

代码过多,不写出来了

首先初始化地图,看代码注释应该看差不多了

3消规则,只要地图中包含其中以下3种情况就可以判断该地图不是死图,红色部分表示

相同颜色的格子,黄色代表如果这个位置如果也是相同颜色只要一动一个位置就可以

3个相同颜色格子并排在一起

比如第一张图,首先判断它上或者下是否有相同颜色

如果1格子是初始格子是红色

第一种

先判断标识2格子是否为红色,如果不是一图的情况不用判断了,如果也是红色

那么只要判断上面第一张图的4个黄色位置的格子只要有一个是红色,那么1格子就不是死格子,那么这个图就不是死图

第二种

第2张图,只要判断任意两个相邻黄色位置的格子(有4种情况:a跟b同时为红,b跟d,d跟c,a跟c)的颜色也是红色那么该格子不是死格子,该图不是死图

第三种

跟第二种很像,不过相邻变成了左右,我就不说了

细分的话应该有 2*4+4+2*4=20种情况,所以这个方法的代码量最大,不细说了

代码方法是privatebooleanisDie(intx,inty){...}

判断这个格子是否是3个以上颜色相同格子相连

比如以1格子为起点,然后向前后左右4个方向扩张

用递归的方法,就有4个方法,每个方法添加相

代码大概如下

colSet=上下相邻颜色相同的格子=向上颜色的格子+向下颜色的格子

rowSet=左右相邻颜色相同的格子=向左颜色的格子+向右颜色的格子

如果他们等于3个或者3个以上,那么他们就要被消,先存起来removeCellSet

后面再一次性消玩  i为格子的x坐标,j为y坐标

客户端要求如果不相连的区域要分离出来发给他们,分离出来的列表都要排序,这个要求比较蛋疼

格子坐标(x,y)

格子还有颜色属性Color

比如上图,removeCellSet包含上面格子的key=x+”_”+y;

只能用递归,

向相邻的格子扩张,如果相同颜色并且在removeCellSet里面

格子消掉并下降

0 1 2 3

例如上图给子格子下降

获取所有要消除的给子的x轴

比如有x=0;x=2;x=3这3列中都有空格

然后给这3列的非空格子排序,并重新按顺序填充格子,y大排下面,排完后剩下就为空,效果如下(我这是最简单的方法,不易出错,这个可以优化,优化就比较复杂了)

3消中最重要的的方法在这里,上面的方法都在这下面按顺序执行

上面代码的流程图

1跟2交换

1

2

交换后

消除后

下降后

补图

因为能消,所以再消

下降

再补图

再消,但不能再消乐,得移动其中的格子

代码结构

package com.eyugame.tade.module.glops.constant;

/**

* 宝石颜色

*

* @author k60

*/

public enum Color {

/**

* 红

*/

RED,

/**

* 黄

*/

YELLOW,

/**

* 蓝

*/

BLUE,

/**

* 绿

*/

GREEN,

/**

* 紫

*/

PURPLE

}

package com.eyugame.tade.module.glops.play;

import java.util.ArrayList;

import java.util.Collections;

import parator;

import java.util.HashSet;

import java.util.List;

import java.util.Random;

import java.util.Set;

import com.eyugame.tade.module.glops.constant.Color;

import com.eyugame.tade.module.glops.exception.NearCellException;

import com.eyugame.tade.module.glops.exception.NoSpoilageException;

import com.eyugame.tade.module.glops.model.Cell;

import com.eyugame.tade.module.glops.model.RemoveScaleResult;

/**

*

*

* @author pengwei

*/

public class BasePlay {

private final static String LINK = "_";

/**

* 地图

*/

private Cell[][] maps;

/**

* 横轴单元格数量

*/

private int xSize;

/**

* 竖轴单元格数量

*/

private int ySize;

/**

* 随机数

*/

private Random random;

/**

* 可以供随机的颜色

*/

private List liveColorList = new ArrayList();

/**

* 一次移动的一组(可能多次消除和生成)

*/

private List removeScaleResultList;

/**

* 要移除的位置

*/

private Set removeCellSet = new HashSet();

/**

* 构造方法

*

* @param xSize

* @param ySize

*/

public BasePlay(int xSize, int ySize) {

super();

this.xSize = xSize;

this.ySize = ySize;

this.maps = new Cell[xSize][ySize];

random = new Random();

this.initMaps();

while (this.isDieMap()) {

this.initMaps();

}

}

/**

* 初始化地图,给地图上色

*/

private void initMaps() {

this.initLiveColor();

for (int i = 0; i < this.xSize; i++) {

for (int j = 0; j < this.ySize; j++) {

// 可供选择的颜色

int liveSize = liveColorList.size();

// 判断该位置是否有可供选择的颜色

if (liveSize > 0) {

// 随机颜色

int tem = random.nextInt(liveSize);

Cell cell = new Cell();

String liveColor = liveColorList.get(tem);

// 给格子上坐标跟颜色

cell.setX(i);

cell.setY(j);

cell.setColor(Color.valueOf(liveColor));

// 放进地图

maps[i][j] = cell;

// 判断该格子是否有3个连在一起

if (this.isLine(i, j)) {

// 如果是有颜色重叠,从供选择的颜色中去掉该颜色,并重新随机颜色

j = j - 1;

liveColorList.remove(liveColor);

} else {

// 如果颜色没有3个重复,则初始化可供选择颜色

this.initLiveColor();

}

} else {

// 如果没有可以选择的颜色,初始化地图

this.maps = new Cell[xSize][ySize];

this.initMaps();

return;

}

}

}

}

/**

* 初始化随机颜色

*/

private void initLiveColor() {

liveColorList = new ArrayList();

Color[] colors = Color.values();

for (Color color : colors) {

liveColorList.add(new String(color.toString()));

}

}

/**

* 填充地图 不允许3格一排或者一列

*

* @param x

* 填充格子的x轴

* @param y

* 填充格子的y轴

* @return 是否填充成功

*/

private boolean isLine(int x, int y) {

boolean lx1 = x - 1 > -1;

boolean lx2 = x - 2 > -1;

boolean bx1 = x + 1 < this.xSize;

boolean bx2 = x + 2 < this.xSize;

boolean ly1 = y - 1 > -1;

boolean ly2 = y - 2 > -1;

boolean by1 = y + 1 < this.ySize;

boolean by2 = y + 2 < this.ySize;

if (ly1 && by1) {

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值