private void SetUpSettings() { settings = MinesweeperGame.Settings; operators = settings.Operators; FirstGuess = settings.FirstGuess; x = settings.x; y = settings.y; numberofmines = settings.NumberOfMines; firststeprule = settings.FirstStepRule; rendering = settings.Rendering; usagemode = settings.usageMode; // if (usagemode == MinesweeperUsageMode.NoAI) { ClickToStep = false; useai = false; } originally the user could player but this functionality was removed if (usagemode == MinesweeperUsageMode.ClickToStepAI) { ClickToStep = true; useai = true; } else { ClickToStep = false; useai = true; } samplesize = settings.SampleSize; sleeptime = settings.SleepTime; solvertype = settings.SolverType; guessor = settings.guessorType; MGDSSP_UncoverMax = settings.MGDSSP_UncoverMax; updatetime = settings.DefaultSolvingSpeed; thinkingtime.text = updatetime.ToString(); gamestate = MinesweeperGame.Gamestate; relativenumberofmines = (float)settings.NumberOfMines / (settings.x * settings.y); MaxSolvingLength = settings.MaxSolvingLength; }
public MinesweeperSettings(Vector2Int FirstGuess, int lengthX = 9, int lengthY = 9, int numberOfMines = 10, MinesweeperFirstStepRule firstStepRule = MinesweeperFirstStepRule.SafeSouranding, bool rendering = true, MinesweeperUsageMode usageMode = MinesweeperUsageMode.NormalAI, int sampleSize = 0, int sleepTime = 0, MinesweeperSolverType solverType = MinesweeperSolverType.Standard_DSSP, GuessorType guessorType = GuessorType.Random, float MGDSSP_UncoverMax = 0, float DefaultSolvingSpeed = 0, int MaxSolvingLength = 10 ) { x = lengthX; y = lengthY; NumberOfMines = numberOfMines; FirstStepRule = firstStepRule; Rendering = rendering; this.usageMode = usageMode; SampleSize = sampleSize; SleepTime = sleepTime; this.SolverType = solverType; this.guessorType = guessorType; this.Operators = new Vector2Int[8] { new Vector2Int(0, 1), new Vector2Int(1, 1), new Vector2Int(1, 0), new Vector2Int(1, -1), new Vector2Int(0, -1), new Vector2Int(-1, -1), new Vector2Int(-1, 0), new Vector2Int(-1, 1) }; this.MGDSSP_UncoverMax = MGDSSP_UncoverMax; this.FirstGuess = FirstGuess; this.DefaultSolvingSpeed = DefaultSolvingSpeed; this.MaxSolvingLength = MaxSolvingLength; }
/// <summary> /// The first action commited by the player /// </summary> /// <param name="tiles"></param> /// <param name="firststep"></param> /// <param name="rule"></param> /// <param name="operators"></param> public static Vector2Int[] FirstOnReveal(MinesweeperGamestate tiles, Vector2Int firststep, MinesweeperFirstStepRule rule, Vector2Int[] operators) { //creating local variable resuting in miminimal performance boost int maxx = tiles.LengthX; int maxy = tiles.LengthY; if (rule == MinesweeperFirstStepRule.SafeSouranding) { //finding the 'safe tiles' List <Vector2Int> safe = new List <Vector2Int>(); for (int i = 0; i < operators.Length; i++) { Vector2Int current = firststep + operators[i]; if (MinesweeperElementInfo.InBounds(current, maxx, maxy)) { safe.Add(current); } } safe.Add(firststep); //remove mines from 'safe tiles' List <Vector2Int> bombpositions = new List <Vector2Int>(); for (int i = 0; i < safe.Count; i++) { if (tiles[safe[i]].value >= 9) { tiles[safe[i]].value = 0; bombpositions.Add(safe[i]); } } //recalculate value of mines inside, and the souranding of 'safe' tiles for (int i = 0; i < bombpositions.Count; i++) { for (int j = 0; j < operators.Length; j++) { Vector2Int current = bombpositions[i] + operators[j]; if (MinesweeperElementInfo.InBounds(current, maxx, maxy)) { if (tiles[current].value >= 9) { tiles[bombpositions[i]].value++; } else if (!bombpositions.Contains(current)) { tiles[current].value--; } } } } //reassigning mines [not fixed time], but faster List <Vector2Int> newbombs = new List <Vector2Int>(); while (bombpositions.Count != newbombs.Count) { Vector2Int current = new Vector2Int(Random.Range(0, maxx), Random.Range(0, maxy)); if (tiles[current].value < 9 && !safe.Contains(current)) { tiles[current].value = 9; newbombs.Add(current); } } //recalculate souranding of the new mines for (int i = 0; i < newbombs.Count; i++) { for (int j = 0; j < operators.Length; j++) { Vector2Int current = newbombs[i] + operators[j]; if (MinesweeperElementInfo.InBounds(current, maxx, maxy)) { tiles[current].value++; } } } } else if (rule == MinesweeperFirstStepRule.SafeTile) { //firststep if (tiles[firststep].value >= 9) { tiles[firststep].value = 0; //recalculate value of firststep, and it's souranding for (int i = 0; i < operators.Length; i++) { Vector2Int current = firststep + operators[i]; if (MinesweeperElementInfo.InBounds(current, maxx, maxy)) { if (tiles[current].value >= 9) { tiles[firststep].value++; } else { tiles[current].value--; } } } //reassigning mine, and recalculate it's souranding while (true) { Vector2Int current = new Vector2Int(Random.Range(0, maxx), Random.Range(0, maxy)); if (tiles[current].value < 9 && current != firststep) { tiles[current].value = 9; for (int i = 0; i < operators.Length; i++) { Vector2Int current2 = current + operators[i]; if (MinesweeperElementInfo.InBounds(current2, maxx, maxy)) { tiles[current2].value++; } } break; } } if (tiles[firststep].value >= 9) { throw new System.Exception(); } } } return(OnReveal(tiles, firststep, operators)); }