public IksOksIgra(int XuUIO, int YuUIO, UltimateIksOks parent = null) { matrica = new Mjesto[3, 3]; for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { matrica[i, j] = new Mjesto() { X = i, Y = j, Parent = this, player = null }; } } this.Parent = parent; this.XuUIO = XuUIO; this.YuUIO = YuUIO; }
private int heuristic(UltimateIksOks igra, Player MaximizingPlayer, int dubina) { int bodoviZaMaks = 0; if (igra.Pobjednik != null) { bodoviZaMaks = igra.Pobjednik == MaximizingPlayer ? 100 : -100; bodoviZaMaks += igra.Pobjednik == MaximizingPlayer ? -dubina : dubina; } else { foreach (var malaigra in igra.igre) { if (malaigra.Pobjednik != null) { bodoviZaMaks += (malaigra.Pobjednik == MaximizingPlayer) ? 20 : -20; } } } Posjeceno++; //Console.WriteLine("Bodovi " + bodoviZaMaks + " Dubina " + dubina + "; Posjeceno :" + Posjeceno); return(bodoviZaMaks); }
public int doMinimax(UltimateIksOks igra, int dubina, Player MaximizingPlayer, int alpha, int beta) { if (dubina == 0) { stoperica.Reset(); stoperica.Start(); bestMjesto = null; Posjeceno = 0; } if (igra.DostupnaMjesta.Count == 0 || dubina > MAX_DEPTH || igra.Pobjednik != null) { return(heuristic(igra, MaximizingPlayer, dubina)); } if (igra.PlayerPlaying == MaximizingPlayer) { int max = Int32.MinValue; foreach (var mjesto in igra.DostupnaMjesta) { var nextGame = igra.NextIgraToBePlayed; igra.MakeMove(mjesto); var value = doMinimax(igra, dubina + 1, MaximizingPlayer, alpha, beta); if (value > max && dubina == 0) { bestMjesto = mjesto; } max = Math.Max(value, max); alpha = Math.Max(alpha, max); igra.UndoMove(mjesto.X, mjesto.Y, mjesto.Parent.XuUIO, mjesto.Parent.YuUIO); igra.NextIgraToBePlayed = nextGame; if (beta <= alpha) { break; } } if (dubina == 0) { stoperica.Stop(); vrijemeRacunanja = stoperica.Elapsed; } return(max); } else { int min = Int32.MaxValue; foreach (var mjesto in igra.DostupnaMjesta) { var nextGame = igra.NextIgraToBePlayed; igra.MakeMove(mjesto); var value = doMinimax(igra, dubina + 1, MaximizingPlayer, alpha, beta); min = Math.Min(min, value); beta = Math.Min(beta, min); igra.UndoMove(mjesto.X, mjesto.Y, mjesto.Parent.XuUIO, mjesto.Parent.YuUIO); igra.NextIgraToBePlayed = nextGame; if (beta <= alpha) { break; } } if (dubina == 0) { stoperica.Stop(); vrijemeRacunanja = stoperica.Elapsed; } return(min); } }