public Costo(int columna, Espacio espacio, double costo, double heuristica) { this.columna = columna; this.espacio = espacio; this.costo = costo; this.heuristica = heuristica; }
private Pen getColor(Espacio e) { if (e.espacioGanador) { return(new Pen(Color.Yellow, 20)); } if (e.estado == Espacio.Estado.Jugador) { return(new Pen(Color.Red, 20)); } else if (e.estado == Espacio.Estado.Agente) { return(new Pen(Color.Blue, 20)); } return(new Pen(Color.White, 20)); }
public List <Espacio> getEspaciosContiguos(Espacio espacio) { List <Espacio> espacios = new List <Espacio>(); int i = espacio.id; //Espacio a la izquierda if (i % columnas != 0) { espacios.Add(getEspacioById(i - 1)); } //Espacio a la derecha if (i % columnas != columnas - 1) { espacios.Add(getEspacioById(i + 1)); } //Espacio abajo if (i >= 7) { espacios.Add(getEspacioById(i - columnas)); //Espacio a la izquierda if (i % columnas != 0) { espacios.Add(getEspacioById(i - columnas - 1)); } //Espacio a la derecha if (i % columnas != columnas - 1) { espacios.Add(getEspacioById(i - columnas + 1)); } } //Espacio arriba if (i < columnas * filas - columnas) { espacios.Add(getEspacioById(i + columnas)); //Espacio a la izquierda if (i % columnas != 0) { espacios.Add(getEspacioById(i + columnas - 1)); } //Espacio a la derecha if (i % columnas != columnas - 1) { espacios.Add(getEspacioById(i + columnas + 1)); } } return(espacios); }
public void checar() { Espacio.Estado estado = Espacio.Estado.Jugador; int contador = 0; List <Espacio> con = new List <Espacio>(); //Checar horizontalmente for (int i = 0; i < filas; i++) { contador = 0; con.Clear(); for (int x = 0; x < columnas; x++) { if (espacios[i][x].estado == estado) { con.Add(espacios[i][x]); contador++; } else { contador = 0; con.Clear(); if (espacios[i][x].estado != Espacio.Estado.Libre) { estado = espacios[i][x].estado; con.Add(espacios[i][x]); contador++; } } if (contador >= 4) { terminarJuego(con); } } } //Checar verticalmente contador = 0; for (int i = 0; i < columnas; i++) { contador = 0; con.Clear(); for (int x = 0; x < filas; x++) { if (espacios[x][i].estado == estado) { con.Add(espacios[x][i]); contador++; } else { contador = 0; con.Clear(); if (espacios[x][i].estado != Espacio.Estado.Libre) { estado = espacios[x][i].estado; con.Add(espacios[x][i]); contador++; } } if (contador >= 4) { terminarJuego(con); } } } //Checar diagonalmente a la derecha contador = 0; for (int i = 0; i < filas * columnas; i++) { contador = 0; con.Clear(); Espacio e = getEspacioById(i); int p = i; while (p % columnas != 6 && p < filas * columnas) { e = getEspacioById(p); if (e.estado == estado) { con.Add(e); contador++; } else { con.Clear(); contador = 0; if (e.estado != Espacio.Estado.Libre) { estado = e.estado; con.Add(e); contador++; } } if (contador >= 4) { terminarJuego(con); } p += 8; } } //Checar diagonalmente a la izquierda contador = 0; for (int i = 0; i < filas * columnas; i++) { contador = 0; con.Clear(); Espacio e = getEspacioById(i); int p = i; while (p % columnas != 0 && p < filas * columnas) { e = getEspacioById(p); if (e.estado == estado) { con.Add(e); contador++; } else { contador = 0; con.Clear(); if (e.estado != Espacio.Estado.Libre) { estado = e.estado; con.Add(e); contador++; } } if (contador >= 4) { terminarJuego(con); } p += 6; } } }
public void iniciar() { while (!conecta4.juegoTerminado) { while (conecta4.turno == Conecta4.Turno.Jugador) { Thread.Sleep(500); } if (conecta4.juegoTerminado) { return; } //Heuristica y costo //Determinar que columnas estan disponibles List <int> columnas = new List <int>(new int[] { 0, 1, 2, 3, 4, 5, 6 }); for (int i = 0; i < columnas.Count; i++) { if (!conecta4.posibleMovimiento(columnas[i])) { columnas[i] = -1; } } columnas.RemoveAll(i => i == -1); List <Costo> costos = new List <Costo>(); //Aplicar función de costo a los espacios disponibles foreach (int c in columnas) { Espacio e = conecta4.getEspacioLibre(c); List <Espacio> con = conecta4.getEspaciosContiguos(e); double cos = 0; foreach (Espacio v in con) { if (v.estado == Espacio.Estado.Libre) { cos += 1; } else if (v.estado == Espacio.Estado.Agente) { cos += 0.5; } else { cos += 0; } } //Console.WriteLine($"Columna {c} Costo sin promediar {cos}"); cos /= con.Count; //cos = Costo //h = Heuristica //Heuristica nueva: Cantidad de fichas del otro jugador por fila y columna y se pone negativa double h = contarCol(e.id % 7) + contarFilas((int)Math.Floor((double)e.id / 7)); Costo costo = new Costo(c, e, cos, -h); costos.Add(costo); } costos.Sort(); //Debug foreach (Costo c in costos) { Console.WriteLine($"Columna {c.columna} Costo {c.costo}, Heuristica {c.heuristica}, Total {c.costoTotal}"); } if (costos.Count > 0) { conecta4.movimiento(costos[0].columna, 2); } else { if (conecta4.juegoTerminado) { return; } //Error conecta4.terminarJuego(); } //conecta4.turno = Conecta4.Turno.Jugador; } }