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; } }