static public void añadirMovyAme(Casilla casilla, ArrayList al, bool mov) { // Linea horizontal Casilla vecina; // Linea horizontal > for (int i = casilla.posX + 1; i < 8; i++) { vecina = casilla.tablero.tablero[i][casilla.posY]; if (Torre.comprobarMovAme(vecina, casilla.ficha.color, al, mov)) { break; } } // Linea horizontal < for (int i = casilla.posX - 1; i >= 0; i--) { vecina = casilla.tablero.tablero[i][casilla.posY]; if (Torre.comprobarMovAme(vecina, casilla.ficha.color, al, mov)) { break; } } // Linea vertical > for (int i = casilla.posY + 1; i < 8; i++) { vecina = casilla.tablero.tablero[casilla.posX][i]; if (Torre.comprobarMovAme(vecina, casilla.ficha.color, al, mov)) { break; } } // Linea vertical < for (int i = casilla.posY - 1; i >= 0; i--) { vecina = casilla.tablero.tablero[casilla.posX][i]; if (Torre.comprobarMovAme(vecina, casilla.ficha.color, al, mov)) { break; } } }
public Rey(bool color, Casilla casilla) : base(color, casilla) { valor = ValorFicha.REY; notacion = NotAlg.Rey; if (color) { textura = Texturas.BLANCO_REY; } else { textura = Texturas.NEGRO_REY; } // Deben haberse posiionado previamente!! torreC = (Torre)casilla.tablero.tablero[casilla.posX][7].ficha; torreL = (Torre)casilla.tablero.tablero[casilla.posX][0].ficha; }
public void setEstado(Estado estado) { try { turno = estado.turno; nTurno = estado.nTurno; fichasBlancas.Clear(); fichasNegras.Clear(); selected = null; seleccionada = null; for (int i = 0; i < Estado.LADO; i++) { for (int j = 0; j < Estado.LADO; j++) { // Referente a la casilla tablero[i][j].alPaso = estado.alPaso[i][j]; switch (estado.tablero[i][j]) { case Estado.Vacio: tablero[i][j].ficha = null; break; case Estado.PeonBlanco: Peon peon = new Peon(Ficha.BLANCA, tablero[i][j]); tablero[i][j].ficha = peon; peon.mov = estado.mov[i][j]; if (tablero[i][j].abajo.alPaso) { peon.alPaso = tablero[i][j]; peon.posNormal = tablero[i][j].abajo; peon.posNormal.ficha = peon; } break; case Estado.TorreBlanca: Torre torre = new Torre(Ficha.BLANCA, tablero[i][j]); tablero[i][j].ficha = torre; break; case Estado.CaballoBlanco: Caballo caballo = new Caballo(Ficha.BLANCA, tablero[i][j]); tablero[i][j].ficha = caballo; break; case Estado.AlfilBlanco: Alfil alfil = new Alfil(Ficha.BLANCA, tablero[i][j]); tablero[i][j].ficha = alfil; break; case Estado.ReinaBlanca: Reina dama = new Reina(Ficha.BLANCA, tablero[i][j]); tablero[i][j].ficha = dama; break; case Estado.ReyBlanco: reyBlanco = new Rey(Ficha.BLANCA, tablero[i][j]); tablero[i][j].ficha = reyBlanco; break; case Estado.PeonNegro: Peon peon2 = new Peon(Ficha.NEGRA, tablero[i][j]); tablero[i][j].ficha = peon2; peon2.mov = estado.mov[i][j]; if (tablero[i][j].arriba.alPaso) { peon2.alPaso = tablero[i][j]; peon2.posNormal = tablero[i][j].arriba; peon2.posNormal.ficha = peon2; } break; case Estado.TorreNegra: Torre torre2 = new Torre(Ficha.NEGRA, tablero[i][j]); tablero[i][j].ficha = torre2; break; case Estado.CaballoNegro: Caballo caballo2 = new Caballo(Ficha.NEGRA, tablero[i][j]); tablero[i][j].ficha = caballo2; break; case Estado.AlfilNegro: Alfil alfil2 = new Alfil(Ficha.NEGRA, tablero[i][j]); tablero[i][j].ficha = alfil2; break; case Estado.ReinaNegra: Reina dama2 = new Reina(Ficha.NEGRA, tablero[i][j]); tablero[i][j].ficha = dama2; break; case Estado.ReyNegro: reyNegro = new Rey(Ficha.NEGRA, tablero[i][j]); tablero[i][j].ficha = reyNegro; break; default: break; } if (tablero[i][j].ficha != null) { tablero[i][j].ficha.movida = estado.movida[i][j]; if (tablero[i][j].ficha.color == Ficha.BLANCA) { fichasBlancas.Add(tablero[i][j].ficha); } else { fichasNegras.Add(tablero[i][j].ficha); } } } } // Bucle externo (i) // Torres de los reyes reyBlanco.torreC = ((Torre)tablero[estado.torreCB[0]][estado.torreCB[1]].ficha); reyBlanco.torreL = ((Torre)tablero[estado.torreLB[0]][estado.torreLB[1]].ficha); reyNegro.torreC = ((Torre)tablero[estado.torreCN[0]][estado.torreCN[1]].ficha); reyNegro.torreL = ((Torre)tablero[estado.torreLN[0]][estado.torreLN[1]].ficha); // Actualizamos resto de cosas this.actualizarMovimientos(); } catch (Exception e) { MessageBox.Show("Error cargando estado previo: \n\r" + e.Message); } }
public bool moverFicha(Ficha previa, Casilla origen, Casilla destino) { bool enroque = false; if (turno == Ficha.BLANCA) { movimiento = ((nTurno / 2) + 1).ToString() + ". "; } else { movimiento += " "; } if (previa != null) { if (previa.movimientosPermitidos.Contains(destino)) { Ficha comida = null; ArrayList jugador = null; bool mov = previa.movida; bool paso = destino.alPaso; movimiento += previa.ToString(); // Pueden ir alli varias piezas mias??? movimiento += distinguirFicha(previa, destino); if (destino.ficha != null) { destino.ficha.capturada = true; comida = destino.ficha; if (fichasBlancas.Contains(destino.ficha)) { fichasBlancas.Remove(destino.ficha); jugador = fichasBlancas; movimiento += "x"; } else if (fichasNegras.Contains(destino.ficha)) { fichasNegras.Remove(destino.ficha); jugador = fichasNegras; movimiento += "x"; } // ¿Me comen al paso? Solo peones... try { Peon peon = (Peon)previa; if (destino.ficha.miCasilla != destino) { destino.ficha.miCasilla.ficha = null; destino.alPaso = false; } } catch (Exception) { destino.alPaso = false; } // Me comen habiendo dado doble salto? try { Peon peon = (Peon)destino.ficha; if (peon.alPaso == destino) { peon.posNormal.alPaso = false; peon.posNormal.ficha = null; } } catch (Exception) { } } movimiento += destino.ToString(); destino.ficha = previa; origen.ficha = null; //selected.ficha.actualizarMovimientos(selected); previa.movida = true; // Fue un enroque? Torre torre = null; Casilla casT = null; if (previa.enroque == destino) { try { // Si no es Rey, no fue enroque y saltara la excepcion :) Rey r = (Rey)previa; if (destino.derecha == r.torreC.miCasilla) { casT = r.torreC.miCasilla; moverFicha(r.torreC, r.torreC.miCasilla, r.torreC.enroque); torre = r.torreC; movimiento = ((nTurno / 2) + 1).ToString() + ". " + NotAlg.ENROQUEC; } else { casT = r.torreL.miCasilla; moverFicha(r.torreL, r.torreL.miCasilla, r.torreL.enroque); torre = r.torreL; movimiento = ((nTurno / 2) + 1).ToString() + ". " + NotAlg.ENROQUEL; } enroque = true; } catch (Exception) { } } // Fue salto doble de peon? try { Peon peon = (Peon)previa; if (peon.alPaso == destino) { peon.posNormal.ficha = peon; peon.posNormal.alPaso = true; } else { if (peon.posNormal != null) { peon.posNormal.alPaso = false; } peon.alPaso = null; peon.posNormal = null; } } catch (Exception) { } actualizarMovimientos(); // Evitar autojaque if (esJaque(turno, false)) { // Por si acaso destino.ficha = null; destino.alPaso = paso; // Deshacemos y nos sigue tocando if (comida != null && jugador != null) { comida.capturada = false; jugador.Add(comida); destino.ficha = comida; } origen.ficha = previa; previa.movida = mov; // Volver a poner variables de "al paso" try { Peon peon = (Peon)previa; if (peon.alPaso == destino) { peon.posNormal.ficha = null; peon.posNormal.alPaso = false; peon.mov = -1; } } catch (Exception) { } // Si fue enroque, deshacer tambien a la torre // Aunque nunca deberia darse, pues se comprueba // antes que el "camino" no estuviese amenazado if (enroque && casT != null && torre != null) { torre.miCasilla = null; casT.ficha = torre; torre.miCasilla = casT; } actualizarMovimientos(); // Si movemos, deseleccionamos destino.selected = false; return(false); } // Finalmente, promocionamos un peon? try { Peon peon = (Peon)previa; if ((peon.color && peon.miCasilla.posX == 0) || (!peon.color && peon.miCasilla.posX == 7)) { Promocion prom = new Promocion(peon); prom.ShowDialog(); if (peon.color) { fichasBlancas.Remove(peon); fichasBlancas.Add(prom.seleccionada); } else { fichasNegras.Remove(peon); fichasNegras.Add(prom.seleccionada); } movimiento += prom.seleccionada.ToString(); } } catch (Exception) { } // Si movemos, deseleccionamos destino.selected = false; return(true); } return(false); } return(false); }
public override void actualizarAmenazas(Casilla casilla) { miCasilla = casilla; celdasAmenazadas.Clear(); Torre.añadirMovyAme(miCasilla, celdasAmenazadas, false); }
public override void actualizarMovimientos(Casilla casilla) { miCasilla = casilla; movimientosPermitidos.Clear(); Torre.añadirMovyAme(miCasilla, movimientosPermitidos, true); }