// Determina si un jugador está ahogado (tablas) public bool ahogado(bool color) { ArrayList jugador; Rey rey; Tablero tablero = new Tablero(); tablero.setEstado(this.getEstado()); if (color) { jugador = tablero.fichasBlancas; rey = reyBlanco; } else { jugador = tablero.fichasNegras; rey = reyNegro; } if (tablero.esJaque(color, true)) { return(false); } Ficha f; for (int i = 0; i < jugador.Count; i++) { f = (Ficha)jugador[i]; if (f.movimientosPermitidos.Count > 0) { return(false); } } return(true); }
// Determina si el rey "color" está en jaque (mate) public bool esJaque(bool color, bool mate) { Rey rey; ArrayList jugadorRival; Tablero tablero = new Tablero(); tablero.setEstado(this.getEstado()); // Copia del jugador (se modifica en los calculos) ArrayList jugador = new ArrayList(); if (color) { jugadorRival = tablero.fichasNegras; for (int i = 0; i < tablero.fichasBlancas.Count; i++) { jugador.Add(tablero.fichasBlancas[i]); } rey = tablero.reyBlanco; } else { jugadorRival = tablero.fichasBlancas; for (int i = 0; i < tablero.fichasNegras.Count; i++) { jugador.Add(tablero.fichasNegras[i]); } rey = tablero.reyNegro; } Ficha ficha; // Copia de los movimientos (se modifica en los calculos) ArrayList movimientos = new ArrayList(); bool noJaque = false; for (int i = 0; i < jugadorRival.Count; i++) { ficha = (Ficha)jugadorRival[i]; if (ficha.celdasAmenazadas.Contains(rey.miCasilla)) { if (!mate) { return(true); } if (rey.movimientosPermitidos.Count == 0) { Casilla aux; Ficha f, r; for (int j = 0; j < jugador.Count; j++) { f = (Ficha)jugador[j]; aux = f.miCasilla; movimientos.Clear(); for (int k = 0; k < f.movimientosPermitidos.Count; k++) { movimientos.Add(f.movimientosPermitidos[k]); } foreach (Casilla c in movimientos) { r = c.ficha; if (tablero.moverFicha(f, aux, c)) { if (!tablero.esJaque(color, false)) { noJaque = true; } } c.ficha = r; if (r != null) { r.capturada = false; } aux.ficha = f; tablero.actualizarMovimientos(); if (noJaque) { return(false); } } } return(true); } } } return(false); }