Пример #1
0
        private IEnumerable <Casilla> PeonCaptureCheck(Casilla casilla)
        {
            var returnList = new List <Casilla>();

            if (casilla.PiezaContenida.Color == ColorFicha.Blanco)
            {
                var enemigoUR = GetCasilla(casilla.Fila + 1, casilla.Columna + 1);
                var enemigoUL = GetCasilla(casilla.Fila + 1, casilla.Columna - 1);
                if (IsCapturable(casilla, enemigoUL))
                {
                    returnList.Add(enemigoUL);
                }
                if (IsCapturable(casilla, enemigoUR))
                {
                    returnList.Add(enemigoUR);
                }
            }
            else
            {
                var enemigoDR = GetCasilla(casilla.Fila - 1, casilla.Columna + 1);
                var enemigoDL = GetCasilla(casilla.Fila - 1, casilla.Columna - 1);
                if (IsCapturable(casilla, enemigoDL))
                {
                    returnList.Add(enemigoDL);
                }
                if (IsCapturable(casilla, enemigoDR))
                {
                    returnList.Add(enemigoDR);
                }
            }
            return(returnList);
        }
Пример #2
0
 private IEnumerable<Casilla> GetRangeForDirection(Casilla origen, Casilla siguiente, Direccion direccion, IEnumerable<Casilla> casillas, int maximumRange = 9)
 {
     var output = new List<Casilla>();
     if (maximumRange == 0) return output;
     siguiente = NextCasilla(origen, siguiente, direccion,casillas);
     return output;
 }
Пример #3
0
        private IEnumerable <Casilla> RangeCheck(Casilla casillaOrigen, Casilla nextCasilla, Direccion direccion, int maximumRange = 9)
        {
            var returnList = new List <Casilla>();

            if (maximumRange == 0)
            {
                return(returnList);
            }
            nextCasilla = NextCasilla(casillaOrigen, nextCasilla, direccion);
            if (nextCasilla == null)
            {
                return(returnList);
            }
            if (casillaOrigen.PiezaContenida.Tipo == (int)TipoPieza.Peon && nextCasilla.PiezaContenida != null)
            {
                return(returnList);
            }
            returnList.Add(nextCasilla);
            maximumRange--;
            if (nextCasilla.PiezaContenida == null)
            {
                returnList.AddRange(RangeCheck(casillaOrigen, nextCasilla, direccion, maximumRange));
            }
            return(returnList);
        }
Пример #4
0
        public Output MovePiece(Casilla casillaOrigen, Casilla casillaDestino, bool test = false)
        {
            var piezaOrigen = casillaOrigen.PiezaContenida;

            var piezaDesino = casillaDestino.PiezaContenida;

            if (piezaOrigen.Color != (ColorFicha)CurrentTurn)
            {
                return(Output.NotYourTurn);
            }

            if (CheckCheck(piezaOrigen.Color))
            {
                casillaOrigen.PiezaContenida  = piezaOrigen;
                casillaDestino.PiezaContenida = piezaDesino;
                return(Output.SelfCheck);
            }
            if (test)
            {
                return(Output.Success);
            }
            ;

            casillaDestino.PiezaContenida = casillaOrigen.PiezaContenida;
            casillaOrigen.PiezaContenida  = null;
            NextTurn();
            var output = CheckCheckMate(ColorContrario(piezaOrigen));

            return(output != Output.Success
                    ? output
                    : (CheckCheck(ColorContrario(piezaOrigen)) ? Output.Check : Output.Success));
        }
Пример #5
0
        private IEnumerable <Casilla> PeonRangeCheck(Casilla casilla)
        {
            Direccion direccion;
            int       range;
            var       returnValue = new List <Casilla>();

            switch (casilla.PiezaContenida.Color)
            {
            case ColorFicha.Blanco:
                range     = casilla.Fila == 2 ? 2 : 1;
                direccion = Direccion.Up;
                break;

            case ColorFicha.Negro:
                range     = casilla.Fila == 7 ? 2 : 1;
                direccion = Direccion.Down;
                break;

            default:
                throw new ArgumentOutOfRangeException();
            }
            returnValue.AddRange(RangeCheck(casilla, casilla, direccion, range));
            returnValue.AddRange(PeonCaptureCheck(casilla));
            return(returnValue);
        }
Пример #6
0
 public override List<Casilla> GetMovementRange(Casilla contenedor,List<Casilla> casillas)
 {
     var output = new List<Casilla>();
     output.AddRange(GetRangeForDirection(contenedor,contenedor,Direccion.Up,casillas));
     output.AddRange(GetRangeForDirection(contenedor,contenedor,Direccion.Down,casillas));
     output.AddRange(GetRangeForDirection(contenedor,contenedor,Direccion.Left,casillas));
     output.AddRange(GetRangeForDirection(contenedor,contenedor,Direccion.Right,casillas));
     return output;
 }
