public PieceKnight(Enums.GameSide manSide, Position position) : base(position) { this.GameSide = manSide; switch (manSide) { case Enums.GameSide.White: this.PieceType = Enums.PieceType.WhiteKnight; break; case Enums.GameSide.Black: this.PieceType = Enums.PieceType.BlackKnight; break; } }
public PieceQueen(Enums.GameSide side, Position position) : base(position) { this.GameSide = side; switch (side) { case Enums.GameSide.White: this.PieceType = Enums.PieceType.WhiteQueen; break; case Enums.GameSide.Black: this.PieceType = Enums.PieceType.BlackQueen; break; } }
/// <summary> /// 根据指定的棋子战方与指定的棋子X坐标获取开局的棋子坐标 /// </summary> /// <param name="side">指定的棋子战方</param> /// <param name="x">指定的棋子X坐标</param> protected static Position GetOpenningsPosition(Enums.GameSide side, int x) { Position point = Position.Empty; switch (side) { case Enums.GameSide.White: point = new Position(x, 1); break; case Enums.GameSide.Black: point = new Position(x, 8); break; } return(point); }
public PiecePawn(Enums.GameSide side, Position position) : base(position) { this.GameSide = side; this.EnableEnPassanted = false; switch (side) { case Enums.GameSide.White: this.PieceType = Enums.PieceType.WhitePawn; break; case Enums.GameSide.Black: this.PieceType = Enums.PieceType.BlackPawn; break; } }
public PieceKing(Enums.GameSide side, Position position) : base(position) { this.GameSide = side; this.IsMoved = false; switch (side) { case Enums.GameSide.White: this.PieceType = Enums.PieceType.WhiteKing; break; case Enums.GameSide.Black: this.PieceType = Enums.PieceType.BlackKing; break; } }
/// <summary> /// 象的基本路线(即斜向) /// </summary> internal static void BishopShift( Enums.GameSide side, ISituation situation, Position position, Positions moveInPs, Positions capturePs) { bool canContine = true; Position tgtPos = Position.Empty; canContine = true; tgtPos = position; while (canContine) { tgtPos = tgtPos.ShiftEastNorth(); canContine = Position.Shift(side, situation, tgtPos, moveInPs, capturePs); } canContine = true; tgtPos = position; while (canContine) { tgtPos = tgtPos.ShiftEastSouth(); canContine = Position.Shift(side, situation, tgtPos, moveInPs, capturePs); } canContine = true; tgtPos = position; while (canContine) { tgtPos = tgtPos.ShiftWestNorth(); canContine = Position.Shift(side, situation, tgtPos, moveInPs, capturePs); } canContine = true; tgtPos = position; while (canContine) { tgtPos = tgtPos.ShiftWestSouth(); canContine = Position.Shift(side, situation, tgtPos, moveInPs, capturePs); } }
/// <summary> /// 获取另一战方的“王” /// </summary> /// <param name="currSide">另一战方</param> /// <param name="pieces">棋子的集合</param> public PieceKing GetOtherGameSideKing(Enums.GameSide currSide) { if (currSide == Enums.GameSide.Black) { foreach (Piece piece in _pieces) { if (piece.PieceType == Enums.PieceType.WhiteKing) { return((PieceKing)piece); } } } else { foreach (Piece piece in _pieces) { if (piece.PieceType == Enums.PieceType.BlackKing) { return((PieceKing)piece); } } } throw new GameException(ExString.PieceKingIsNull); }
/// <summary> /// 从当前的位置移动到新位置。 /// 而后,判断该位置中是否有棋子,并根据判断结果更新两个Position集合(可移动"位置"集合,可杀棋"位置"集合)。 /// 并返回是否可以继续移动的判断。 /// </summary> /// <param name="situation">当前局面</param> /// <param name="tgtPos">目标位置</param> /// <param name="moveInPs">可移动"位置"集合</param> /// <param name="capturePs">可杀棋"位置"集合</param> /// <param name="enableToMoved">该棋格为空时,是否可以移入,一般是指“兵”,“兵”的斜向的两个棋格对于“兵”来讲能吃子不能移入。</param> /// <returns>移动到新位置后是否可以继续移动(当目标棋格中无棋子)</returns> public static bool Shift( Enums.GameSide side, ISituation situation, Position tgtPos, Positions moveInPs, Positions capturePs, bool enableToMoved) { if (tgtPos == Position.Empty) { return(false); } char pieceChar; if (situation.TryGetPiece(tgtPos.Dot, out pieceChar)) { if (char.IsLower(pieceChar) && side == Enums.GameSide.White) { capturePs.Add(tgtPos); } if (char.IsUpper(pieceChar) && side == Enums.GameSide.Black) { capturePs.Add(tgtPos); } return(false); } else { if (enableToMoved) { moveInPs.Add(tgtPos); return(true); } else { return(false); } } }
/// <summary> /// 移动指定位置棋格的棋子 /// </summary> /// <param name="pair">指定的成对的位置,First值为源棋格,Second值是目标棋格</param> public void PieceMoveIn(PositionPair pair) { Enums.ActionCollection actions = new Enums.ActionCollection(); Piece piece; if (this.TryGetPiece(pair.First.Dot, out piece)) { //第1步,判断一下过路兵的格子的逻辑 if (piece is PiecePawn) { if (pair.First.Y == pair.Second.Y) { return; } } actions.Add(Enums.Action.General); //第2步,判断目标棋格中是否有棋子。 //如果有棋子,更改Action,调用PieceMoveOut方法。 if (this.ContainsPiece(pair.Second.Dot)) { actions.Add(Enums.Action.Capture); this.PieceMoveOut(pair.Second); } //第3步,调用内部方法PieceMoveIn,移动棋子,并更改FEN记录 this.PieceMoveIn(piece, actions, pair.First, pair.Second); //第4步,如上一步棋出现过“过路兵”的局面,而现在进行了新的一步棋了,故而取消上一步棋的“过路兵”局面。 if (_piecePawnByEnPassanted != null) { _piecePawnByEnPassanted.EnableEnPassanted = false; _piecePawnByEnPassanted = null; } //第5步,判断是否过路兵的局面 if (piece is PiecePawn) { #region 过路兵 //成为能被吃过路兵的“兵” if ((pair.First.Y == 1 && pair.Second.Y == 3) || (pair.First.Y == 6 && pair.Second.Y == 4)) { char pawnChar; Position tmpPos = pair.Second.ShiftWest(); if (tmpPos != null) { if (this.TryGetPiece(tmpPos.Dot, out pawnChar)) { Enums.GameSide side = char.IsLower(pawnChar) ? Enums.GameSide.Black : Enums.GameSide.White; if (this.GameSide == side) { _piecePawnByEnPassanted = piece as PiecePawn; _piecePawnByEnPassanted.EnableEnPassanted = true; } } } tmpPos = pair.Second.ShiftEast(); if (tmpPos != null) { if (this.TryGetPiece(tmpPos.Dot, out pawnChar)) { Enums.GameSide side = char.IsLower(pawnChar) ? Enums.GameSide.Black : Enums.GameSide.White; if (this.GameSide == side) { _piecePawnByEnPassanted = piece as PiecePawn; _piecePawnByEnPassanted.EnableEnPassanted = true; } } } } else { ((PiecePawn)piece).EnableEnPassanted = false; } #endregion } //第6步,移动棋子后,根据移动棋子后的局面生成Action,主要是判断另一战方的“王”是否被将军 actions.Add(this.IsCheckPieceKing(piece)); //第7步,注册棋子移动后事件 OnPieceMoveInEvent(piece, actions, pair); } }
public PieceKing(Enums.GameSide side) : this(side, Position.Empty) { }
public static bool Shift( Enums.GameSide side, ISituation situation, Position tgtPos, Positions moveInPs, Positions capturePs) { return(Shift(side, situation, tgtPos, moveInPs, capturePs, true)); }