- 重构了 VirtualBoard 类,优化了棋盘操作和事件处理 - 重写了 ChessPiece 类,增加了事件处理和虚拟棋子逻辑 - 更新了 ChessGame 控制器,增加了结束回合功能和对话框 - 调整了场景布局和资源引用 - 清理了冗余代码和注释
74 lines
1.9 KiB
C#
74 lines
1.9 KiB
C#
// using System.Numerics;
|
|
using Godot;
|
|
using System;
|
|
|
|
public class VirtualBoard {
|
|
private readonly int Rows;
|
|
private readonly int Cols;
|
|
private readonly VirtualPiece[,] pieces;
|
|
|
|
// <oldPiece, newPiece>
|
|
public event Action<VirtualPiece, VirtualPiece> OnSetPiecePos;
|
|
public event Action<VirtualPiece> OnInsert;
|
|
public event Action<VirtualPiece> OnRemove;
|
|
public event Action<Vector2, Vector2> 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));
|
|
}
|
|
}
|
|
}
|
|
} |