refactor(chess): 重构象棋程序基础结构,使用Nullable重构核心代码
- 更新了多个文件的代码结构和类型定义,提高了代码的健壮性和可维护性 - 优化了事件处理、棋子管理和移动逻辑,为后续功能扩展打下坚实基础 - 修复了一些潜在的空指针异常问题,提高了程序的稳定性 - 修复部分bug
This commit is contained in:
@ -6,20 +6,20 @@ using static IBoard;
|
||||
public abstract class AbstractBoard : IBoard {
|
||||
private readonly int rows;
|
||||
private readonly int cols;
|
||||
protected readonly IPiece[,] pieces;
|
||||
protected readonly IPiece?[,] pieces;
|
||||
protected readonly List<MoveRecord> moveRecords = new();
|
||||
protected readonly int MAX_RECORDS;
|
||||
|
||||
public int Rows => rows;
|
||||
public int Cols => cols;
|
||||
|
||||
public event EventHandler<SetPieceEventArgs> OnSetPiece;
|
||||
public event EventHandler<IPiece> OnInsert;
|
||||
public event EventHandler<IPiece> OnRemove;
|
||||
public event EventHandler<MoveEventArgs> OnMove;
|
||||
public event EventHandler<SetPieceEventArgs>? OnSetPiece;
|
||||
public event EventHandler<IPiece>? OnInsert;
|
||||
public event EventHandler<IPiece>? OnRemove;
|
||||
public event EventHandler<MoveEventArgs>? OnMove;
|
||||
|
||||
public event EventHandler<MoveRecord> OnAddRecord;
|
||||
public event EventHandler<MoveRecord> OnUndoRecord;
|
||||
public event EventHandler<MoveRecord>? OnAddRecord;
|
||||
public event EventHandler<MoveRecord>? OnUndoRecord;
|
||||
|
||||
public AbstractBoard(int rows, int cols, int maxRecords = int.MaxValue) {
|
||||
this.rows = rows;
|
||||
@ -32,15 +32,15 @@ public abstract class AbstractBoard : IBoard {
|
||||
return arrayPos.X < 0 || arrayPos.X >= Rows || arrayPos.Y < 0 || arrayPos.Y >= Cols;
|
||||
}
|
||||
|
||||
public virtual IPiece GetPiece(Vector2I arrayPos) {
|
||||
public virtual IPiece? GetPiece(Vector2I arrayPos) {
|
||||
if (IsPosOutOfRange(arrayPos)) return null;
|
||||
return pieces[arrayPos.X, arrayPos.Y];
|
||||
}
|
||||
|
||||
public virtual IPiece SetPiece(IPiece piece, Vector2I pos) {
|
||||
public virtual IPiece? SetPiece(IPiece? piece, Vector2I pos) {
|
||||
if (IsPosOutOfRange(pos)) return null;
|
||||
|
||||
IPiece oldPiece = pieces[pos.X, pos.Y];
|
||||
IPiece? oldPiece = pieces[pos.X, pos.Y];
|
||||
pieces[pos.X, pos.Y] = piece;
|
||||
if (piece != null) piece.Pos = pos;
|
||||
// if (oldPiece != null) oldPiece.Pos = Vector2I.Zero;
|
||||
@ -64,8 +64,8 @@ public abstract class AbstractBoard : IBoard {
|
||||
return false;
|
||||
}
|
||||
|
||||
IPiece piece = GetPiece(from);
|
||||
if (GetPiece(to) != null && piece == null) {
|
||||
IPiece? piece = GetPiece(from);
|
||||
if (GetPiece(to) != null || piece == null) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@ -75,8 +75,9 @@ public abstract class AbstractBoard : IBoard {
|
||||
return true;
|
||||
}
|
||||
|
||||
public virtual IPiece RemovePiece(Vector2I pos) {
|
||||
IPiece piece = GetPiece(pos);
|
||||
public virtual IPiece? RemovePiece(Vector2I pos) {
|
||||
IPiece? piece = GetPiece(pos);
|
||||
if (piece == null) return null;
|
||||
OnRemove?.Invoke(this, piece);
|
||||
return SetPiece(null, pos);
|
||||
}
|
||||
@ -96,7 +97,7 @@ public abstract class AbstractBoard : IBoard {
|
||||
moveRecords.Clear();
|
||||
}
|
||||
|
||||
public virtual void AddRecord(IPiece From, IPiece To, Vector2I FromPos, Vector2I ToPos) {
|
||||
public virtual void AddRecord(IPiece? From, IPiece? To, Vector2I FromPos, Vector2I ToPos) {
|
||||
if (moveRecords.Count >= MAX_RECORDS) {
|
||||
moveRecords.RemoveAt(0);
|
||||
}
|
||||
@ -125,12 +126,12 @@ public abstract class AbstractBoard : IBoard {
|
||||
}
|
||||
|
||||
public class MoveRecord {
|
||||
public IPiece From { get; }
|
||||
public IPiece To { get; }
|
||||
public IPiece? From { get; }
|
||||
public IPiece? To { get; }
|
||||
public Vector2I FromPos { get; }
|
||||
public Vector2I ToPos { get; }
|
||||
|
||||
public MoveRecord(IPiece From, IPiece To, Vector2I FromPos, Vector2I ToPos) {
|
||||
public MoveRecord(IPiece? From, IPiece? To, Vector2I FromPos, Vector2I ToPos) {
|
||||
this.From = From;
|
||||
this.To = To;
|
||||
this.ToPos = ToPos;
|
||||
|
Reference in New Issue
Block a user