예제 #1
0
        static void Main()
        {
            Console.WriteLine("Choose source of rules:");
            Console.WriteLine("1) DescriptiveTilesetGenerator (Turn simple rules into a rule set)");
            Console.WriteLine("2) SimpleExampleGenerator (Hand-coded rules)");
            Console.WriteLine("3) InferredRuleGenerator (Rules infered from a text file)");

            int choice = 0;

            do
            {
                Console.Write(">> ");
                var input = Console.ReadLine();
                int.TryParse(input, out choice);

                if (choice < 1 || choice > 3)
                {
                    choice = 0;
                }
            }while (choice == 0);

            ITilesetGenerator generator = null;

            switch (choice)
            {
            case 1:
                generator = new SimpleTiles.DescriptiveTilesetGenerator();
                break;

            case 2:
                generator = new SimpleExampleGenerator();
                break;

            case 3:
                generator = new InferredRuleGenerator("Example.txt");
                break;
            }

            Run(generator);
        }
예제 #2
0
        private static void Run(ITilesetGenerator generator, bool pause = true)
        {
            var helper  = new DirectionHelper();
            var tileset = generator.Generate(helper);

            Random rnd = new Random(10);

            var w = Console.WindowWidth;
            var h = Console.WindowHeight - 1;

            using (var fastConsole = new ConsoleWrapper((short)w, (short)h))
            {
                var renderer = new FastConsoleMapRenderer(fastConsole);

                do
                {
                    var map      = new Map(w, h, tileset);
                    var resolver = new MapResolver(rnd, map, helper);

                    var sw = Stopwatch.StartNew();

                    // while choices remain
                    while (!map.IsResolved)
                    {
                        // pick a (random) tile with lowest entropy
                        var tile = resolver.FindLowEntropyWaveFunction();

                        // give it a value, by weights
                        resolver.Resolve(tile);

                        try
                        {
                            // reduce the choices for surrounding tiles, propagting out
                            resolver.Propagate(tile);
                        }
                        catch
                        {
                            pause = true;
                            break;
                        }

                        renderer.Render(map, tile);
                        fastConsole.RenderBuffer();
                    }

                    sw.Stop();

                    renderer.Render(map);
                    fastConsole.RenderBuffer();

                    Console.SetCursorPosition(0, Console.WindowHeight - 1);
                    Console.Write($"Time: {sw.ElapsedMilliseconds}");

                    if (pause)
                    {
                        Console.ReadKey();
                        pause = false;
                    }
                } while (true);
            }
        }