refactor(chess): 重构象棋程序基础结构,使用Nullable重构核心代码
- 更新了多个文件的代码结构和类型定义,提高了代码的健壮性和可维护性 - 优化了事件处理、棋子管理和移动逻辑,为后续功能扩展打下坚实基础 - 修复了一些潜在的空指针异常问题,提高了程序的稳定性 - 修复部分bug
This commit is contained in:
@ -7,7 +7,7 @@ public class Player {
|
||||
private readonly CCBoard board;
|
||||
private readonly SelectedPiece selectedNode;
|
||||
|
||||
public EventHandler<IBoard.MoveEventArgs> OnMove;
|
||||
public EventHandler<IBoard.MoveEventArgs>? OnMove;
|
||||
public bool CanMove { get; set; } = true;
|
||||
|
||||
public enum PlayerType {
|
||||
@ -24,7 +24,7 @@ public class Player {
|
||||
public void HandleBoardPosClick(Vector2I clickPos) {
|
||||
if (board.IsPosOutOfRange(clickPos)) return;
|
||||
// Console.WriteLine($"VirtualBoard {clickPos} clicked");
|
||||
IPiece clickChess = board.GetPiece(clickPos);
|
||||
IPiece? clickChess = board.GetPiece(clickPos);
|
||||
|
||||
if (!selectedNode.HasSelected()) {
|
||||
// Select piece
|
||||
@ -45,9 +45,10 @@ public class Player {
|
||||
|
||||
public void MoveAndRecord(Vector2I toPos, Vector2I fromPos) {
|
||||
// GD.Print($"{fromPos} move to {toPos}");
|
||||
IPiece toChess = board.GetPiece(toPos);
|
||||
IPiece fromChess = board.GetPiece(fromPos);
|
||||
IPiece? toChess = board.GetPiece(toPos);
|
||||
IPiece? fromChess = board.GetPiece(fromPos);
|
||||
if (fromChess != null) fromChess.IsSelected = false;
|
||||
else return;
|
||||
|
||||
selectedNode.Clear();
|
||||
if (!fromChess.CanMove(toPos)) {
|
||||
@ -55,7 +56,8 @@ public class Player {
|
||||
}
|
||||
|
||||
// MUST BE THERE !!! 防止删除节点后在启动回调导致错误
|
||||
OnMove?.Invoke(this, new IBoard.MoveEventArgs { From = fromPos, To = toPos });
|
||||
OnMove?.Invoke(this, new IBoard.MoveEventArgs
|
||||
{ From = fromPos, To = toPos, Piece = fromChess });;
|
||||
|
||||
if (toChess != null) {
|
||||
board.RemovePiece(toPos);
|
||||
@ -76,9 +78,9 @@ public class Player {
|
||||
private class SelectedPiece {
|
||||
// Called when the node enters the scene tree for the first time.
|
||||
private Vector2I selectedNodePos = Vector2I.MaxValue;
|
||||
private IPiece piece;
|
||||
private IPiece? piece = null;
|
||||
private readonly CCBoard board;
|
||||
public ArrayList allowedPieces = null;
|
||||
public ArrayList? allowedPieces = null;
|
||||
|
||||
public SelectedPiece(CCBoard board) {
|
||||
this.board = board;
|
||||
@ -87,7 +89,8 @@ public class Player {
|
||||
public void Clear() {
|
||||
if (selectedNodePos != Vector2I.MaxValue) {
|
||||
selectedNodePos = Vector2I.MaxValue;
|
||||
piece.IsSelected = false;
|
||||
if (piece != null)
|
||||
piece.IsSelected = false;
|
||||
}
|
||||
// Console.WriteLine("SelectedPiece.Clear {0}", piece);
|
||||
}
|
||||
@ -98,11 +101,13 @@ public class Player {
|
||||
return;
|
||||
}
|
||||
selectedNodePos = pos;
|
||||
if (piece == null)
|
||||
return;
|
||||
piece.IsSelected = true;
|
||||
Console.WriteLine("SelectedPiece.SetPos {0}", piece);
|
||||
}
|
||||
|
||||
public IPiece GetPiece() {
|
||||
public IPiece? GetPiece() {
|
||||
return piece;
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user