Пример #7
0
        public override List <Casilla> GetMovementRange(Casilla contenedor, List <Casilla> casillas)
        {
            var output = new List <Casilla>();

            output.AddRange(GetRangeForDirection(contenedor, contenedor, Direccion.Up, casillas));
            output.AddRange(GetRangeForDirection(contenedor, contenedor, Direccion.Down, casillas));
            output.AddRange(GetRangeForDirection(contenedor, contenedor, Direccion.Left, casillas));
            output.AddRange(GetRangeForDirection(contenedor, contenedor, Direccion.Right, casillas));
            return(output);
        }
Пример #8
0
        private List <Casilla> MovimientoPieza(Casilla casilla)
        {
            return(casilla.PiezaContenida.GetMovementRange(casilla, _casillas));

            var output = new List <Casilla>();

            switch ((TipoPieza)casilla.PiezaContenida.Tipo)
            {
            case TipoPieza.Peon:
                output.AddRange(PeonRangeCheck(casilla));
                break;

            case TipoPieza.Torre:
                output.AddRange(RangeCheck(casilla, casilla, Direccion.Up));
                output.AddRange(RangeCheck(casilla, casilla, Direccion.Down));
                output.AddRange(RangeCheck(casilla, casilla, Direccion.Left));
                output.AddRange(RangeCheck(casilla, casilla, Direccion.Right));
                break;

            case TipoPieza.Caballero:
                output.AddRange(CaballeroRangeCheck(casilla));
                break;

            case TipoPieza.Alfil:
                output.AddRange(RangeCheck(casilla, casilla, Direccion.LeftUp));
                output.AddRange(RangeCheck(casilla, casilla, Direccion.LeftDown));
                output.AddRange(RangeCheck(casilla, casilla, Direccion.RightDown));
                output.AddRange(RangeCheck(casilla, casilla, Direccion.RightUp));
                break;

            case TipoPieza.Reina:
                output.AddRange(RangeCheck(casilla, casilla, Direccion.Up));
                output.AddRange(RangeCheck(casilla, casilla, Direccion.RightUp));
                output.AddRange(RangeCheck(casilla, casilla, Direccion.Right));
                output.AddRange(RangeCheck(casilla, casilla, Direccion.RightDown));
                output.AddRange(RangeCheck(casilla, casilla, Direccion.Down));
                output.AddRange(RangeCheck(casilla, casilla, Direccion.LeftDown));
                output.AddRange(RangeCheck(casilla, casilla, Direccion.Left));
                output.AddRange(RangeCheck(casilla, casilla, Direccion.LeftUp));
                break;

            case TipoPieza.Rey:
                output.AddRange(RangeCheck(casilla, casilla, Direccion.Up, 1));
                output.AddRange(RangeCheck(casilla, casilla, Direccion.RightUp, 1));
                output.AddRange(RangeCheck(casilla, casilla, Direccion.Right, 1));
                output.AddRange(RangeCheck(casilla, casilla, Direccion.RightDown, 1));
                output.AddRange(RangeCheck(casilla, casilla, Direccion.Down, 1));
                output.AddRange(RangeCheck(casilla, casilla, Direccion.LeftDown, 1));
                output.AddRange(RangeCheck(casilla, casilla, Direccion.Left, 1));
                output.AddRange(RangeCheck(casilla, casilla, Direccion.LeftUp, 1));
                //returnList.RemoveAll(casilla1 => CasillasEnPeligro(casilla,true).Contains(casilla1));
                break;
            }
            return(output);
        }
Пример #9
0
 protected Casilla NextCasilla(Casilla origen, Casilla siguiente, Direccion direccion, IEnumerable<Casilla> casillas)
 {
     var filaOffset = FilaOffset(direccion);
     var columnaOffset = ColumnaOffset(direccion);
     return casillas.FirstOrDefault(casilla1 => casilla1.Fila == siguiente.Fila + filaOffset
                                     && casilla1.Columna == siguiente.Columna + columnaOffset
                                     && (casilla1.PiezaContenida == null
                                         || (casilla1.PiezaContenida.Color != origen.PiezaContenida.Color
                                         && (TipoPieza)origen.PiezaContenida.Tipo != TipoPieza.Peon))
                                    );
 }
