Beispiel #1
0
        /// <summary>
        ///		Crea una pieza
        /// </summary>
        private PieceBaseModel CreatePiece(PieceBaseModel.PieceType type, PieceBaseModel.PieceColor color)
        {
            switch (type)
            {
            case PieceBaseModel.PieceType.Pawn:
                return(new PawnModel(color));

            case PieceBaseModel.PieceType.Rook:
                return(new RookModel(color));

            case PieceBaseModel.PieceType.Knight:
                return(new KnightModel(color));

            case PieceBaseModel.PieceType.Bishop:
                return(new BishopModel(color));

            case PieceBaseModel.PieceType.Queen:
                return(new QueenModel(color));

            case PieceBaseModel.PieceType.King:
                return(new KingModel(color));

            default:
                throw new ArgumentException($"Piece type unknown: {type}");
            }
        }
 /// <summary>
 ///		Crea un promoción
 /// </summary>
 private void CreatePromoteAction(PieceBaseModel.PieceType?piece, PieceBaseModel.PieceColor color, CellModel to)
 {
     if (piece != null)
     {
         Add(new ActionPromoteModel(piece ?? PieceBaseModel.PieceType.Unknown, color, to));
     }
 }
        /// <summary>
        ///		Añade una pieza
        /// </summary>
        public void Add(PieceBaseModel.PieceType piece, PieceBaseModel.PieceColor color, CellModel cell)
        {
            switch (piece)
            {
            case PieceBaseModel.PieceType.Pawn:
                Add(new PawnModel(color, cell));
                break;

            case PieceBaseModel.PieceType.Rook:
                Add(new RookModel(color, cell));
                break;

            case PieceBaseModel.PieceType.Knight:
                Add(new KnightModel(color, cell));
                break;

            case PieceBaseModel.PieceType.Bishop:
                Add(new BishopModel(color, cell));
                break;

            case PieceBaseModel.PieceType.Queen:
                Add(new QueenModel(color, cell));
                break;

            case PieceBaseModel.PieceType.King:
                Add(new KingModel(color, cell));
                break;
            }
        }
Beispiel #4
0
 public ActionMoveModel(PieceBaseModel.PieceType type, PieceBaseModel.PieceColor color,
                        int fromRow, int fromColumn, int toRow, int toColumn) : base(type, color)
 {
     FromRow    = fromRow;
     FromColumn = fromColumn;
     ToRow      = toRow;
     ToColumn   = toColumn;
 }
 public Figure(int row, int column, PieceBaseModel.PieceColor color, PieceBaseModel.PieceType?type, Image image, Label label)
 {
     Row    = row;
     Column = column;
     Color  = color;
     Type   = type;
     Image  = image;
     Label  = label;
 }
        /// <summary>
        ///		Crea una variación
        /// </summary>
        private VariationModel CreateVariation(PieceBaseModel.PieceColor actualColor, PieceBaseModelCollection previousPieces, RAVEntry rav)
        {
            VariationModel variation = new VariationModel();

            // Asigna las piezas
            variation.Setup = CreateBoardSetup(actualColor, previousPieces);
            // Interpreta la lista de movimiento
            variation.Movements.AddRange(ParseMovements(variation, rav.MoveText));
            // Devuelve la variación
            return(variation);
        }
Beispiel #7
0
 public CellViewModel(int row, int column, PieceBaseModel.PieceColor color) : base(row, column, color)
 {
     if (color == PieceBaseModel.PieceColor.White)
     {
         FileImage = "BoardLight.gif";
     }
     else
     {
         FileImage = "BoardDark.gif";
     }
 }
Beispiel #8
0
 /// <summary>
 ///		Inhabilita el enroque corto
 /// </summary>
 internal void DisableCastleKingSide(PieceBaseModel.PieceColor color)
 {
     if (color == PieceBaseModel.PieceColor.White)
     {
         CanWhiteCastleKingSide = false;
     }
     else
     {
         CanBlackCastleKingSide = false;
     }
 }
Beispiel #9
0
 /// <summary>
 ///		Comprueba si se puede hacer un enroque corto
 /// </summary>
 internal bool CanMoveCastleKingSide(PieceBaseModel.PieceColor color)
 {
     if (color == PieceBaseModel.PieceColor.White)
     {
         return(CanWhiteCastleKingSide);
     }
     else
     {
         return(CanBlackCastleKingSide);
     }
 }
Beispiel #10
0
        /// <summary>
        ///		Deshace el movimiento de enroque largo
        /// </summary>
        private void UndoCastleQueenSide(PieceBaseModel.PieceColor color)
        {
            int row = GetRowKing(color);

            // Mueve el rey
            MoveWithoutCheck(row, 2, row, 4, false);
            // Mueve la torre
            MoveWithoutCheck(row, 3, row, 0, false);
            // Habilita los enroques (los dos)
            Parameters.EnableCastle(color);
            //TODO --> Debería indicar que no se ha movido la torre ni el rey
        }
