/// <summary> /// In this constructor main cycle is performed /// </summary> /// <param name="fold">path to game folder</param> /// <param name="player">player symbol</param> /// <param name="time">permited time</param> public Program(string fold, CellState player, int time) { start = DateTime.Now; Field field = new Field(fold); int delta = 0; # if DEBUG delta = (new Random()).Next(Field.SIZE);//col shift, makes game more different #endif Solution root = new Solution(field, Solution.invertCell(player)); for (int i = 0; i < Field.SIZE; i++) { Solution buf = new Solution(root, (i + delta) % Field.SIZE); branch[i] = buf; if (!buf.isFinalized) que.Enqueue(buf); } while ((DateTime.Now - start).TotalMilliseconds + 300 < time && que.Count != 0)//main cycle Solve(que.Dequeue()); Solution max = branch[0]; for (int i = 1; i < Field.SIZE; i++) if (branch[i] != null) max = branch[i].isGreater(max); int turn = Directory.GetFiles(fold).Length / 2 + 1; string path = fold + (player == CellState.Cross ? "X" : "O") + turn.ToString() + ".txt"; File.WriteAllLines(path, new String[] { max.getTurn() }); }
/// <summary> /// Calculates next branches and adds them to a queue /// </summary> /// <param name="solve">root of new branches</param> void Solve(Solution solve) { for (int i = 0; i < Field.SIZE; i++) { Solution buf = new Solution(solve, i); if (!buf.isFinalized) que.Enqueue(buf); } }