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); }
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); }
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); }
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); }
public float getValue(bool koIgra, Potez move = null) { return(JednostavanTakmicar.statickaProcena(koIgra, this)); }