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;
}
}