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;
 }
Exemple #3
0
    /// <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));
    }