先上前端效果图
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) {