Пример #10
0
        private IEnumerable <Casilla> GetRangeForDirection(Casilla origen, Casilla siguiente, Direccion direccion, IEnumerable <Casilla> casillas, int maximumRange = 9)
        {
            var output = new List <Casilla>();

            if (maximumRange == 0)
            {
                return(output);
            }
            siguiente = NextCasilla(origen, siguiente, direccion, casillas);
            return(output);
        }
Пример #11
0
        protected Casilla NextCasilla(Casilla origen, Casilla siguiente, Direccion direccion, IEnumerable <Casilla> casillas)
        {
            var filaOffset    = FilaOffset(direccion);
            var columnaOffset = ColumnaOffset(direccion);

            return(casillas.FirstOrDefault(casilla1 => casilla1.Fila == siguiente.Fila + filaOffset &&
                                           casilla1.Columna == siguiente.Columna + columnaOffset &&
                                           (casilla1.PiezaContenida == null ||
                                            (casilla1.PiezaContenida.Color != origen.PiezaContenida.Color &&
                                             (TipoPieza)origen.PiezaContenida.Tipo != TipoPieza.Peon))
                                           ));
        }
Пример #12
0
        private Casilla NextCasilla(Casilla casillaOrigen, Casilla nextCasilla, Direccion direccion)
        {
            var filaOffset    = FilaOffset(direccion);
            var columnaOffset = ColumnaOffset(direccion);

            return(_casillas.FirstOrDefault(casilla1 => casilla1.Fila == nextCasilla.Fila + filaOffset &&
                                            casilla1.Columna == nextCasilla.Columna + columnaOffset &&
                                            (casilla1.PiezaContenida == null ||
                                             (casilla1.PiezaContenida.Color != casillaOrigen.PiezaContenida.Color &&
                                              (TipoPieza)casillaOrigen.PiezaContenida.Tipo != TipoPieza.Peon)
                                            )));
        }
Пример #13
0
        private List <Casilla> CasillasEnPeligro(Casilla casillaKing)
        {
            var colorContrario = ColorContrario(casillaKing.PiezaContenida);
            var enemyPieces    = _casillas.FindAll(casilla => casilla.PiezaContenida != null &&
                                                   casilla.PiezaContenida.Color == colorContrario);
            var casillasEnPeligro = new List <Casilla>();

            foreach (var enemyPiece in enemyPieces)
            {
                casillasEnPeligro.AddRange(MovementPosibilitiesList(enemyPiece));
            }
            return(casillasEnPeligro);
        }
Пример #14
0
        private IEnumerable <Casilla> CaballeroRangeCheck(Casilla casilla)
        {
            var returnList = new List <Casilla>();

            for (var i = 2; i >= -2; i--)
            {
                if (i == 0)
                {
                    continue;
                }
                var j = (i == 2 || i == -2) ? 1 : 2;
                returnList.AddRange(_casillas.Where(casilla1 => casilla1.Fila == casilla.Fila + i &&
                                                    casilla1.Columna == casilla.Columna + j &&
                                                    (casilla1.PiezaContenida == null || casilla1.PiezaContenida.Color != casilla.PiezaContenida.Color)));
                returnList.AddRange(_casillas.Where(casilla1 => casilla1.Fila == casilla.Fila + i &&
                                                    casilla1.Columna == casilla.Columna - j &&
                                                    (casilla1.PiezaContenida == null || casilla1.PiezaContenida.Color != casilla.PiezaContenida.Color)));
            }
            return(returnList);
        }
Пример #15
0
 private static bool IsCapturable(Casilla casilla, Casilla attackedCasilla)
 {
     return attackedCasilla != null && attackedCasilla.PiezaContenida != null && attackedCasilla.PiezaContenida.Color != casilla.PiezaContenida.Color;
 }
Пример #16
0
 private IEnumerable<Casilla> PeonCaptureCheck(Casilla casilla)
 {
     var returnList = new List<Casilla>();
     if (casilla.PiezaContenida.Color == ColorFicha.Blanco)
     {
         var enemigoUR = GetCasilla(casilla.Fila + 1, casilla.Columna + 1);
         var enemigoUL = GetCasilla(casilla.Fila + 1, casilla.Columna - 1);
         if (IsCapturable(casilla, enemigoUL)) returnList.Add(enemigoUL);
         if (IsCapturable(casilla, enemigoUR)) returnList.Add(enemigoUR);
     }
     else
     {
         var enemigoDR = GetCasilla(casilla.Fila - 1, casilla.Columna + 1);
         var enemigoDL = GetCasilla(casilla.Fila - 1, casilla.Columna - 1);
         if (IsCapturable(casilla, enemigoDL)) returnList.Add(enemigoDL);
         if (IsCapturable(casilla, enemigoDR)) returnList.Add(enemigoDR);
     }
     return returnList;
 }
