using System.Collections.Generic; using UnityEngine; /// /// 棋盘数据管理(普通类): /// 维护 9x10 棋子网格与全部棋子数据,负责落子/吃子/模拟回滚等纯数据操作 /// public class ChessBoardManager { /// 网格数据 grid[x,y](null = 空位) private ChessPieceData[,] grid = new ChessPieceData[ChessConst.BoardWidth, ChessConst.BoardHeight]; /// 全部棋子(含已被吃的,id 即添加顺序) public List allPieces = new List(); public ChessPieceData GetPiece(int x, int y) { if (!ChessConst.InBoard(x, y)) return null; return grid[x, y]; } public ChessPieceData GetPiece(Vector2Int p) { return GetPiece(p.x, p.y); } /// 初始化一副标准开局棋子 public void InitDefaultBoard() { grid = new ChessPieceData[ChessConst.BoardWidth, ChessConst.BoardHeight]; allPieces.Clear(); int id = 0; // 底线:车马象士将士士象马车 var backRow = new[] { ChessPieceType.Ju, ChessPieceType.Ma, ChessPieceType.Xiang, ChessPieceType.Shi, ChessPieceType.Jiang, ChessPieceType.Shi, ChessPieceType.Xiang, ChessPieceType.Ma, ChessPieceType.Ju }; // 红方(下方 y0~4) for (int x = 0; x < ChessConst.BoardWidth; x++) AddPiece(id++, backRow[x], ChessCamp.Red, x, 0); AddPiece(id++, ChessPieceType.Pao, ChessCamp.Red, 1, 2); AddPiece(id++, ChessPieceType.Pao, ChessCamp.Red, 7, 2); for (int x = 0; x < ChessConst.BoardWidth; x += 2) AddPiece(id++, ChessPieceType.Bing, ChessCamp.Red, x, 3); // 黑方(上方 y5~9) for (int x = 0; x < ChessConst.BoardWidth; x++) AddPiece(id++, backRow[x], ChessCamp.Black, x, 9); AddPiece(id++, ChessPieceType.Pao, ChessCamp.Black, 1, 7); AddPiece(id++, ChessPieceType.Pao, ChessCamp.Black, 7, 7); for (int x = 0; x < ChessConst.BoardWidth; x += 2) AddPiece(id++, ChessPieceType.Bing, ChessCamp.Black, x, 6); } private ChessPieceData AddPiece(int id, ChessPieceType type, ChessCamp camp, int x, int y) { var p = new ChessPieceData { id = id, pieceType = type, camp = camp, pos = new Vector2Int(x, y), isAlive = true }; allPieces.Add(p); grid[x, y] = p; return p; } /// 查找某方存活的将 / 帅 public ChessPieceData FindKing(ChessCamp camp) { for (int i = 0; i < allPieces.Count; i++) { var p = allPieces[i]; if (p.isAlive && p.camp == camp && p.pieceType == ChessPieceType.Jiang) return p; } return null; } /// /// 真正执行移动(被吃的棋子标记 isAlive=false)。不做任何规则校验,调用方负责校验。 /// 返回被吃的棋子(没吃子返回 null) /// public ChessPieceData ApplyMove(ChessPieceData piece, Vector2Int to) { ChessPieceData captured = GetPiece(to); if (captured != null) captured.isAlive = false; grid[piece.pos.x, piece.pos.y] = null; piece.pos = to; grid[to.x, to.y] = piece; return captured; } /// /// 回退一步移动(配合悔棋 / 规则模拟): /// 把 piece 移回 from,把 captured(可为 null)复活在原位置 /// public void UndoMove(ChessPieceData piece, Vector2Int from, ChessPieceData captured) { Vector2Int to = piece.pos; grid[to.x, to.y] = captured; if (captured != null) { captured.isAlive = true; captured.pos = to; } piece.pos = from; grid[from.x, from.y] = piece; } }