/// <summary> /// Adds a tile in a random position /// </summary> public void Move(GridModel grid) { var cells = grid.AvailableCells(); if (cells.Any()) { int value = _rand.NextDouble() < _percentageOfValue1 ? 1 : 2; var tile = new TileModel(value); var position = cells[_rand.Next(cells.Length)]; tile.Position = position; } }
private double Minimizer(GridModel grid, int depth, double alpha, double beta) { // computer's turn, we'll do heavy pruning to keep the branching factor low var availableCells = grid.AvailableCells().ToList(); // try out all combinations possible foreach (var value in new int[] { 1, 2 }) { foreach (CellModel cell in availableCells) { var tile = new TileModel(value); tile.Position = cell; beta = Math.Min(beta, AlphaBetaSearch(grid, depth, true, alpha, beta)); tile.Position = null; if (beta < alpha) // pruning { return(alpha); } } } /* * // try a 2 and 4 in each cell and measure how annoying it is * // with metrics from eval * //var scores = { 2: [], 4: [] }; * foreach (var value in new int[] { 1, 2 }) * { * foreach (CellModel cell in availableCells) * { * scores[value].push(null); * * var tile = new TileModel(value); * tile.Position = cell; * * scores[value][i] = -grid.Smoothness() + grid.Islands(); * * tile.Position = null; * } * } * * // now just pick out the most annoying moves * var candidates = new List<CellModel>(); * var maxScore = Math.Max(Math.Max(null, scores[2]), Math.Max(null, scores[4])); * foreach (var value in new int[] { 1, 2 }) * { * for (var i = 0; i < scores[value].length; i++) * { * if (scores[value][i] >= maxScore) * { * candidates.Add(cells[i]); * } * } * } * * // search on each candidate * foreach (CellModel position in candidates) * { * * } */ return(beta); }