/// <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> /// 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; } }
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; }
/// <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> /// 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)); }
/// <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); }
/// <summary> /// Extrae la pieza de la cadena /// </summary> private PieceBaseModel.PieceType ExtractPiece(ref string content) { PieceBaseModel.PieceType piece = PieceBaseModel.PieceType.Pawn; bool extract = false; // Obtiene la pieza switch (content[0]) { case 'P': piece = PieceBaseModel.PieceType.Pawn; extract = true; break; case 'N': piece = PieceBaseModel.PieceType.Knight; extract = true; break; case 'B': piece = PieceBaseModel.PieceType.Bishop; extract = true; break; case 'R': piece = PieceBaseModel.PieceType.Rook; extract = true; break; case 'Q': piece = PieceBaseModel.PieceType.Queen; extract = true; break; case 'K': piece = PieceBaseModel.PieceType.King; extract = true; break; } // Extrae el contenido de la cadena if (extract) { content = content.Substring(1); } // Devuelve la pieza return(piece); }
/// <summary> /// Promociona una pieza /// </summary> public bool Promote(int row, int column, PieceBaseModel.PieceType type) { bool canPromote = false; PieceBaseModel piece = this[row, column]; if (piece != null && piece.Type == PieceBaseModel.PieceType.Pawn && piece.Color == Parameters.GetTurnColor() && type != PieceBaseModel.PieceType.Pawn && type != PieceBaseModel.PieceType.King && ((piece.Color == PieceBaseModel.PieceColor.White && row == 0) || (piece.Color == PieceBaseModel.PieceColor.Black && row == 7))) { // Promociona la pieza this[row, column] = CreatePiece(type, piece.Color); // Indica que se ha promocionado canPromote = true; } // Devuelve el valor que indica si ha podido promocionar return(canPromote); }
/// <summary> /// Busca la pieza de un color que se puede mover a una celda /// </summary> public (int row, int column, PieceBaseModel piece) SearchMoveTo(PieceBaseModel.PieceType type, PieceBaseModel.PieceColor color, int fromRow, int fromColumn, int toRow, int toColumn) { List <(int row, int column, PieceBaseModel piece)> pieces = new List <(int row, int column, PieceBaseModel piece)>(); // Busca las piezas for (int row = 0; row < 8; row++) { for (int column = 0; column < 8; column++) { PieceBaseModel piece = this[row, column]; if (piece != null && piece.Type == type && piece.Color == color && piece.CanMoveTo(this, row, column, toRow, toColumn)) { pieces.Add((row, column, piece)); } } } // Si se le ha pasado una fila / columna para ajustarlo, obtiene la pieza que estaba inicialmente en esa posición if (pieces.Count > 1 && (fromRow != -1 || fromColumn != -1)) { foreach ((int row, int column, PieceBaseModel piece)piece in pieces) { if ((fromColumn == -1 && piece.row == fromRow) || (fromRow == -1 && piece.column == fromColumn) || (piece.row == fromRow && piece.column == fromColumn)) { return(piece); } } } // Devuelve la primera pieza localizada if (pieces.Count > 0) { return(pieces[0]); } else { return(-1, -1, null); } }
/// <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)); }
public ActionCaptureModel(PieceBaseModel.PieceType type, PieceBaseModel.PieceColor color, int targetRow, int targetColumn) : base(type, color) { TargetRow = targetRow; TargetColumn = targetColumn; }
/// <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)); }
protected ActionBaseModel(PieceBaseModel.PieceType type, PieceBaseModel.PieceColor color) { Type = type; Color = color; }
public ActionPromoteModel(PieceBaseModel.PieceType type, PieceBaseModel.PieceColor color, int toRow, int toColumn) : base(type, color) { ToRow = toRow; ToColumn = toColumn; }
/// <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)); }
public FigureViewModel(int row, int column, PieceBaseModel.PieceType type, PieceBaseModel.PieceColor color) : base(row, column, color) { Type = type; }
/// <summary> /// Añade una pieza /// </summary> public void Add(PieceBaseModel.PieceType piece, PieceBaseModel.PieceColor color, int row, int column) { Add(piece, color, new CellModel(row, column)); }
/// <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)); }
/// <summary> /// Asigna una pieza a una posición /// </summary> private void Create(PieceBaseModel.PieceType type, PieceBaseModel.PieceColor color, int row, int column) { this[row, column] = CreatePiece(type, color); }