Beispiel #11
0
 /// <summary>
 ///		Habilita los enroques
 /// </summary>
 internal void EnableCastle(PieceBaseModel.PieceColor color)
 {
     if (color == PieceBaseModel.PieceColor.White)
     {
         CanWhiteCastleKingSide  = true;
         CanWhiteCastleQueenSide = true;
     }
     else
     {
         CanBlackCastleKingSide  = true;
         CanBlackCastleQueenSide = true;
     }
 }
 /// <summary>
 ///		Busca una pieza
 /// </summary>
 private Figure SearchPiece(PieceBaseModel.PieceType type, PieceBaseModel.PieceColor color, CellModel cell)
 {
     // Busca la pieza
     foreach (Figure figure in Cells)
     {
         if (figure.Type == type && figure.Color == color && figure.Row == cell.Row && figure.Column == cell.Column)
         {
             return(figure);
         }
     }
     // Devuelve una pieza vacía
     return(new Figure(-1, -1, color, null, null, null));
 }
Beispiel #13
0
 /// <summary>
 ///		Obtiene la pieza de un color que está en una fila / columna
 /// </summary>
 private PieceBaseModel GetPiece(PieceBaseModel.PieceType type, PieceBaseModel.PieceColor color, CellModel cell)
 {
     // Busca la pieza
     foreach (PieceBaseModel piece in Pieces)
     {
         if (piece.Type == type && piece.Color == color && piece.Cell.Row == cell.Row && piece.Cell.Column == cell.Column)
         {
             return(piece);
         }
     }
     // Si ha llegado hasta aquí es porque no ha encontrado nada
     return(null);
 }
        /// <summary>
        ///		Crea la configuración del tablero
        /// </summary>
        private Board.BoardSetup CreateBoardSetup(PieceBaseModel.PieceColor actualColor, PieceBaseModelCollection previousPieces)
        {
            Board.BoardSetup setup = new Board.BoardSetup();

            // Indica si es un movimiento de blancas
            //? Se salta el color (una variación es sobre el mismo movimiento, por tanto hay que volver al color anterior)
            //? ... es decir, si acaban de mover las negras, el primer movimiento de la variación también es de negras
            setup.IsWhiteMove = actualColor != PieceBaseModel.PieceColor.White;
            // Copia las piezas
            setup.Pieces.AddRange(previousPieces);
            // Devuelve la configuración
            return(setup);
        }
Beispiel #15
0
 /// <summary>
 ///		Busca una pieza
 /// </summary>
 private Image SearchPiece(PieceBaseModel.PieceType type, PieceBaseModel.PieceColor color, int row, int column)
 {
     // Busca la pieza
     foreach (FrameworkElement control in udtCanvas.Children)
     {
         if (control is Image image && image.Tag != null && image.Tag is FigureViewModel figure &&
             figure.Type == type && figure.Color == color && figure.Row == row && figure.Column == column)
         {
             return(image);
         }
     }
     // Devuelve una pieza vacía
     return(null);
 }
Beispiel #16
0
        /// <summary>
        ///		Comprueba si se puede realizar un enroque (las piezas no se han movido y no hay nada entre medias)
        /// </summary>
        private bool CanMoveCastle(PieceBaseModel.PieceColor color, int column)
        {
            bool           canMove = false;
            int            row     = GetRowKing(color);
            PieceBaseModel king    = this[row, 4];
            PieceBaseModel rook    = this[row, column];

            //TODO --> Debería comprobar además si las celdas intermedias no está en jaque
            // Comprueba el movimiento
            if (king != null && rook != null && !king.IsMoved && !rook.IsMoved)
            {
                canMove = IsPathEmpty(row, 4, row, column);
            }
            // Devuelve el valor que indica si se puede mover
            return(canMove);
        }
