Как сгенерировать ключ для процедурно сгенерированной карты с использованием алгоритма алмазного квадрата? - PullRequest
0 голосов
/ 26 сентября 2018

Я не знаю, является ли ключ подходящим словом для этого, но я реализовал версию алгоритма Diamond-Square, и мне было интересно, есть ли способ «сохранить» текущий вывод и воссоздать его с помощью простого (От 6 до 10 символов).Единственный способ, который я до сих пор изучал, - это сохранить его как одно число / строку, содержащую выходное значение каждой ячейки, но для сетки 17X17 у меня была бы последовательность длиной не менее 289 символов (при условии, что выходные данные представляют собой одну цифру на ячейку).

Поскольку алгоритм случайный, я не могу придумать лучшего способа сделать это.Если это невозможно, расскажите, пожалуйста, о лучшем алгоритме.Спасибо:)

PS: я использую Unity 3D и C #

Ответы [ 2 ]

0 голосов
/ 27 сентября 2018

Мне понравились комментарии, я сказал, что использовал Random.InitState с единицей, и все работает нормально.Еще раз спасибо!

UnityEngine.Random.InitState(seed);

Я могу управлять семенем так, как я хочу, и это дает мне ту же карту для того же семени.

0 голосов
/ 26 сентября 2018

следующий класс из учебника по единству для процедурной генерации пещер, но я включил его, потому что он включает в себя основные элементы, которые вам нужны.он использует семя для генерации карты, то же семя будет регенерировать ту же карту .... вы можете использовать семя в процессе генерации, даже если оно случайное, тогда вы всегда можете использовать это семя для возврата к этой карте.

 using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    using System;

    public class MapGenerator : MonoBehaviour {
        public int width;
        public int height;

        public string seed;
        public bool useRandomSeed;

        [Range(0,100)]
        public int randomFillPercent;
        int[,] map;

        private void Start()
        {
            GenerateMap();
        }

        void GenerateMap()
        {
            map = new int[width, height];
            RandomFillMap();

            for (int i = 0; i < 5; i++)
            {
                SmoothMap();
            }
        }
        void RandomFillMap()
        {
            if (useRandomSeed)
            {
                seed = Time.time.ToString();
            }
            System.Random prng = new System.Random(seed.GetHashCode());
            for (int x = 0; x < width; x++)
            {
                for (int y = 0; y < height; y++)
                {
                    if (x == 0 || x == width - 1 || y == 0 || y == height - 1)
                    {
                        map[x, y] = 1;
                    }
                    else
                    {
                        map[x, y] = (prng.Next(0, 100) < randomFillPercent) ? 1 : 0;
                    }
                }

            }
        }
        private void Update()
        {
            if (Input.GetMouseButtonDown(0))
            {
                GenerateMap();
            }
        }
        void SmoothMap()
        {
            for (int x = 0; x < width; x++)
            {
                for (int y = 0; y < height; y++)
                {
                    int neighborWallTiles = GetSurroundingWallCount(x, y);
                    if (neighborWallTiles > 4)
                    {
                        map[x, y] = 1;
                    }
                    else if (neighborWallTiles<4)
                    {
                        map[x, y] = 0;
                    }

                }
            }
                }

        int GetSurroundingWallCount(int gridx, int gridy)
        {
            int wallcount = 0;
            for(int neighborx=gridx-1; neighborx<=gridx + 1; neighborx++)
            {
                for (int neighbory = gridy - 1; neighbory <= gridy + 1; neighbory++)
                {
                    if (neighborx >= 0 && neighborx < width && neighbory >= 0 && neighbory < height)
                    {

                        if (neighborx != gridx || neighbory != gridy)
                        {
                            wallcount += map[neighborx, neighbory];
                        }
                    }
                    else
                    {
                        wallcount++;
                    }

                }
            }
            return wallcount;
        }

            void OnDrawGizmos()
            {
                if (map != null)
                {
                    for (int x = 0; x < width; x++)
                    {
                        for (int y = 0; y < height; y++)
                        {
                        Gizmos.color = (map[x, y] == 1) ? Color.black : Color.white;
                        Vector3 pos = new Vector3(-width / 2 + x + .5f, 0, -height / 2 + y + .5f);
                        Gizmos.DrawCube(pos, Vector3.one);
                        }
                    }
                }

        }

    }
...