public int MaxValue(EstadoJuegoDamas estado, AlfaBeta ab) { int v = int.MinValue; if (EsTerminal(estado)) { return(ComputarUtilidad(estado)); } else { List <EstadoJuegoDamas> successorList = estado.CalcularSucesores(); foreach (EstadoJuegoDamas successor in successorList) { int minimumValueOfSuccessor = MinValue(successor, ab.Copy()); if (minimumValueOfSuccessor > v) { v = minimumValueOfSuccessor; estado.Siguiente = successor; } //Si α >= β retorne α... esta es una parte importante de la poda if (v >= ab.Beta) { //Poda desde max; return(v); } ab.Alfa = Math.Max(ab.Alfa, v); } return(v); } }
public List <EstadoJuegoDamas> CalcularSucesores() { StreamWriter sw = new StreamWriter("estados.txt", true); sw.WriteLine("*/*/*/*//*//**/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/"); sw.WriteLine("Hijos de:"); sw.Write(this.ToString()); sw.WriteLine(); int minivel = this.Nivel; List <EstadoJuegoDamas> rta = new List <EstadoJuegoDamas>(); EstadoJuegoDamas copia = new EstadoJuegoDamas(this); //if((object)jugadas_legales == null || jugadas_legales.Count == 0) CalcularMovimientosLegales(); foreach (Jugada j in jugadas_legales) { EstadoJuegoDamas sucesor = new EstadoJuegoDamas(); sucesor = XirguGame.GetInstance().Juego.Mover(copia, j); if (sucesor != null) { sucesor.JugadaHecha = j; sucesor.Nivel = minivel + 1; sw.Write(sucesor.ToString()); rta.Add(sucesor); } } sw.Flush(); sw.Close(); return(rta); }
public Juego() { estado_inicial = new EstadoJuegoDamas(); estadoActual = new EstadoJuegoDamas(); InicializarEstado(); nivel = 5; }
public EstadoJuegoDamas(EstadoJuegoDamas old) { if ((object)old.jugadaHecha != null) { this.jugadaHecha = new Jugada(old.jugadaHecha); } this.Jugadas_legales = new List <Jugada>(); Jugada nuevaj; foreach (Jugada j in old.Jugadas_legales) { nuevaj = new Jugada(j); this.Jugadas_legales.Add(nuevaj); } this.JugadorAMover = new Pieza.Jugadores(); this.JugadorAMover = old.JugadorAMover; this.las_celdas = new Escaque[32]; for (int i = 0; i < old.las_celdas.Length; i++) { this.las_celdas[i] = new Escaque(old.las_celdas[i]); } this.Nivel = old.Nivel; if (siguiente != null) { this.siguiente = new EstadoJuegoDamas(old.siguiente); } }
public List <Jugada> ObtenerJugadasLegales(EstadoJuegoDamas estado) { EstadoJuegoDamas e = new EstadoJuegoDamas(); e = estado; e.CalcularMovimientosLegales(); return(e.Jugadas_legales); }
public EstadoJuegoDamas Mover(EstadoJuegoDamas estado, Jugada j) { EstadoJuegoDamas estAuxiliar = new EstadoJuegoDamas(estado); int posfinal = 0; foreach (Movimiento m in j.Los_movs) { if (estAuxiliar.EsLegalCaza(m)) { int pac = m.PosACazar(); estAuxiliar.Las_celdas[pac - 1].la_pieza = null; } estAuxiliar.Las_celdas[m.Destino - 1].la_pieza = estAuxiliar.Las_celdas[m.Origen - 1].la_pieza; estAuxiliar.Las_celdas[m.Origen - 1].la_pieza = null; posfinal = m.Destino; } estAuxiliar.JugadaHecha = j; //Convertir en reina Pieza.Jugadores color; if (estAuxiliar.Las_celdas[posfinal - 1].la_pieza.Owner == Pieza.Jugadores.blanco && FilaDe(posfinal) == 8 && estAuxiliar.Las_celdas[posfinal - 1].la_pieza.Tipo == Pieza.TiposPiezas.peon ) { color = estAuxiliar.Las_celdas[posfinal - 1].la_pieza.Owner; estAuxiliar.Las_celdas[posfinal - 1].la_pieza = Pieza.HacerPieza(Pieza.TiposPiezas.Reina); estAuxiliar.Las_celdas[posfinal - 1].la_pieza.Owner = color; } else { if (estAuxiliar.Las_celdas[posfinal - 1].la_pieza.Owner == Pieza.Jugadores.negro && FilaDe(posfinal) == 1 && estAuxiliar.Las_celdas[posfinal - 1].la_pieza.Tipo == Pieza.TiposPiezas.peon ) { color = estAuxiliar.Las_celdas[posfinal - 1].la_pieza.Owner; estAuxiliar.Las_celdas[posfinal - 1].la_pieza = Pieza.HacerPieza(Pieza.TiposPiezas.Reina); estAuxiliar.Las_celdas[posfinal - 1].la_pieza.Owner = color; } } if (estAuxiliar.JugadorAMover == Pieza.Jugadores.blanco) { estAuxiliar.JugadorAMover = Pieza.Jugadores.negro; } else { estAuxiliar.JugadorAMover = Pieza.Jugadores.blanco; } return(estAuxiliar); }
public void HacerMovAlfaBeta() { File.Delete("estados.txt"); getAlfaBetaValue(estadoActual); EstadoJuegoDamas nextState = estadoActual.Siguiente; if (nextState == null) { throw new Exception("Movimiento Alfa-Beta Fallido!!"); } Mover(nextState.JugadaHecha); }
public void InicializarEstado() { estado_inicial.Nivel = 0; estado_inicial.JugadorAMover = Pieza.Jugadores.blanco; for (int i = 0; i < 12; i++) { estado_inicial.Las_celdas[i].la_pieza = Pieza.HacerPieza(Pieza.TiposPiezas.peon); estado_inicial.Las_celdas[i].la_pieza.Owner = Pieza.Jugadores.blanco; } for (int i = 20; i < 32; i++) { estado_inicial.Las_celdas[i].la_pieza = Pieza.HacerPieza(Pieza.TiposPiezas.peon); estado_inicial.Las_celdas[i].la_pieza.Owner = Pieza.Jugadores.negro; } estadoActual = estado_inicial; }
public void ActualizarTablero() { EstadoJuegoDamas estado = new EstadoJuegoDamas(); estado = XirguGame.GetInstance().Juego.EstadoActual; Pieza.Jugadores o = new Pieza.Jugadores(); Pieza.TiposPiezas t = new Pieza.TiposPiezas(); for (int i = 0; i < 32; i++) { if (!estado.Las_celdas[i].EsVacia()) { o = estado.Las_celdas[i].la_pieza.Owner; t = estado.Las_celdas[i].la_pieza.Tipo; if (o == Pieza.Jugadores.blanco && t == Pieza.TiposPiezas.peon) { tablero[i] = 'b'; } if (o == Pieza.Jugadores.negro && t == Pieza.TiposPiezas.peon) { tablero[i] = 'n'; } if (o == Pieza.Jugadores.blanco && t == Pieza.TiposPiezas.Reina) { tablero[i] = 'B'; } if (o == Pieza.Jugadores.negro && t == Pieza.TiposPiezas.Reina) { tablero[i] = 'N'; } } else { tablero[i] = '█'; } } }
public bool EsTerminal(EstadoJuegoDamas estado) { return(HaTerminado() || estado.Nivel == nivel); }
public int ComputarUtilidad(EstadoJuegoDamas estado) { return(estado.CalcularUtilidad()); }
public int getAlfaBetaValue(EstadoJuegoDamas estado) { return(MaxValue(estado, new AlfaBeta())); }