Beispiel #17
0
        /// <summary>
        ///		Inicaliza las celdas
        /// </summary>
        private void InitCells()
        {
            PieceBaseModel.PieceColor color = PieceBaseModel.PieceColor.White;

            // Añade las celdas
            for (int row = 0; row < 8; row++)
            {
                // Rellena por columnas
                for (int column = 0; column < 8; column++)
                {
                    Scapes.Add(new CellViewModel(row, column, color));
                    color = GetNextColor(color);
                }
                // Cambia el color de inicio de la siguiente fila
                color = GetNextColor(color);
            }
        }
        /// <summary>
        ///		Crea una imagen y la añade al canvas
        /// </summary>
        private Image CreateImage(PieceBaseModel.PieceColor color, PieceBaseModel.PieceType?type, int row, int column)
        {
            Image view = new Image();

            // Carga la imagen
            view.Source  = LoadImage(GetImageFileName(color, type));
            view.Stretch = Stretch.Fill;
            // Asigna las propiedades de visualización
            Canvas.SetTop(view, GetImageTop(row));
            Canvas.SetLeft(view, GetImageLeft(column));
            view.Width  = GetImageWidth();
            view.Height = GetImageHeight();
            // Añade el elemento al canvas
            udtCanvas.Children.Add(view);
            // Devuelve el control
            return(view);
        }
        /// <summary>
        ///		Añade un movimiento a la lista
        /// </summary>
        private MovementFigureModel ParseMovement(GameBoardModel board, PieceBaseModel.PieceColor actualColor, Move move)
        {
            MovementFigureModel newMovement   = new MovementFigureModel();
            CellConversor       cellConversor = new CellConversor();

            // Asigna los datos
            newMovement.Color         = actualColor;
            newMovement.Type          = ConvertMovement(move.Type);
            newMovement.Text          = move.ToString();
            newMovement.IsCheck       = move.IsCheck ?? false;
            newMovement.IsDoubleCheck = move.IsDoubleCheck ?? false;
            newMovement.IsCheckMate   = move.IsCheckMate ?? false;
            switch (newMovement.Type)
            {
            case MovementFigureModel.MovementType.CastleKingSide:
            case MovementFigureModel.MovementType.CastleQueenSide:
                // Asigna la pieza de origen
                newMovement.OriginPiece = PieceBaseModel.PieceType.Rook;
                // Crea las acciones de enroque
                newMovement.Actions.CreateCastleKingActions(board, newMovement);
                break;

            default:
                PieceBaseModel.PieceType?targetPiece = null;

                // Asigna los datos
                newMovement.OriginPiece = ConvertPiece(move.Piece);
                targetPiece             = ConvertPiece(move.TargetPiece);
                // Añade la pieza promocionada
                if (move.PromotedPiece != null)
                {
                    newMovement.PromotedPiece = ConvertPiece(move.PromotedPiece);
                }
                // Crea las acciones
                newMovement.Actions.CreateActions(board, newMovement,
                                                  cellConversor.ConvertCell(move.TargetSquare.Rank, move.TargetSquare.File),
                                                  cellConversor.ConvertCell(move.OriginRank, move.OriginFile),
                                                  targetPiece);
                break;
            }
            newMovement.Annotation = ConvertAnnotation(move.Annotation);
            // Ejecuta los movimientos sobre el tablero
            board.Execute(newMovement);
            // Devuelve el movimiento
            return(newMovement);
        }
        /// <summary>
        ///		Obtiene el nombre de archivo de imagen a cargar
        /// </summary>
        private string GetImageFileName(PieceBaseModel.PieceColor color, PieceBaseModel.PieceType?type)
        {
            string pathBoard  = ViewModel.ComboPathBoard.SelectedPathImages;
            string pathPieces = ViewModel.ComboPathPieces.SelectedPathImages;

            if (type == null)
            {
                switch (color)
                {
                case PieceBaseModel.PieceColor.Black:
                    return(System.IO.Path.Combine(pathBoard, "BoardDark.gif"));

                case PieceBaseModel.PieceColor.White:
                    return(System.IO.Path.Combine(pathBoard, "BoardLight.gif"));
                }
            }
            else
            {
                string pieceColor = color == PieceBaseModel.PieceColor.White ? "White" : "Black";

                switch (type)
                {
                case PieceBaseModel.PieceType.Pawn:
                    return(System.IO.Path.Combine(pathPieces, $"Pawn{pieceColor}.gif"));

                case PieceBaseModel.PieceType.Rook:
                    return(System.IO.Path.Combine(pathPieces, $"Rook{pieceColor}.gif"));

                case PieceBaseModel.PieceType.Knight:
                    return(System.IO.Path.Combine(pathPieces, $"Knight{pieceColor}.gif"));

                case PieceBaseModel.PieceType.Bishop:
                    return(System.IO.Path.Combine(pathPieces, $"Bishop{pieceColor}.gif"));

                case PieceBaseModel.PieceType.King:
                    return(System.IO.Path.Combine(pathPieces, $"King{pieceColor}.gif"));

                case PieceBaseModel.PieceType.Queen:
                    return(System.IO.Path.Combine(pathPieces, $"Queen{pieceColor}.gif"));
                }
            }
            return("");
        }
