コード例 #1
0
ファイル: Costo.cs プロジェクト: ruben94p/Conecta4
 public Costo(int columna, Espacio espacio, double costo, double heuristica)
 {
     this.columna    = columna;
     this.espacio    = espacio;
     this.costo      = costo;
     this.heuristica = heuristica;
 }
コード例 #2
0
ファイル: Conecta4.cs プロジェクト: ruben94p/Conecta4
 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));
 }
コード例 #3
0
ファイル: Conecta4.cs プロジェクト: ruben94p/Conecta4
        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);
        }
コード例 #4
0
ファイル: Conecta4.cs プロジェクト: ruben94p/Conecta4
        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;
                }
            }
        }
コード例 #5
0
ファイル: Agente.cs プロジェクト: ruben94p/Conecta4
        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;
            }
        }