示例#1
0
 public void odigrajPotez(Potez p)
 {
     if (mozeDaPomeri(p.Gde.X, p.Gde.Y, p.Ko))
     {
         Matrica[p.Ko.X][p.Ko.Y].StackObjekata.Pop();
         Matrica[p.Gde.X][p.Gde.Y].StackObjekata.Push(p.Ko);
         if (p.Ko.X == Beli1.X && p.Ko.Y == Beli1.Y)
         {
             Beli1.X = p.Gde.X;
             Beli1.Y = p.Gde.Y;
         }
         else if (p.Ko.X == Beli2.X && p.Ko.Y == Beli2.Y)
         {
             Beli2.X = p.Gde.X;
             Beli2.Y = p.Gde.Y;
         }
         else if (p.Ko.X == Crni1.X && p.Ko.Y == Crni1.Y)
         {
             Crni1.X = p.Gde.X;
             Crni1.Y = p.Gde.Y;
         }
         else if (p.Ko.Y == Crni2.Y && p.Ko.Y == Crni2.Y)
         {
             Crni2.X = p.Gde.X;
             Crni2.Y = p.Gde.Y;
         }
     }
     gradi(p.GdeGradi.X, p.GdeGradi.Y, p.Ko);
 }
        public static float statickaProcena(bool koIgra, Potez potez, Tabla node)
        {
            float vrednost = 0; Coveculjak moj1 = null, moj2 = null, neprijatelj1 = null, neprijatelj2 = null;

            if (koIgra == true)
            {
                moj1         = node.Beli1;
                moj2         = node.Beli2;
                neprijatelj1 = node.Crni1;
                neprijatelj2 = node.Crni2;
            }
            else
            {
                moj1         = node.Crni1;
                moj2         = node.Crni2;
                neprijatelj1 = node.Beli1;
                neprijatelj2 = node.Beli2;
            }
            vrednost += potez.Gde.StackObjekata.Count;
            float rastojanje11 = (float)Math.Sqrt(Math.Pow(moj1.X - potez.GdeGradi.X, 2) + Math.Pow(moj1.Y - potez.GdeGradi.Y, 2));
            float rastojanje12 = (float)Math.Sqrt(Math.Pow(moj2.X - potez.GdeGradi.X, 2) + Math.Pow(moj2.Y - potez.GdeGradi.Y, 2));
            float rastojanje21 = (float)Math.Sqrt(Math.Pow(neprijatelj1.X - potez.GdeGradi.X, 2) + Math.Pow(neprijatelj1.Y - potez.GdeGradi.Y, 2));
            float rastojanje22 = (float)Math.Sqrt(Math.Pow(neprijatelj2.X - potez.GdeGradi.X, 2) + Math.Pow(neprijatelj2.Y - potez.GdeGradi.Y, 2));
            float pomVrednost  = potez.GdeGradi.StackObjekata.Count * (rastojanje11 + rastojanje12 - rastojanje21 - rastojanje22);

            vrednost += pomVrednost;
            return(vrednost);
        }
示例#3
0
        public static float alfaBeta(Tabla node, Potez potez, int depth, float alfa, float beta, bool igrac, out Potez naj)
        {
            naj = potez; broj++;
            if (depth == 0 || !node.noMoves())
            {
                //naj = potez;
                return(node.getValue(igrac, potez));
            }
            float pom;

            if (igrac)
            {
                pom = float.MinValue;
                List <Potez> potezi = node.generisiPoteze(true);
                foreach (Potez move in potezi)
                {
                    Tabla novCvor = new Tabla(node);
                    novCvor.odigrajPotez(move);
                    Potez noviNode = new Potez();
                    float ret      = alfaBeta(novCvor, move, depth - 1, alfa, beta, false, out noviNode);
                    if (pom < ret)
                    {
                        pom = ret;
                        naj = move;
                    }
                    alfa = Math.Max(alfa, pom);
                    if (beta <= alfa)
                    {
                        break;
                    }
                }
            }
            else
            {
                pom = float.MaxValue;
                List <Potez> potezi = node.generisiPoteze(false);
                foreach (Potez move in potezi)
                {
                    Tabla novCvor = new Tabla(node);
                    novCvor.odigrajPotez(move);
                    Potez noviNode = new Potez();
                    float ret      = alfaBeta(novCvor, move, depth - 1, alfa, beta, true, out noviNode);
                    if (pom > ret)
                    {
                        pom = ret;
                        naj = move;
                    }
                    beta = Math.Min(beta, pom);
                    if (beta <= alfa)
                    {
                        break;
                    }
                }
            }
            return(pom);
        }
