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); }
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); }
/* * 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); }