Files
zp2/backend/src/main/java/com/zombie/game/model/MapData.java
2026-07-26 14:41:36 +08:00

145 lines
5.7 KiB
Java

package com.zombie.game.model;
import java.util.List;
import java.util.Map;
import java.util.HashMap;
import java.util.ArrayList;
/** Serializable map data for storage or network transfer / 可序列化的地图数据,用于存储或网络传输 */
public class MapData {
// Map unique identifier / 地图唯一标识
private String id;
// Map display name / 地图显示名称
private String name;
// Map width in grid units / 地图宽度(网格单位)
private int width;
// Map height in grid units / 地图高度(网格单位)
private int height;
// List of wall data maps / 墙壁数据映射列表
private List<Map<String, Object>> walls;
// List of player spawn coordinates / 玩家出生点坐标列表
private List<Map<String, Integer>> playerSpawns;
// List of zombie spawn coordinates / 僵尸出生点坐标列表
private List<Map<String, Integer>> zombieSpawns;
// Default constructor / 默认构造函数
public MapData() {
this.walls = new ArrayList<>();
this.playerSpawns = new ArrayList<>();
this.zombieSpawns = new ArrayList<>();
}
// Full constructor with all fields / 全字段构造函数
public MapData(String id, String name, int width, int height,
List<Map<String, Object>> walls,
List<Map<String, Integer>> playerSpawns,
List<Map<String, Integer>> zombieSpawns) {
this.id = id;
this.name = name;
this.width = width;
this.height = height;
this.walls = walls;
this.playerSpawns = playerSpawns;
this.zombieSpawns = zombieSpawns;
}
// Get map ID / 获取地图ID
public String getId() { return id; }
// Set map ID / 设置地图ID
public void setId(String id) { this.id = id; }
// Get map name / 获取地图名称
public String getName() { return name; }
// Set map name / 设置地图名称
public void setName(String name) { this.name = name; }
// Get map width / 获取地图宽度
public int getWidth() { return width; }
// Set map width / 设置地图宽度
public void setWidth(int width) { this.width = width; }
// Get map height / 获取地图高度
public int getHeight() { return height; }
// Set map height / 设置地图高度
public void setHeight(int height) { this.height = height; }
// Get walls list / 获取墙壁列表
public List<Map<String, Object>> getWalls() { return walls; }
// Set walls list / 设置墙壁列表
public void setWalls(List<Map<String, Object>> walls) { this.walls = walls; }
// Get player spawns / 获取玩家出生点
public List<Map<String, Integer>> getPlayerSpawns() { return playerSpawns; }
// Set player spawns / 设置玩家出生点
public void setPlayerSpawns(List<Map<String, Integer>> playerSpawns) { this.playerSpawns = playerSpawns; }
// Get zombie spawns / 获取僵尸出生点
public List<Map<String, Integer>> getZombieSpawns() { return zombieSpawns; }
// Set zombie spawns / 设置僵尸出生点
public void setZombieSpawns(List<Map<String, Integer>> zombieSpawns) { this.zombieSpawns = zombieSpawns; }
// Convert this map data to a 2D cell array / 将此地图数据转换为二维格子数组
public int[][] toCells() {
int[][] cells = new int[height][width];
for (int y = 0; y < height; y++) {
for (int x = 0; x < width; x++) {
cells[y][x] = 0;
}
}
// Mark wall cells / 标记墙壁格子
for (Map<String, Object> wall : walls) {
int x = (Integer) wall.get("x");
int y = (Integer) wall.get("y");
if (x >= 0 && x < width && y >= 0 && y < height) {
cells[y][x] = 1;
}
}
// Mark player spawn cells / 标记玩家出生点格子
for (Map<String, Integer> spawn : playerSpawns) {
int x = spawn.get("x");
int y = spawn.get("y");
if (x >= 0 && x < width && y >= 0 && y < height) {
cells[y][x] = 2;
}
}
// Mark zombie spawn cells / 标记僵尸出生点格子
for (Map<String, Integer> spawn : zombieSpawns) {
int x = spawn.get("x");
int y = spawn.get("y");
if (x >= 0 && x < width && y >= 0 && y < height) {
cells[y][x] = 3;
}
}
return cells;
}
// Create MapData from a GameMap instance / 从GameMap实例创建MapData
public static MapData fromGameMap(String id, String name, GameMap map) {
List<Map<String, Object>> walls = new ArrayList<>();
List<Map<String, Integer>> playerSpawns = new ArrayList<>();
List<Map<String, Integer>> zombieSpawns = new ArrayList<>();
// Convert static walls from raw data
for (int[] pos : map.getStaticWallData()) {
Map<String, Object> wallData = new HashMap<>();
wallData.put("x", pos[0]);
wallData.put("y", pos[1]);
wallData.put("type", "static");
walls.add(wallData);
}
// Convert nut walls from raw data
for (int[] pos : map.getNutWallData()) {
Map<String, Object> wallData = new HashMap<>();
wallData.put("x", pos[0]);
wallData.put("y", pos[1]);
wallData.put("type", "nut");
walls.add(wallData);
}
// Convert player spawn points
for (int[] spawn : map.getSpawnPoints()) {
Map<String, Integer> sp = new HashMap<>();
sp.put("x", spawn[0]);
sp.put("y", spawn[1]);
playerSpawns.add(sp);
}
return new MapData(id, name, map.getWidth(), map.getHeight(), walls, playerSpawns, zombieSpawns);
}
}