Пример #17
0
 private IEnumerable<Casilla> PeonRangeCheck(Casilla casilla)
 {
     Direccion direccion;
     int range;
     var returnValue = new List<Casilla>();
     switch (casilla.PiezaContenida.Color)
     {
         case ColorFicha.Blanco:
             range = casilla.Fila == 2 ? 2 : 1;
             direccion = Direccion.Up;
             break;
         case ColorFicha.Negro:
             range = casilla.Fila == 7 ? 2 : 1;
             direccion = Direccion.Down;
             break;
         default:
             throw new ArgumentOutOfRangeException();
     }
     returnValue.AddRange(RangeCheck(casilla,casilla,direccion,range));
     returnValue.AddRange(PeonCaptureCheck(casilla));
     return returnValue;
 }
Пример #18
0
 private List<Casilla> CasillasEnPeligro(Casilla casillaKing)
 {
     var colorContrario = ColorContrario(casillaKing.PiezaContenida);
     var enemyPieces = _casillas.FindAll(casilla => casilla.PiezaContenida != null 
             && casilla.PiezaContenida.Color == colorContrario);
     var casillasEnPeligro = new List<Casilla>();
     foreach (var enemyPiece in enemyPieces)
     {
         casillasEnPeligro.AddRange(MovementPosibilitiesList(enemyPiece));
     }
     return casillasEnPeligro;
 }
Пример #19
0
            public Output MovePiece(Casilla casillaOrigen,Casilla casillaDestino,bool test = false)
            {
                var piezaOrigen = casillaOrigen.PiezaContenida;
                
                var piezaDesino = casillaDestino.PiezaContenida;
                
                if (piezaOrigen.Color != (ColorFicha) CurrentTurn) return Output.NotYourTurn;
                    
                if (CheckCheck(piezaOrigen.Color))
                {
                    casillaOrigen.PiezaContenida = piezaOrigen;
                    casillaDestino.PiezaContenida = piezaDesino;
                    return Output.SelfCheck;
                }
                if(test) return Output.Success;;

                casillaDestino.PiezaContenida = casillaOrigen.PiezaContenida;
                casillaOrigen.PiezaContenida = null;
                NextTurn();
                var output = CheckCheckMate(ColorContrario(piezaOrigen));
                return output != Output.Success
                    ? output
                    : (CheckCheck(ColorContrario(piezaOrigen)) ? Output.Check : Output.Success);
            }
Пример #20
0
 private IEnumerable<Casilla> CaballeroRangeCheck(Casilla casilla)
 {
     var returnList = new List<Casilla>();
     for (var i = 2; i >= -2; i--)
     {
         if(i==0) continue;
         var j = (i == 2|| i ==-2) ? 1 : 2;
         returnList.AddRange(_casillas.Where(casilla1 => casilla1.Fila == casilla.Fila + i
             && casilla1.Columna == casilla.Columna + j
             && (casilla1.PiezaContenida == null || casilla1.PiezaContenida.Color != casilla.PiezaContenida.Color)));
         returnList.AddRange(_casillas.Where(casilla1 => casilla1.Fila == casilla.Fila + i
             && casilla1.Columna == casilla.Columna - j
             && (casilla1.PiezaContenida == null || casilla1.PiezaContenida.Color != casilla.PiezaContenida.Color)));
     }
     return returnList;
 }
