private bool IsMoveLegal(TurnRecord potentialTurn)
        {
            // Special cases for castling
            if (IsMoveCastle(potentialTurn.Move))
            {
                Side sideInCheck = Side.White;
                if (IsCheck(_model, out sideInCheck) && sideInCheck == _model.GameInformation.NextToMove)
                {
                    // Castling is not allowed when player is in check
                    return(false);
                }

                var kingMovedBy       = potentialTurn.Move.To.Column - potentialTurn.Move.From.Column;
                var moveDirection     = kingMovedBy / Math.Abs(kingMovedBy);
                var from              = potentialTurn.Move.From;
                var movedThrough      = new BoardPosition((uint)(from.Column + moveDirection), from.Row);
                var turnTask          = TurnFromPiecePositionChange(potentialTurn.Move.PieceMoved, potentialTurn.Move.From, movedThrough, false);
                var intermediateState = _model.SimulateMove(turnTask.Result);
                if (!IsGameStateLegal(intermediateState))
                {
                    // if it is illegal for the king to move to the intermediate position, castling is not allowed.
                    return(false);
                }
            }

            var stateAfterTurn = _model.SimulateMove(potentialTurn);

            if (!IsGameStateLegal(stateAfterTurn))
            {
                return(false);
            }

            return(true);
        }
Ejemplo n.º 2
0
        internal static string SerializeTurnRecord(TurnRecord turn)
        {
            if (turn.SecondaryMove != null)
            {
                if (turn.Move.To.Column >= 5)
                {
                    return(KingsideCastleStr);
                }
                else
                {
                    return(QueensideCastleStr);
                }
            }

            string turnStr = SerializationHelper.SerializeBoardPosition(turn.Move.From);

            if (turn.Capture != null)
            {
                turnStr += "x";
            }
            else
            {
                turnStr += "-";
            }

            turnStr += SerializationHelper.SerializeBoardPosition(turn.Move.To);
            if (turn.Promotion != null)
            {
                turnStr += "(" + SerializationHelper.SerializePieceCapabilities(turn.Promotion.NewCapabilities) + ")";
            }

            return(turnStr);
        }
Ejemplo n.º 3
0
    /*
     * calculate all materials and food generated that turn and add it to current stockpile
     */
    private void updateResources()
    {
        material = material + materialsThisTurn + Convert.ToInt32(materialsThisTurn * (factoryCount * factoryBonus) + materialsThisTurn * (powerCount * powerBonus));
        food = food + foodThisTurn + Convert.ToInt32(foodThisTurn * (schoolCount * schoolBonus));
        TurnRecord t = new TurnRecord (gold, material, food, population, environment, foodThisTurn, materialsThisTurn);
        game.addTurn (t);
        factoryCount = 0;
        powerCount = 0;
        schoolCount = 0;

        updateResourceHUDs ();
    }
        private async Task <TurnRecord> TurnFromPiecePositionChange(Piece pieceMoved, BoardPosition from, BoardPosition to, bool doGetPromotionSelectionIfNeeded)
        {
            TurnRecord      turn      = null;
            CaptureRecord   capture   = null;
            PromotionRecord promotion = null;
            var             move      = new MoveRecord(pieceMoved, from, to);

            Piece pieceCaptured = null;

            if ((pieceCaptured = _model.GetPieceAt(to)) != null)
            {
                capture = new CaptureRecord(pieceCaptured);
            }

            if (pieceMoved.Capabilities is PawnCapabilities)
            {
                // TODO: handle en passant if needed

                // promotion
                if (doGetPromotionSelectionIfNeeded &&
                    ((pieceMoved.Side == Side.White && to.Row == 7) ||
                     (pieceMoved.Side == Side.Black && to.Row == 0)))
                {
                    var newCapability = await _board.GetPromotionSelectionAsync();

                    promotion = new PromotionRecord(pieceMoved, newCapability);
                }
            }

            if (capture != null || promotion != null)
            {
                turn = new TurnRecord(move, capture, promotion);
            }
            else if (IsMoveCastle(move))
            {
                var kingMovedBy       = move.To.Column - move.From.Column;
                var moveDirection     = kingMovedBy / Math.Abs(kingMovedBy);
                var newCastlePosition = new BoardPosition((uint)(move.From.Column + moveDirection), move.From.Row);

                if (kingMovedBy < 0)
                {
                    var castlePosition = new BoardPosition(0, move.From.Row);
                    var castleToMove   = _model.GetPieceAt(castlePosition);
                    var secondaryMove  = new MoveRecord(castleToMove, castlePosition, newCastlePosition);
                    turn = new TurnRecord(move, secondaryMove);
                }
                else
                {
                    var castlePosition = new BoardPosition(7, move.From.Row);
                    var castleToMove   = _model.GetPieceAt(castlePosition);
                    var secondaryMove  = new MoveRecord(castleToMove, castlePosition, newCastlePosition);
                    turn = new TurnRecord(move, secondaryMove);
                }
            }
            else
            {
                turn = new TurnRecord(move);
            }

            return(turn);
        }