public override List <Celda> getCeldasDestino(Tablero tablero, Celda celdaActual) { Movimiento movimiento = new Movimiento(); movimiento.Horizontal = 0; movimiento.Vertical = -2; bool startPosition = false; if (tablero.getCelda(celdaActual, movimiento) == null) { startPosition = true; } movimiento.Horizontal = 0; movimiento.Vertical = 1; Celda celdaDestino = tablero.getCelda(celdaActual, movimiento); if (celdaDestino != null && celdaDestino.Pieza == null) { celdasDisponibles.Add(celdaDestino); if (startPosition) { movimiento.Horizontal = 0; movimiento.Vertical = 2; celdaDestino = tablero.getCelda(celdaActual, movimiento); if (celdaDestino != null && celdaDestino.Pieza == null) { celdasDisponibles.Add(celdaDestino); } } } movimiento.Horizontal = -1; movimiento.Vertical = 1; celdaDestino = tablero.getCelda(celdaActual, movimiento); if (celdaDestino != null && celdaDestino.Pieza != null && celdaDestino.Pieza.Color != color) { celdasDisponibles.Add(celdaDestino); } Celda celdaHayPeonContrario = null; //Peon al paso if ((this.PosicionInicial.Equals("ARRIBA") && celdaActual.Fila == 4) || (this.PosicionInicial.Equals("ABAJO") && celdaActual.Fila == 5)) { movimiento.Horizontal = -1; movimiento.Vertical = 0; celdaHayPeonContrario = tablero.getCelda(celdaActual, movimiento); } if (celdaHayPeonContrario != null && celdaHayPeonContrario.Pieza != null && celdaHayPeonContrario.Pieza is Peon && celdaHayPeonContrario.Pieza.Color != this.color) { celdasDisponibles.Add(celdaDestino); } movimiento.Horizontal = 1; movimiento.Vertical = 1; celdaDestino = tablero.getCelda(celdaActual, movimiento); if (celdaDestino != null && celdaDestino.Pieza != null && celdaDestino.Pieza.Color != color) { celdasDisponibles.Add(celdaDestino); } if ((this.PosicionInicial.Equals("ARRIBA") && celdaActual.Fila == 4) || (this.PosicionInicial.Equals("ABAJO") && celdaActual.Fila == 5)) { movimiento.Horizontal = 1; movimiento.Vertical = 0; celdaHayPeonContrario = tablero.getCelda(celdaActual, movimiento); } if (celdaHayPeonContrario != null && celdaHayPeonContrario.Pieza != null && celdaHayPeonContrario.Pieza is Peon && celdaHayPeonContrario.Pieza.Color != this.color) { celdasDisponibles.Add(celdaDestino); } return(celdasDisponibles); }
private List <Movimiento> VerificarMovimiento(Celda celdaActual, Movimiento mov, Movimiento movimientoRey, List <Movimiento> movimientos, Movimiento movAEliminar) { Celda c = this.getCelda(celdaActual, mov); Movimiento movimientoTorre = (from Movimiento mt in partida.Movimientos where mt.Pieza == c.Pieza select mt).FirstOrDefault(); if (movimientoRey != null || movimientoTorre != null) { movimientos.Remove(movAEliminar); } return(movimientos); }
public bool ModificarPosicionPieza(Celda actual, Celda destino, Jugador jug) { bool coronacion = false; Pieza pieza = actual.Pieza; actual.Pieza = null; Jugador jugadorRival = null; Pieza piezaComida = null; if (destino.Pieza != null) { if (jug.Equals(partida.Jugador1)) { piezaComida = (from Pieza p in partida.Jugador2.Piezas where p.Equals(destino.Pieza) select p).FirstOrDefault(); jugadorRival = partida.Jugador2; } else { piezaComida = (from Pieza p in partida.Jugador1.Piezas where p.Equals(destino.Pieza) select p).FirstOrDefault(); jugadorRival = partida.Jugador1; } piezaComida.Activa = false; piezaComida = (from Pieza p in piezas where p.Equals(piezaComida) select p).FirstOrDefault(); piezaComida.Activa = false; } //Verifica si el peon comio con el peon al paso if (pieza is Peon) { Movimiento mov = new Movimiento(); mov.Horizontal = 0; mov.Vertical = -1; Celda celdaAnterior = this.getCelda(actual, mov); if (celdaAnterior.Pieza != null && celdaAnterior.Pieza is Peon && celdaAnterior.Pieza.Color != pieza.Color) { piezaComida = (from Pieza p in piezas where p.Equals(celdaAnterior.Pieza) select p).FirstOrDefault(); piezaComida.Activa = false; } coronacion = this.VerificarCoronacion((Peon)pieza, destino); } destino.Pieza = pieza; partida.RegistrarMovimiento(actual, destino); this.VerificarMovimiento(actual, destino, pieza, jug); string tipo = (!coronacion) ? this.verificarJaqueOJaqueMate(jug, pieza) : string.Empty; if (tipo.Equals("JAQUE")) { jugadorRival.PiezaJaque = pieza; } partida.ChequearGanador(tipo, jug); return(coronacion); }
public List <Movimiento> VerificarEnroque(Rey pieza, List <Movimiento> movimientos) { Celda celdaAMover = null; Celda celdaActual = this.getCelda(pieza); Movimiento mov1 = movimientos.Where(m => m.Vertical == 0 && m.Horizontal == 2).FirstOrDefault(); Movimiento mov2 = movimientos.Where(m => m.Vertical == 0 && m.Horizontal == -2).FirstOrDefault(); Movimiento movimientoRey = (from Movimiento m in partida.Movimientos where m.Pieza == pieza select m).FirstOrDefault(); Movimiento mov = new Movimiento(); mov.Vertical = 0; mov.Horizontal = -4; movimientos = this.VerificarMovimiento(celdaActual, mov, movimientoRey, movimientos, mov2); mov.Vertical = 0; mov.Horizontal = 3; movimientos = this.VerificarMovimiento(celdaActual, mov, movimientoRey, movimientos, mov1); //Verifica que no haya piezas de por medio if (movimientos.Contains(mov1) || movimientos.Contains(mov2)) { bool removerMov1 = false; bool removerMov2 = false; for (int i = 0; i < 2; i++) { mov.Vertical = 0; mov.Horizontal = 1; if (celdaAMover == null) { celdaAMover = this.getCelda(celdaActual, mov); } else { celdaAMover = this.getCelda(celdaAMover, mov); } if (!this.VerificarCeldaDisponible(celdaAMover)) { removerMov1 = true; } } for (int i = 0; i < 3; i++) { mov.Vertical = 0; mov.Horizontal = -1; if (celdaAMover == null) { celdaAMover = this.getCelda(celdaActual, mov); } else { celdaAMover = this.getCelda(celdaAMover, mov); } if (!this.VerificarCeldaDisponible(celdaAMover)) { removerMov2 = true; } } if (removerMov1) { movimientos.Remove(mov1); } if (removerMov2) { movimientos.Remove(mov2); } } //Verificar si ya realizo un movimiento if (movimientos.Contains(mov1) || movimientos.Contains(mov2)) { foreach (Pieza p in piezas) { if (p.Color != pieza.Color && pieza.Activa == true) { Celda celda = this.getCelda(p); //Verifica si el rey esta en jaque actualmente foreach (Celda celdaDisp in p.getCeldasDestino(this, celda)) { if (celdaActual.Equals(celdaDisp)) { movimientos.Remove(mov1); movimientos.Remove(mov2); } } //Verifica si el rey esta amenazado al moverse for (int i = 0; i < 2; i++) { Movimiento movimientoARealizar = new Movimiento(); movimientoARealizar.Vertical = 0; movimientoARealizar.Horizontal = 1; if (celdaAMover == null) { celdaAMover = this.getCelda(celdaActual, movimientoARealizar); } else { celdaAMover = this.getCelda(celdaAMover, movimientoARealizar); } foreach (Celda celdaDisp in p.getCeldasDestino(this, celda)) { if (celdaAMover.Equals(celdaDisp)) { movimientos.Remove(mov1); } } } celdaAMover = null; for (int i = 0; i < 2; i++) { Movimiento movimientoARealizar = new Movimiento(); movimientoARealizar.Vertical = 0; movimientoARealizar.Horizontal = -1; if (celdaAMover == null) { celdaAMover = this.getCelda(celdaActual, movimientoARealizar); } else { celdaAMover = this.getCelda(celdaAMover, movimientoARealizar); } foreach (Celda celdaDisp in p.getCeldasDestino(this, celda)) { if (celdaAMover.Equals(celdaDisp)) { movimientos.Remove(mov2); } } } } } } return(movimientos); }