- 移除了.csproj文件 - 更新了.gitignore,添加了.editorconfig - 重构了IBoard和IPiece接口,引入了新的事件处理机制 - 优化了CCBoard、CCPiece等类的实现,使用新的事件驱动模型 - 删除了冗余代码,提高了代码的可读性和可维护性
89 lines
3.9 KiB
C#
89 lines
3.9 KiB
C#
using System.Collections;
|
|
using static ChineseChess.ChessCore;
|
|
using Vector2I = Vector.Vector2I;
|
|
|
|
namespace ChineseChess;
|
|
public interface ICCBoardOn : IBoard.IBoardOn {
|
|
void OnSteps(object self, int oldSteps) {}
|
|
}
|
|
|
|
public class CCBoard(ICCBoardOn? on = null) : AbstractBoard(9, 10, on: on) {
|
|
private int steps = 0;
|
|
protected new ICCBoardOn? on = on;
|
|
// public virtual IPieceOn? On { get => on; set => on = value; }
|
|
public new ICCBoardOn? On { get => on; set {
|
|
on = value; base.on = value;} }
|
|
|
|
public int Steps {
|
|
get => steps;
|
|
protected set {
|
|
if (steps != value) {
|
|
var oldSteps = steps;
|
|
steps = value;
|
|
on?.OnSteps(this, oldSteps);
|
|
}
|
|
}
|
|
}
|
|
|
|
public override void AddRecord(IPiece? From, IPiece? To, Vector2I FromPos, Vector2I ToPos) {
|
|
base.AddRecord(From, To, FromPos, ToPos);
|
|
Steps += 1;
|
|
}
|
|
|
|
public override void UndoRecord() {
|
|
base.UndoRecord();
|
|
if (Steps > 0) Steps -= 1;
|
|
}
|
|
|
|
public (ArrayList, ArrayList) InitGame() {
|
|
Steps = 0;
|
|
ArrayList blackPart = InitOnePartPieces(TurnsSideType.Black, [
|
|
new CCChariot (this, TurnsSideType.Black, new Vector2I( 4, 0)),
|
|
new CCHorse (this, TurnsSideType.Black, new Vector2I( 3, 0)),
|
|
new CCElephant(this, TurnsSideType.Black, new Vector2I( 2, 0)),
|
|
new CCAdvisor (this, TurnsSideType.Black, new Vector2I( 1, 0)),
|
|
new CCGeneral (this, TurnsSideType.Black, new Vector2I( 0, 0)),
|
|
new CCAdvisor (this, TurnsSideType.Black, new Vector2I(-1, 0)),
|
|
new CCElephant(this, TurnsSideType.Black, new Vector2I(-2, 0)),
|
|
new CCHorse (this, TurnsSideType.Black, new Vector2I(-3, 0)),
|
|
new CCChariot (this, TurnsSideType.Black, new Vector2I(-4, 0)),
|
|
new CCCannon (this, TurnsSideType.Black, new Vector2I( 3, 2)),
|
|
new CCCannon (this, TurnsSideType.Black, new Vector2I(-3, 2)),
|
|
new CCPawn (this, TurnsSideType.Black, new Vector2I(-4, 3)),
|
|
new CCPawn (this, TurnsSideType.Black, new Vector2I(-2, 3)),
|
|
new CCPawn (this, TurnsSideType.Black, new Vector2I( 0, 3)),
|
|
new CCPawn (this, TurnsSideType.Black, new Vector2I( 2, 3)),
|
|
new CCPawn (this, TurnsSideType.Black, new Vector2I( 4, 3)),
|
|
]);
|
|
|
|
ArrayList redPart = InitOnePartPieces(TurnsSideType.Red, [
|
|
new CCChariot (this, TurnsSideType.Red, new Vector2I( 4, 0)),
|
|
new CCHorse (this, TurnsSideType.Red, new Vector2I( 3, 0)),
|
|
new CCElephant(this, TurnsSideType.Red, new Vector2I( 2, 0)),
|
|
new CCAdvisor (this, TurnsSideType.Red, new Vector2I( 1, 0)),
|
|
new CCGeneral (this, TurnsSideType.Red, new Vector2I( 0, 0)),
|
|
new CCAdvisor (this, TurnsSideType.Red, new Vector2I(-1, 0)),
|
|
new CCElephant(this, TurnsSideType.Red, new Vector2I(-2, 0)),
|
|
new CCHorse (this, TurnsSideType.Red, new Vector2I(-3, 0)),
|
|
new CCChariot (this, TurnsSideType.Red, new Vector2I(-4, 0)),
|
|
new CCCannon (this, TurnsSideType.Red, new Vector2I( 3, 2)),
|
|
new CCCannon (this, TurnsSideType.Red, new Vector2I(-3, 2)),
|
|
new CCPawn (this, TurnsSideType.Red, new Vector2I(-4, 3)),
|
|
new CCPawn (this, TurnsSideType.Red, new Vector2I(-2, 3)),
|
|
new CCPawn (this, TurnsSideType.Red, new Vector2I( 0, 3)),
|
|
new CCPawn (this, TurnsSideType.Red, new Vector2I( 2, 3)),
|
|
new CCPawn (this, TurnsSideType.Red, new Vector2I( 4, 3)),
|
|
]);
|
|
|
|
return (blackPart, redPart);
|
|
}
|
|
|
|
private ArrayList InitOnePartPieces(TurnsSideType side, CCPiece[] pieces) {
|
|
ArrayList list = [];
|
|
foreach (var piece in pieces) {
|
|
list.Add(piece);
|
|
InsertPiece(piece, piece.Pos);
|
|
}
|
|
return list;
|
|
}
|
|
} |