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(); } } }
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(); } }
private void ValidarMovimientosAlfil(Casillero origen, Casillero destino) { ValidarMovimientosDiagonales(origen, destino); if (destino.ocupado) { if (destino.pieza.equipo == origen.pieza.equipo) { throw new Exception(); } } }
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; } }
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(); }
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(); } } }
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(); } } }
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(); } } } }
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(); } } } }
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); }