- 重构了 ChessBoard 和 ChessPiece 类的逻辑 - 添加了新版本的 ChineseChess 库 - 删除了旧版本的 VirtualBoard 和 VirtualPiece 类 - 更新了相关的场景和脚本
107 lines
3.1 KiB
C#
107 lines
3.1 KiB
C#
using Vector2 = Vector.Vector2I;
|
|
using System;
|
|
using System.Collections;
|
|
namespace ChineseChess;
|
|
|
|
public class ChessCore {
|
|
public enum Mode {
|
|
SingleMode,
|
|
MultiMode,
|
|
DebugMode,
|
|
};
|
|
|
|
public enum TurnsSideType {
|
|
Red,
|
|
Black,
|
|
};
|
|
|
|
public enum PlayerSideType {
|
|
Self,
|
|
Opponent,
|
|
Any,
|
|
};
|
|
|
|
private TurnsSideType sideType = TurnsSideType.Red;
|
|
private readonly TurnsSideType selfSide;
|
|
public readonly CCBoard board = new();
|
|
private readonly Player playerSelf;
|
|
private readonly Player playerOpponent;
|
|
// public EventHandler<IBoard.MoveEventArgs> OnMove;
|
|
public ChessCore(Mode mode, TurnsSideType selfSide) {
|
|
this.selfSide = selfSide;
|
|
|
|
playerSelf = new(board, Player.PlayerType.Human);
|
|
playerOpponent = new(board, Player.PlayerType.Human);
|
|
|
|
void func(object _self, IBoard.MoveEventArgs record) {
|
|
// 防止 Undo 时 Selected Clear 出现 Null Pointer Exception
|
|
playerSelf.SelectedClear();
|
|
playerOpponent.SelectedClear();
|
|
board.AddRecord(board.GetPiece(record.From), board.GetPiece(record.To),
|
|
record.From, record.To);
|
|
}
|
|
playerSelf.OnMove += func;
|
|
playerOpponent.OnMove += func;
|
|
switch (mode) {
|
|
case Mode.SingleMode:
|
|
break;
|
|
case Mode.MultiMode:
|
|
break;
|
|
default:
|
|
case Mode.DebugMode:
|
|
throw new NotImplementedException();
|
|
}
|
|
}
|
|
|
|
public void Init() {
|
|
(ArrayList blackPart, ArrayList redPart) = board.InitGame();
|
|
if (selfSide == TurnsSideType.Red) {
|
|
playerSelf.SetAllowedPieces(redPart);
|
|
playerOpponent.SetAllowedPieces(blackPart);
|
|
} else {
|
|
playerSelf.SetAllowedPieces(blackPart);
|
|
playerOpponent.SetAllowedPieces(redPart);
|
|
}
|
|
}
|
|
|
|
public void OnPosClicked(Vector2 pos, PlayerSideType clickedSide = PlayerSideType.Any) {
|
|
if (GetTurnsType() == selfSide) {
|
|
playerSelf.CanMove = true;
|
|
playerOpponent.CanMove = false;
|
|
} else {
|
|
playerSelf.CanMove = false;
|
|
playerOpponent.CanMove = true;
|
|
}
|
|
|
|
switch (clickedSide) {
|
|
case PlayerSideType.Any:
|
|
playerSelf.HandleBoardPosClick(pos);
|
|
playerOpponent.HandleBoardPosClick(pos);
|
|
break;
|
|
case PlayerSideType.Self:
|
|
playerSelf.HandleBoardPosClick(pos);
|
|
break;
|
|
case PlayerSideType.Opponent:
|
|
playerOpponent.HandleBoardPosClick(pos);
|
|
break;
|
|
}
|
|
}
|
|
|
|
public TurnsSideType GetTurnsType() {
|
|
sideType = board.Steps % 2 == 0 ? TurnsSideType.Red : TurnsSideType.Black;
|
|
return sideType;
|
|
}
|
|
|
|
public void Undo() {
|
|
playerSelf.SelectedClear();
|
|
playerOpponent.SelectedClear();
|
|
board.UndoRecord();
|
|
}
|
|
|
|
public void ReInit() {
|
|
playerSelf.SelectedClear();
|
|
playerOpponent.SelectedClear();
|
|
board.Clear(true);
|
|
Init();
|
|
}
|
|
} |