示例#1
0
        private void ValidarMovimientosRey(Casillero origen, Casillero destino)
        {
            int difX = Math.Abs(origen.coordX - destino.coordX);
            int difY = Math.Abs(origen.coordY - destino.coordY);

            if (!(difX <= 1 && difY <= 1))
            {
                throw new Exception();
            }

            if (!(difX == 0 || difY == 0))
            {
                this.ValidarMovimientosDiagonales(origen, destino);
            }

            this.ValidarMovimientosLaterales(origen, destino);

            if (destino.ocupado)
            {
                if (destino.pieza.equipo == origen.pieza.equipo)
                {
                    throw new Exception();
                }
            }
        }
示例#2
0
        private void ValidarMovimientosPeon(Casillero origen, Casillero destino)
        {
            if (origen.pieza.equipo == Constantes.Equipos.BLANCO)
            {
                if (!(origen.coordY == (destino.coordY + 1)))
                {
                    throw new Exception();
                }
            }
            else if (!(origen.coordY == (destino.coordY - 1)))
            {
                throw new Exception();
            }

            if (!((origen.coordX + 1) == destino.coordX && origen.coordX != casillerosX[7] || (origen.coordX - 1) == destino.coordX && origen.coordX != casillerosX[0] || origen.coordX == destino.coordX))
            {
                throw new Exception();
            }

            if (origen.coordX != destino.coordX)
            {
                if (!(destino.ocupado && destino.pieza.equipo != origen.pieza.equipo))
                {
                    throw new Exception();
                }
            }
            else if (destino.ocupado)
            {
                throw new Exception();
            }
        }
示例#3
0
 private void ValidarMovimientosAlfil(Casillero origen, Casillero destino)
 {
     ValidarMovimientosDiagonales(origen, destino);
     if (destino.ocupado)
     {
         if (destino.pieza.equipo == origen.pieza.equipo)
         {
             throw new Exception();
         }
     }
 }
示例#4
0
        private void UbicarPiezas(int cant, string tipo, Random random, string color)
        {
            for (int i = 0; i < cant; i++)
            {
                bool ocupado;
                bool lugarValido;
                Tuple <char, int> coord;
                do
                {
                    lugarValido = true;
                    coord       = this.GenerarCoordenadas(random);
                    ocupado     = casilleros.Where(c => c.coordX == coord.Item1 && c.coordY == coord.Item2).Select(x => x.ocupado).First();

                    //Valido que haya un alfil de cada equipo en colores de casilleros diferentes
                    if (tipo == Constantes.TiposPieza.A && !ocupado)
                    {
                        string colorCasilleroAlfil;
                        try
                        {
                            Casillero casillero = casilleros.Where(c => c.ocupado && c.pieza.equipo == color && c.pieza.tipo == tipo).FirstOrDefault();
                            if (casillero != null)
                            {
                                colorCasilleroAlfil = casillero.colorCasillero;
                            }
                            else
                            {
                                colorCasilleroAlfil = String.Empty;
                            }
                        }
                        catch (Exception)
                        {
                            colorCasilleroAlfil = String.Empty;
                        }


                        if (!String.IsNullOrEmpty(colorCasilleroAlfil))
                        {
                            string colorCasilleroAColocar = casilleros.Where(c => c.coordX == coord.Item1 && c.coordY == coord.Item2).Select(x => x.colorCasillero).First();
                            lugarValido = (colorCasilleroAlfil == colorCasilleroAColocar) ? false : true;
                        }
                        else
                        {
                            lugarValido = true;
                        }
                    }
                } while (ocupado || !lugarValido);

                casilleros.Where(c => c.coordX == coord.Item1 && c.coordY == coord.Item2).First().pieza   = new Pieza(tipo, color);
                casilleros.Where(c => c.coordX == coord.Item1 && c.coordY == coord.Item2).First().ocupado = true;
            }
        }
示例#5
0
        private void Mover(Casillero origen, Casillero destino)
        {
            Pieza piezaMovida = casilleros.Where(c => c.coordX == origen.coordX && c.coordY == origen.coordY).Select(x => x.pieza).First();

            //Guardo la pieza en el nuevo casillero
            casilleros.Where(c => c.coordX == destino.coordX && c.coordY == destino.coordY).First().pieza   = piezaMovida;
            casilleros.Where(c => c.coordX == destino.coordX && c.coordY == destino.coordY).First().ocupado = true;
            //Y la saco del casilliero anterior
            casilleros.Where(c => c.coordX == origen.coordX && c.coordY == origen.coordY).First().pieza   = null;
            casilleros.Where(c => c.coordX == origen.coordX && c.coordY == origen.coordY).First().ocupado = false;

            Console.WriteLine("Buen movimiento");
            this.MostrarTablero();
        }
示例#6
0
        private void ValidarMovimientosCaballo(Casillero origen, Casillero destino)
        {
            if (!((((destino.coordY == (origen.coordY + 1) || destino.coordY == (origen.coordY - 1)) && (destino.coordX == (origen.coordX + 2) || destino.coordX == (origen.coordX - 2)))) ||
                  ((destino.coordY == (origen.coordY + 2) || destino.coordY == (origen.coordY - 2)) && (destino.coordX == (origen.coordX + 1) || destino.coordX == (origen.coordX - 1)))))
            {
                throw new Exception();
            }

            if (destino.ocupado)
            {
                if (destino.pieza.equipo == origen.pieza.equipo)
                {
                    throw new Exception();
                }
            }
        }
