コード例 #1
0
        public static MapData GenerateFloor(uint floorNumber, int widthInTiles, int heightInTiles)
        {
            // Generate a walkable map, complete with stairs down

            var isWalkableMap = new ArrayMap <bool>(widthInTiles, heightInTiles);

            CellularAutomataGenerator.Generate(isWalkableMap);

            // Randomly positioned on a ground tile! True = walkable
            var playerPosition = isWalkableMap.RandomPosition(true);

            var stairsDownPosition = playerPosition;

            while (Math.Abs(playerPosition.X - stairsDownPosition.X) + Math.Abs(playerPosition.Y - stairsDownPosition.Y) <= MinimumPlayerStairsDistance)
            {
                stairsDownPosition = isWalkableMap.RandomPosition(true);
            }

            System.Console.WriteLine($"Stairs are at {stairsDownPosition}");
            var mapData = new MapData()
            {
                Map = isWalkableMap, PlayerPosition = playerPosition, StairsDownPosition = stairsDownPosition
            };

            return(mapData);
        }
コード例 #2
0
ファイル: MainPage.cs プロジェクト: rwindegger/GoRogue
        private static void Pathing()
        {
            /* AStar */
            var timeAStar     = PathingTests.TimeForAStar(Runner.MAP_WIDTH, Runner.MAP_HEIGHT, Runner.ITERATIONS_FOR_TIMING);
            var timeFastAStar = PathingTests.TimeForFastAStar(Runner.MAP_WIDTH, Runner.MAP_HEIGHT, Runner.ITERATIONS_FOR_TIMING);

            Console.WriteLine($"Time for {Runner.ITERATIONS_FOR_TIMING} paths, on {Runner.MAP_WIDTH}x{Runner.MAP_HEIGHT} map:");
            Console.WriteLine($"\tAStar    : {timeAStar}");
            Console.WriteLine($"\tFastAStar: {timeFastAStar}");

            /* Single-Goal GoalMap */
            var map = new ArrayMap <bool>(Runner.MAP_WIDTH, Runner.MAP_HEIGHT);

            QuickGenerators.GenerateCellularAutomataMap(map);
            Coord goal = map.RandomPosition(true);

            var timeGoalMap = PathingTests.TimeForGoalMap(map, goal.Yield(), Runner.ITERATIONS_FOR_TIMING);
            var timeFleeMap = PathingTests.TimeForFleeMap(map, goal.Yield(), Runner.ITERATIONS_FOR_TIMING);

            Console.WriteLine();
            Console.WriteLine($"Time to calculate single-source goal map on {Runner.MAP_WIDTH}x{Runner.MAP_HEIGHT} map {Runner.ITERATIONS_FOR_TIMING} times:");
            Console.WriteLine($"\tGoal-Map    : {timeGoalMap}");
            Console.WriteLine($"\tFlee-Map    : {timeFleeMap}");

            /* Multi-Goal GoalMap */
            var goals = new List <Coord>();

            for (int i = 0; i < Runner.NUM_GOALS; i++)
            {
                goals.Add(map.RandomPosition(true));
            }

            var timeMGoalMap = PathingTests.TimeForGoalMap(map, goals, Runner.ITERATIONS_FOR_TIMING);
            var timeMFleeMap = PathingTests.TimeForFleeMap(map, goals, Runner.ITERATIONS_FOR_TIMING);

            Console.WriteLine();
            Console.WriteLine($"Time to calculate multi-source goal map on {Runner.MAP_WIDTH}x{Runner.MAP_HEIGHT} map {Runner.ITERATIONS_FOR_TIMING} times:");
            Console.WriteLine($"\tGoal-Map    : {timeMGoalMap}");
            Console.WriteLine($"\tFlee-Map    : {timeMFleeMap}");
        }
コード例 #3
0
        public void FOVSenseMapEquivalency()
        {
            ArrayMap <bool> map = new ArrayMap <bool>(100, 100);

            QuickGenerators.GenerateRectangleMap(map);

            var positions = Enumerable.Range(0, 100).Select(x => map.RandomPosition(true)).ToList();

            // Make 2-layer thick walls to verify wall-lighting is working properly
            foreach (var pos in map.Positions())
            {
                if (pos.X == 1 || pos.Y == 1 || pos.X == map.Width - 2 || pos.Y == map.Height - 2)
                {
                    map[pos] = false;
                }
            }

            var fov         = new FOV(map);
            var senseMap    = new SenseMap(new LambdaTranslationMap <bool, double>(map, x => x ? 0.0 : 1.0));
            var senseSource = new SenseSource(SourceType.SHADOW, map.RandomPosition(true), 5, Distance.EUCLIDEAN);

            senseMap.AddSenseSource(senseSource);


            foreach (var curPos in positions)
            {
                if (!map[curPos])
                {
                    continue;
                }

                senseSource.Position = curPos;
                fov.Calculate(senseSource.Position, senseSource.Radius, senseSource.DistanceCalc);
                senseMap.Calculate();

                foreach (var pos in map.Positions())
                {
                    bool success = fov.BooleanFOV[pos] == (senseMap[pos] > 0.0 ? true : false);

                    if (!success)
                    {
                        Console.WriteLine($"Failed on pos {pos} with source at {senseSource.Position}.");
                        Console.WriteLine($"FOV: {fov[pos]}, SenseMap: {senseMap[pos]}");
                        Console.WriteLine($"Distance between source and fail point: {Distance.EUCLIDEAN.Calculate(senseSource.Position, pos)}, source radius: {senseSource.Radius}");
                    }

                    Assert.AreEqual(true, success);
                }
            }


            var degreesList = Enumerable.Range(0, 360).ToList();

            degreesList.FisherYatesShuffle();
            var spanList = Enumerable.Range(1, 359).ToList();

            spanList.FisherYatesShuffle();

            var degrees = degreesList.Take(30).ToList();
            var spans   = spanList.Take(30).ToList();

            senseSource.IsAngleRestricted = true;
            // Test angle-based shadowcasting
            foreach (var curPos in positions.Take(1))
            {
                if (!map[curPos])
                {
                    continue;
                }

                foreach (var degree in degrees)
                {
                    foreach (var span in spans)
                    {
                        senseSource.Angle = degree;
                        senseSource.Span  = span;

                        senseSource.Position = curPos;
                        fov.Calculate(senseSource.Position, senseSource.Radius, senseSource.DistanceCalc, senseSource.Angle, senseSource.Span);
                        senseMap.Calculate();

                        foreach (var pos in map.Positions())
                        {
                            bool success = fov.BooleanFOV[pos] == (senseMap[pos] > 0.0 ? true : false);

                            if (!success)
                            {
                                Console.WriteLine($"Failed on pos {pos} with source at {senseSource.Position}, angle: {senseSource.Angle}, span: {senseSource.Span}.");
                                Console.WriteLine($"FOV: {fov[pos]}, SenseMap: {senseMap[pos]}");
                                Console.WriteLine($"Distance between source and fail point: {Distance.EUCLIDEAN.Calculate(senseSource.Position, pos)}, source radius: {senseSource.Radius}");
                            }

                            Assert.AreEqual(true, success);
                        }
                    }
                }
            }
        }
コード例 #4
0
 private Player GeneratePlayer()
 {
     GoRogue.Coord playerPos = map.RandomPosition(true);
     return(new Player(playerPos.X, playerPos.Y, '@', new Energy(100, 20)));
 }