public unsafe Direction Solve(byte *grid) { this.current = data; int[] scores = new int[4]; byte *tempGrid = GridFunctions.CreateGrid(); for (int direction = 0; direction < 4; direction++) { //Console.WriteLine(direction); if (GridFunctions.GridCanCollapse(grid, (Direction)direction) == false) { //Console.WriteLine("\tCant Collapse"); //GridFunctions.printGrid(grid); scores[(int)direction] = 0; continue; } GridFunctions.CloneGrid(grid, tempGrid); GridFunctions.CollapseGridInPlace(tempGrid, (Direction)direction); int permutations = GridFunctions.CountEmptySquares(grid); const int depth = 2; if (permutations > 5) { scores[direction] = ScoreForGrid(tempGrid, depth); } else if (permutations < 3) { scores[direction] = ScoreForGrid(tempGrid, depth + 2); } else { scores[direction] = ScoreForGrid(tempGrid, depth + 1); } //Console.WriteLine("\tScore: " + scores[direction]); } GridFunctions.FreeGrid(tempGrid); int max = 0; Direction maxDir = Direction.left; for (int i = 0; i < 4; i++) { if (scores[i] > max) { max = scores[i]; maxDir = (Direction)i; } } return(maxDir); //return scores.OrderByDescending(x => x.Value).First().Key; }
public Permutator(byte *grid, Direction direction) { this.grid = GridFunctions.CreateGrid(); GridFunctions.CloneGrid(grid, this.grid); this.direction = direction; collapsedGrid = GridFunctions.CreateGrid(); GridFunctions.CloneGrid(grid, this.collapsedGrid); GridFunctions.CollapseGridInPlace(collapsedGrid, direction); currentRow = 0; currentColumn = 0; GridFunctions.GetDeltas(direction, out offset, out rowDelta, out columnDelta); }