Beispiel #21
0
        /// <summary>
        ///		Enroque largo
        /// </summary>
        public bool MoveCastleQueenSide(PieceBaseModel.PieceColor color)
        {
            bool canMove = CanMoveCastleQueenSide(color);

            // Realiza el enroque
            if (canMove)
            {
                int row = GetRowKing(color);

                // Mueve el rey
                MoveWithoutCheck(row, 4, row, 2, false);
                // Mueve la torre
                MoveWithoutCheck(row, 0, row, 3, true);
                // Deshabilita los enroques (los dos)
                Parameters.DisableCastle(color);
            }
            // Devuelve el valor que indica si se ha movido
            return(canMove);
        }
        /// <summary>
        ///		Inicializa el tablero
        /// </summary>
        private void Reset()
        {
            if (ViewModel.SelectedGame != null)
            {
                PieceBaseModel.PieceColor color = PieceBaseModel.PieceColor.White;

                // Limpia el canvas
                Cells.Clear();
                udtCanvas.Children.Clear();
                // Añade las celdas
                for (int row = 0; row < 8; row++)
                {
                    // Rellena por columnas
                    for (int column = 0; column < 8; column++)
                    {
                        Cells.Add(CreateFigure(row, column, color, null));
                        color = GetNextColor(color);
                    }
                    // Cambia el color de inicio de la siguiente fila
                    color = GetNextColor(color);
                }
                // Añade las etiquetas
                for (int row = 0; row < 8; row++)
                {
                    Cells.Add(CreateLabel(row, -1, (char)('0' + 8 - row)));
                }
                for (int column = 0; column < 8; column++)
                {
                    Cells.Add(CreateLabel(-1, column, (char)('A' + column)));
                }
                // Añade las piezas
                foreach (PieceBaseModel piece in ViewModel.MovementsList.GameBoard.Pieces)
                {
                    Cells.Add(CreateFigure(piece.Cell.Row, piece.Cell.Column, piece.Color, piece.Type));
                }
                // Muestra las imágenes
                ShowImages();
            }
        }
Beispiel #23
0
 /// <summary>
 ///		Crea un promoción
 /// </summary>
 private ActionPromoteModel CreatePromoteAction(PieceBaseModel.PieceType type, PieceBaseModel.PieceColor color, CellModel target)
 {
     return(new ActionPromoteModel(type, color, target.Row, target.Column));
 }
Beispiel #24
0
 /// <summary>
 ///		Crea una captura
 /// </summary>
 private ActionCaptureModel CreateCaptureAction(PieceBaseModel.PieceType pieceCaptured, PieceBaseModel.PieceColor colorCaptured, CellModel target)
 {
     return(new ActionCaptureModel(pieceCaptured, colorCaptured, target.Row, target.Column));
 }
Beispiel #25
0
 /// <summary>
 ///		Crea un movimiento
 /// </summary>
 private ActionMoveModel CreateMoveAction(PieceBaseModel.PieceType type, PieceBaseModel.PieceColor color, CellModel from, CellModel to)
 {
     return(new ActionMoveModel(type, color, from.Row, from.Column, to.Row, to.Column));
 }
        /// <summary>
        ///		Crea una captura
        /// </summary>
        private void CreateCaptureAction(GameBoardModel board, PieceBaseModel.PieceType?piece, PieceBaseModel.PieceColor color, CellModel from)
        {
            PieceBaseModel targetPiece = board.Pieces.GetPiece(from);

            //? En ocasiones la pieza leída no es la real del tablero, por eso buscamos la pieza adecuada
            // Añade la pieza
            Add(new ActionCaptureModel(targetPiece?.Type ?? piece ?? PieceBaseModel.PieceType.Unknown, color, from));
        }
 /// <summary>
 ///		Crea un movimiento
 /// </summary>
 private void CreateMoveAction(PieceBaseModel.PieceType type, PieceBaseModel.PieceColor color, CellModel from, CellModel to)
 {
     Add(new ActionMoveModel(type, color, from, to));
 }
 /// <summary>
 ///		Obtiene el siguiente color
 /// </summary>
 private PieceBaseModel.PieceColor GetNextColor(PieceBaseModel.PieceColor color)
 {
     return(color == PieceBaseModel.PieceColor.White ? PieceBaseModel.PieceColor.Black : PieceBaseModel.PieceColor.White);
 }
Beispiel #29
0
 /// <summary>
 ///		Obtiene la fila de rey de un color
 /// </summary>
 private int GetRowKing(PieceBaseModel.PieceColor color)
 {
     return(color == PieceBaseModel.PieceColor.White ? 7 : 0);
 }
Beispiel #30
0
 /// <summary>
 ///		Comprueba si se puede hacer un enroque largo
 /// </summary>
 public bool CanMoveCastleQueenSide(PieceBaseModel.PieceColor color)
 {
     return(color == Parameters.GetTurnColor() && Parameters.CanMoveCastleQueenSide(color) && CanMoveCastle(color, 0));
 }