Exemple #1
0
        public static void GenerateRules(MonoRandom rng)
        {
            if (_rng != null && _rng.Seed == rng.Seed)
            {
                return;
            }
            _rng = rng;

            Mazes.Clear();
            for (int i = 0; i < 10; i++)
            {
                var maze = new Maze();
                Mazes.Add(maze);
                maze.BuildMaze(rng);
            }
        }
        public static void GenerateRules(MonoRandom rng)
        {
            if (_rng != null && _rng.Seed == rng.Seed)
            {
                return;
            }
            _rng = rng;

            Mazes.Clear();
            for (var i = 0; i < 18; i++)
            {
                var maze = new Maze();
                Mazes.Add(maze);
                maze.BuildMaze(rng);
            }

            var words = new List <string>(PossibleWords);

            words.AddRange(ExtendedWords);

            // Choose 8 base words
            var numBaseWords = 18;
            var chosenWords  = words.OrderBy(x => rng.NextDouble()).Take(numBaseWords).ToList();

            Debug.LogFormat("[Morse Code Rule Seed Generator] + Base words: {0}", string.Join(", ", chosenWords.ToArray()));

            // Find other words that are similar to these (low cycling Levenshtein distance)
            for (var i = 0; i < numBaseWords && chosenWords.Count < 36; i++)
            {
                var prefix = chosenWords[i].Substring(1);
                var toAdd  = words
                             .Where(w => !chosenWords.Contains(w) && !w.EndsWith(prefix))
                             .Select(w => (new { word = w, pref = rng.NextDouble(), dist = Similarity(w, chosenWords[i]) }))
                             .ToList();
                toAdd.Sort((a, b) =>
                {
                    var r = a.dist - b.dist;
                    return(r == 0 ? Math.Sign(a.pref - b.pref) : r);
                });
                var howmany = Math.Min(Math.Min(rng.Next(1, 4), 36 - chosenWords.Count), toAdd.Count);
                Debug.LogFormat(@"[Password rule seed] From {0}, adding words: {1}", chosenWords[i], string.Join(", ", toAdd.Take(howmany).Select(w => string.Format("{0}/{1}/{2}", w.word, w.dist, w.pref)).ToArray()));
                chosenWords.AddRange(toAdd.Take(howmany).Select(inf => inf.word));
            }

            Words.Clear();
            Words.AddRange(chosenWords.Take(36).OrderBy(x => rng.NextDouble()));
        }
        public override void CreateRules()
        {
            if (!Initialized)
            {
                throw new Exception("You must initialize the Random number generator first");
            }

            Mazes.Clear();
            switch (Seed)
            {
            case 1:
                for (var i = 0; i < 9; i++)
                {
                    var maze = new Maze();
                    Mazes.Add(maze);
                    maze.BuildMaze(NextMinMax);
                }
                InitializeRNG(2);
                Seed = 1;
                var list = new List <Maze>();
                for (var i = 0; i < 9; i++)
                {
                    var maze = new Maze();
                    list.Add(maze);
                    maze.BuildMaze(NextMinMax);
                }
                Mazes.Add(list[2]);
                Mazes.Add(list[3]);
                Mazes.Add(list[8]);
                Mazes.Add(list[6]);
                Mazes.Add(list[1]);
                Mazes.Add(list[0]);
                Mazes.Add(list[4]);
                Mazes.Add(list[5]);
                Mazes.Add(list[7]);
                break;

            case 2:
                for (var i = 0; i < 9; i++)
                {
                    new Maze().BuildMaze(NextMinMax);     //Burn the first 9 mazes out of seed 2. Seed 1 ruleset already used them.
                }
                for (var i = 0; i < 18; i++)
                {
                    var maze = new Maze();
                    Mazes.Add(maze);
                    maze.BuildMaze(NextMinMax);
                }
                break;

            default:
                for (var i = 0; i < 18; i++)
                {
                    var maze = new Maze();
                    Mazes.Add(maze);
                    maze.BuildMaze(NextMinMax);
                }
                break;
            }
            RulesGenerated = true;
        }