Пример #21
0
 private List<Casilla> MovimientoPieza(Casilla casilla)
 {
     return casilla.PiezaContenida.GetMovementRange(casilla, _casillas);
     var output = new List<Casilla>();
     switch ((TipoPieza)casilla.PiezaContenida.Tipo)
     {
         case TipoPieza.Peon:
             output.AddRange(PeonRangeCheck(casilla));
             break;
         case TipoPieza.Torre:
             output.AddRange(RangeCheck(casilla,casilla,Direccion.Up));
             output.AddRange(RangeCheck(casilla,casilla,Direccion.Down));
             output.AddRange(RangeCheck(casilla,casilla,Direccion.Left));
             output.AddRange(RangeCheck(casilla,casilla,Direccion.Right));
             break;
         case TipoPieza.Caballero:
             output.AddRange(CaballeroRangeCheck(casilla));
             break;
         case TipoPieza.Alfil:
             output.AddRange(RangeCheck(casilla, casilla, Direccion.LeftUp));
             output.AddRange(RangeCheck(casilla, casilla, Direccion.LeftDown));
             output.AddRange(RangeCheck(casilla, casilla, Direccion.RightDown));
             output.AddRange(RangeCheck(casilla, casilla, Direccion.RightUp));
             break;
         case TipoPieza.Reina:
             output.AddRange(RangeCheck(casilla, casilla, Direccion.Up));
             output.AddRange(RangeCheck(casilla, casilla, Direccion.RightUp));
             output.AddRange(RangeCheck(casilla, casilla, Direccion.Right));
             output.AddRange(RangeCheck(casilla, casilla, Direccion.RightDown));
             output.AddRange(RangeCheck(casilla, casilla, Direccion.Down));
             output.AddRange(RangeCheck(casilla, casilla, Direccion.LeftDown));
             output.AddRange(RangeCheck(casilla, casilla, Direccion.Left));
             output.AddRange(RangeCheck(casilla, casilla, Direccion.LeftUp));
             break;
         case TipoPieza.Rey:
             output.AddRange(RangeCheck(casilla, casilla, Direccion.Up,1));
             output.AddRange(RangeCheck(casilla, casilla, Direccion.RightUp,1));
             output.AddRange(RangeCheck(casilla, casilla, Direccion.Right,1));
             output.AddRange(RangeCheck(casilla, casilla, Direccion.RightDown,1));
             output.AddRange(RangeCheck(casilla, casilla, Direccion.Down,1));
             output.AddRange(RangeCheck(casilla, casilla, Direccion.LeftDown,1));
             output.AddRange(RangeCheck(casilla, casilla, Direccion.Left,1));
             output.AddRange(RangeCheck(casilla, casilla, Direccion.LeftUp,1));
             //returnList.RemoveAll(casilla1 => CasillasEnPeligro(casilla,true).Contains(casilla1));
             break;
     }
     return output;
 }
Пример #22
0
 public IEnumerable<Casilla> MovementPosibilitiesList(Casilla casilla)
 {
     var piezaEnCasilla = casilla.PiezaContenida;
     return piezaEnCasilla == null ? null : MovimientoPieza(casilla);
 }
Пример #23
0
 public abstract List <Casilla> GetMovementRange(Casilla contenedor, List <Casilla> casillas);
Пример #24
0
 public override List<Casilla> GetMovementRange(Casilla contenedor, List<Casilla> casillas)
 {
     throw new System.NotImplementedException();
 }
Пример #25
0
 private static bool IsCapturable(Casilla casilla, Casilla attackedCasilla)
 {
     return(attackedCasilla != null && attackedCasilla.PiezaContenida != null && attackedCasilla.PiezaContenida.Color != casilla.PiezaContenida.Color);
 }
Пример #26
0
 public override List <Casilla> GetMovementRange(Casilla contenedor, List <Casilla> casillas)
 {
     throw new System.NotImplementedException();
 }
Пример #27
0
        public IEnumerable <Casilla> MovementPosibilitiesList(Casilla casilla)
        {
            var piezaEnCasilla = casilla.PiezaContenida;

            return(piezaEnCasilla == null ? null : MovimientoPieza(casilla));
        }
Пример #28
0
 private IEnumerable<Casilla> RangeCheck(Casilla casillaOrigen,Casilla nextCasilla, Direccion direccion,int maximumRange = 9)
 {
     var returnList = new List<Casilla>();
     if (maximumRange == 0) return returnList;
     nextCasilla = NextCasilla(casillaOrigen, nextCasilla,direccion);
     if (nextCasilla == null) return returnList;
     if (casillaOrigen.PiezaContenida.Tipo == (int) TipoPieza.Peon && nextCasilla.PiezaContenida != null)
         return returnList;
      returnList.Add(nextCasilla);
     maximumRange--;
     if(nextCasilla.PiezaContenida == null)
         returnList.AddRange(RangeCheck(casillaOrigen,nextCasilla,direccion,maximumRange));
     return returnList;
 }
Пример #29
0
            private Casilla NextCasilla(Casilla casillaOrigen, Casilla nextCasilla, Direccion direccion)
            {
                var filaOffset = FilaOffset(direccion);
                var columnaOffset = ColumnaOffset(direccion);

                return _casillas.FirstOrDefault(casilla1 => casilla1.Fila == nextCasilla.Fila + filaOffset 
                    && casilla1.Columna == nextCasilla.Columna + columnaOffset
                    && (casilla1.PiezaContenida == null 
                        || (casilla1.PiezaContenida.Color != casillaOrigen.PiezaContenida.Color
                        && (TipoPieza)casillaOrigen.PiezaContenida.Tipo != TipoPieza.Peon)
                        ));
            }
Пример #30
0
 public abstract List<Casilla> GetMovementRange(Casilla contenedor, List<Casilla> casillas);