// using System.Numerics; using Godot; using System; public class VirtualBoard { private readonly int Rows; private readonly int Cols; private readonly VirtualPiece[,] pieces; // public event Action OnSetPiecePos; public event Action OnInsert; public event Action OnRemove; public event Action OnMove; public VirtualBoard(int Rows, int Cols) { this.Rows = Rows; this.Cols = Cols; pieces = new VirtualPiece[Rows, Cols]; } public bool ArrPosOutOfRange(Vector2 arrayPos) { return arrayPos.X < 0 || arrayPos.X >= Rows || arrayPos.Y < 0 || arrayPos.Y >= Cols; } public VirtualPiece GetPiece(Vector2 arrayPos) { if (ArrPosOutOfRange(arrayPos)) return null; return pieces[(int)arrayPos.X, (int)arrayPos.Y]; } public VirtualPiece SetPiecePos(VirtualPiece piece, Vector2 arrayPos) { VirtualPiece ret = null; if (ArrPosOutOfRange(arrayPos)) return ret; ret = pieces[(int)arrayPos.X, (int)arrayPos.Y]; pieces[(int)arrayPos.X, (int)arrayPos.Y] = piece; OnSetPiecePos?.Invoke(ret, piece); piece?.Move(arrayPos); return ret; } public bool InsertPiece(VirtualPiece piece, Vector2 arrayPos) { if (GetPiece(arrayPos) != null) { return false; } OnInsert?.Invoke(piece); SetPiecePos(piece, arrayPos); return true; } public bool MovePiece(Vector2 from, Vector2 to) { if (ArrPosOutOfRange(to) || ArrPosOutOfRange(from)) { return false; } if (GetPiece(to) != null) { return false; } OnMove?.Invoke(from, to); SetPiecePos(SetPiecePos(null, from), to); return true; } public bool RemovePiece(Vector2 pos) { OnRemove?.Invoke(GetPiece(pos)); return SetPiecePos(null, pos) != null; } public void Clear() { for (int i = 0; i < Rows; i++) { for (int j = 0; j < Cols; j++) { RemovePiece(new Vector2(i, j)); } } } }