示例#4
0
        public List <Potez> generisiPoteze(bool koIgra)
        {
            List <Potez> lista = new List <Potez>();
            List <Potez> lista2 = new List <Potez>();
            Coveculjak   covec1 = null, covec2 = null;

            if (koIgra == true)
            {
                covec1 = beli1; covec2 = beli2;
            }
            else
            {
                covec1 = crni1; covec2 = crni2;
            }

            for (int i = -1; i < 2; i++)
            {
                for (int j = -1; j < 2; j++)
                {
                    if (i == 0 && j == 0)
                    {
                        continue;
                    }
                    if (mozeDaPomeri(i + covec1.X, j + covec1.Y, covec1)) // Za figuricu proveravam na koja sve polja u krug moze da stane i pravim listu svih tih poteza
                    {
                        lista.Add(new Potez(covec1, matrica[covec1.X][covec1.Y], matrica[i + covec1.X][j + covec1.Y]));
                    }
                    if (mozeDaPomeri(i + covec2.X, j + covec2.Y, covec2))
                    {
                        lista.Add(new Potez(covec2, matrica[covec2.X][covec2.Y], matrica[i + covec2.X][j + covec2.Y]));
                    }
                }
            }
            foreach (Potez pom in lista)
            {
                int x = pom.Gde.X; int y = pom.Gde.Y;
                for (int i = -1; i < 2; i++)
                {
                    for (int j = -1; j < 2; j++)
                    {
                        if (i == 0 && j == 0)
                        {
                            continue;
                        }
                        matrica[pom.Ko.X][pom.Ko.Y].StackObjekata.Pop(); // Kad proverava da l moze da gradi moram da ga izvadim da bi video da moze da gradi na mestu na kom bio jer nije fizicki izvadjen stvarno s tog mesta
                        if (mozeDaGradi(i + x, j + y, pom.Ko))
                        {
                            Potez pomocniPotez = new Potez(pom.Ko, pom.Odakle, pom.Gde, matrica[i + x][j + y]);
                            lista2.Add(pomocniPotez);
                        }
                        matrica[pom.Ko.X][pom.Ko.Y].StackObjekata.Push(pom.Ko); // Tu ga vratim
                    }
                }
            }
            return(lista2);
        }
示例#5
0
        public static void writeMove(Potez p)
        {
            char slovo = 'A';

            switch (p.Odakle.X)
            {
            case 0: slovo = 'A'; break;

            case 1: slovo = 'B'; break;

            case 2: slovo = 'C'; break;

            case 3: slovo = 'D'; break;

            case 4: slovo = 'E'; break;
            }
            char slovo1 = 'A';

            switch (p.Gde.X)
            {
            case 0: slovo1 = 'A'; break;

            case 1: slovo1 = 'B'; break;

            case 2: slovo1 = 'C'; break;

            case 3: slovo1 = 'D'; break;

            case 4: slovo1 = 'E'; break;
            }
            char slovo2 = 'A';

            switch (p.GdeGradi.X)
            {
            case 0: slovo2 = 'A'; break;

            case 1: slovo2 = 'B'; break;

            case 2: slovo2 = 'C'; break;

            case 3: slovo2 = 'D'; break;

            case 4: slovo2 = 'E'; break;
            }
            System.IO.File.AppendAllText(@path, slovo + "" + p.Odakle.Y + " " + slovo1 + "" + p.Gde.Y + " " + slovo2 + "" + p.GdeGradi.Y);
            writeNewLine();
        }
        public static float minimax(Tabla node, Potez potez, int depth, bool igrac, out Potez naj)
        {
            naj = potez;
            if (depth == 0 || !node.noMoves())
            {
                //naj = potez;
                return(node.getValue(igrac, potez));
            }
            float pom;

            if (igrac)
            {
                pom = float.MinValue;
                List <Potez> potezi = node.generisiPoteze(true);
                foreach (Potez move in potezi)
                {
                    //broj++;
                    Tabla novCvor = new Tabla(node);
                    novCvor.odigrajPotez(move);
                    Potez noviNode = new Potez();
                    float ret      = minimax(novCvor, move, depth - 1, false, out noviNode);
                    if (pom < ret)
                    {
                        pom = ret;
                        naj = move;
                    }
                }
            }
            else
            {
                pom = float.MaxValue;
                List <Potez> potezi = node.generisiPoteze(false);
                foreach (Potez move in potezi)
                {
                    Tabla novCvor = new Tabla(node);
                    novCvor.odigrajPotez(move);
                    Potez noviNode = new Potez();
                    float ret      = minimax(novCvor, move, depth - 1, true, out noviNode);
                    if (pom > ret)
                    {
                        pom = ret;
                        naj = move;
                    }
                }
            }
            return(pom);
        }
示例#7
0
 public float getValue(bool koIgra, Potez move = null)
 {
     return(JednostavanTakmicar.statickaProcena(koIgra, this));
 }