package com.znv.linkup.core.map;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import com.znv.linkup.core.GameSettings;
import com.znv.linkup.core.card.Piece;
import com.znv.linkup.core.config.LevelCfg;
import com.znv.linkup.core.map.template.MapTemplate;
import com.znv.linkup.core.map.template.RandomTemplate;
/**
* 游戏地图类
*
* @author yzb
*
*/
public class GameMap extends BaseMap {
private static final long serialVersionUID = 8129010267609099217L;
protected GameMap() {
super();
}
public GameMap(int ySize, int xSize) {
super(ySize, xSize);
Template = new MapTemplate(ySize, xSize);
}
@Override
protected boolean isRefresh(int i, int j) {
return Data[i][j] != GameSettings.GroundCardValue && Data[i][j] != GameSettings.EmptyCardValue && Data[i][j] != GameSettings.ObstacleCardValue;
}
/**
* 根据配置字符串解析出游戏地图信息
*
* @param strMap
* 地图配置字符串
* @return 游戏地图信息
*/
public static GameMap parse(String strMap) {
try {
GameMap gameMap = new GameMap();
String map = strMap;
String[] data = map.split("$");
String[] strnm = data[0].split("*");
gameMap.YSize = Integer.parseInt(strnm[0]);
gameMap.XSize = Integer.parseInt(strnm[1]);
gameMap.Data = new Byte[gameMap.YSize][gameMap.XSize];
gameMap.Template = new MapTemplate(gameMap.YSize, gameMap.XSize);
String[] rowData = data[1].split(";");
String[] cellData;
for (int i = 0; i < rowData.length; i++) {
cellData = rowData[i].split(",");
for (int j = 0; j < cellData.length; j++) {
gameMap.Data[i][j] = Byte.parseByte(cellData[j]);
gameMap.Template.Data[i][j] = MapTemplate.convertValue(gameMap.Data[i][j]);
}
}
return gameMap;
} catch (Exception ex) {
ex.printStackTrace();
}
return null;
}
/**
* 根据关卡配置生成所有卡片信息
*
* @param levelCfg
* 游戏关卡配置
* @return 所有卡片信息
*/
public static Piece[][] createPieces(LevelCfg levelCfg) {
int imageWidth = levelCfg.getPieceWidth();
int imageHeight = levelCfg.getPieceHeight();
String maptpl = levelCfg.getMaptplStr();
MapTemplate mt = null;
if (maptpl == null || maptpl.equals("")) {
mt = new RandomTemplate(levelCfg.getYSize(), levelCfg.getXSize(), levelCfg.getEmptyNum(), levelCfg.getObstacleNum());
} else {
mt = MapTemplate.parse(maptpl);
}
GameMap map = new RandomMap(mt);
Byte[][] data = map.Data;
Piece[][] pieces = new Piece[data.length][data[0].length];
Piece.YSize = data.length;
Piece.XSize = data[0].length;
List<Integer> pos = new ArrayList<Integer>(data.length * data[0].length);
for (int i = 0; i < data.length; i++) {
for (int j = 0; j < data[i].length; j++) {
Piece piece = new Piece(i, j);
piece.setWidth(imageWidth);
piece.setHeight(imageHeight);
// piece.setEmpty(data[i][j] == GameSettings.GroundCardValue);
if (data[i][j] == GameSettings.GroundCardValue) {
piece.setImageId(GameSettings.GroundCardValue);
} else if (data[i][j] == GameSettings.EmptyCardValue) {
piece.setImageId(GameSettings.GroundCardValue);
} else if (data[i][j] == GameSettings.ObstacleCardValue) {
// 只记录图片Id,界面负责创建图片
piece.setImageId(GameSettings.ObstacleCardValue);
} else {
// 只记录图片Id,界面负责创建图片
piece.setImageId(data[i][j]);
pos.add(i * data[0].length + j);
}
piece.setBeginY(i * imageHeight + levelCfg.getBeginImageY());
piece.setBeginX(j * imageWidth + levelCfg.getBeginImageX());
pieces[i][j] = piece;
}
}
// 设置是否为星星卡片
if (levelCfg.getStars() != 0) {
Collections.shuffle(pos);
if (levelCfg.getStars() < pos.size()) {
for (int i = 0; i < levelCfg.getStars(); i++) {
pieces[pos.get(i) / data[0].length][pos.get(i) % data[0].length].setStar(true);
}
}
}
return pieces;
}
protected MapTemplate Template;
}