示例#7
0
        private void ValidarMovimientosTorre(Casillero origen, Casillero destino)
        {
            if (!((origen.coordX == destino.coordX && origen.coordY != destino.coordY) || (origen.coordX != destino.coordX && origen.coordY == destino.coordY)))
            {
                throw new Exception();
            }

            this.ValidarMovimientosLaterales(origen, destino);

            if (destino.ocupado)
            {
                if (destino.pieza.equipo == origen.pieza.equipo)
                {
                    throw new Exception();
                }
            }
        }
示例#8
0
        private void ValidarMovimientosDiagonales(Casillero origen, Casillero destino)
        {
            if (!(Math.Abs(origen.coordX - destino.coordX) == Math.Abs(origen.coordY - destino.coordY)))
            {
                throw new Exception();
            }

            int difX = origen.coordX - destino.coordX;
            int difY = origen.coordY - destino.coordY;

            for (int i = 1; i < Math.Abs(difX); i++)
            {
                if (difX < 0 && difY < 0)
                {
                    if (casilleros.Where(c => c.coordX == origen.coordX + i && c.coordY == origen.coordY + i && c.ocupado).Any())
                    {
                        throw new Exception();
                    }
                }

                if (difX < 0 && difY > 0)
                {
                    if (casilleros.Where(c => c.coordX == origen.coordX + i && c.coordY == origen.coordY - i && c.ocupado).Any())
                    {
                        throw new Exception();
                    }
                }

                if (difX > 0 && difY < 0)
                {
                    if (casilleros.Where(c => c.coordX == origen.coordX - i && c.coordY == origen.coordY + i && c.ocupado).Any())
                    {
                        throw new Exception();
                    }
                }

                if (difX > 0 && difY > 0)
                {
                    if (casilleros.Where(c => c.coordX == origen.coordX - i && c.coordY == origen.coordY - i && c.ocupado).Any())
                    {
                        throw new Exception();
                    }
                }
            }
        }
示例#9
0
        private void ValidarMovimientosLaterales(Casillero origen, Casillero destino)
        {
            int difX = origen.coordX - destino.coordX;
            int difY = origen.coordY - destino.coordY;

            int cant = difX > difY ? difX : difY;

            for (int i = 1; i < Math.Abs(cant); i++)
            {
                if (difX < 0 && difY == 0)
                {
                    if (casilleros.Where(c => c.coordX == origen.coordX + i && c.coordY == origen.coordY && c.ocupado).Any())
                    {
                        throw new Exception();
                    }
                }

                if (difX < 0 && difY == 0)
                {
                    if (casilleros.Where(c => c.coordX == origen.coordX + i && c.coordY == origen.coordY && c.ocupado).Any())
                    {
                        throw new Exception();
                    }
                }

                if (difX == 0 && difY < 0)
                {
                    if (casilleros.Where(c => c.coordX == origen.coordX && c.coordY == origen.coordY + i && c.ocupado).Any())
                    {
                        throw new Exception();
                    }
                }

                if (difX == 0 && difY > 0)
                {
                    if (casilleros.Where(c => c.coordX == origen.coordX && c.coordY == origen.coordY - i && c.ocupado).Any())
                    {
                        throw new Exception();
                    }
                }
            }
        }
示例#10
0
        private void SeleccionarDestino(Casillero origen)
        {
            bool coordsValidas;

            do
            {
                Console.Write("Seleccione las coordenadas de destino: ");
                string coord = Console.ReadLine().Trim();
                coordsValidas = true;
                try
                {
                    char coordX = coord[0];
                    int  coordY = int.Parse(coord[1].ToString());
                    if (coord.Length > 2 || coordY > 8 || coordY < 0 || !casillerosX.Contains(coordX))
                    {
                        throw new Exception("Las coordenadas no son validas");
                    }

                    Casillero destino = casilleros.Where(c => c.coordX == coordX && c.coordY == coordY).First();

                    switch (origen.pieza.tipo)
                    {
                    case Constantes.TiposPieza.P:
                        ValidarMovimientosPeon(origen, destino);
                        this.Mover(origen, destino);

                        break;

                    case Constantes.TiposPieza.T:
                        ValidarMovimientosTorre(origen, destino);
                        this.Mover(origen, destino);
                        break;

                    case Constantes.TiposPieza.C:
                        ValidarMovimientosCaballo(origen, destino);
                        this.Mover(origen, destino);
                        break;

                    case Constantes.TiposPieza.A:
                        ValidarMovimientosAlfil(origen, destino);
                        this.Mover(origen, destino);
                        break;

                    case Constantes.TiposPieza.K:
                        ValidarMovimientosRey(origen, destino);
                        this.Mover(origen, destino);
                        break;

                    case Constantes.TiposPieza.Q:
                        this.ValidarMovimientosReina(origen, destino);
                        this.Mover(origen, destino);
                        break;
                    }
                }
                catch (Exception e)
                {
                    Console.WriteLine("El movimiento no es valido");
                    coordsValidas = false;
                }
            } while (!coordsValidas);
        }