http://gamedevelopment.tutsplus.com/tutorials/generate-random-cave-levels-using-cellular-automata--gamedev-9664
यहाँ सेलुलर ऑटोमेटा पद्धति का मेरा संस्करण ग्रिड को यादृच्छिक रूप से भरने के द्वारा शुरू होता है, फिर उस पर इन कुंडलाकार ऑटोमेटा नियमों को एक दो बार चलाएं
- यदि एक जीवित कोशिका में दो जीवित पड़ोसी कम हैं, तो यह मर जाता है।
- यदि एक जीवित कोशिका में दो या तीन जीवित पड़ोसी होते हैं, तो यह जीवित रहता है।
- यदि एक जीवित कोशिका में तीन से अधिक जीवित पड़ोसी होते हैं, तो यह मर जाता है।
- यदि एक मृत कोशिका में तीन जीवित पड़ोसी होते हैं, तो यह जीवित हो जाता है।
और यह गुफा की तरह दिखाई देता है
सूचकांक को x और y स्थिति में और इस कोड के साथ वापस परिवर्तित किया जा सकता है
public int TileIndex(int x, int y)
{
return y * Generator.Instance.Width + x;
}
public Vector2 TilePosition(int index)
{
float y = index / Generator.Instance.Width;
float x = index - Generator.Instance.Width * y;
return new Vector2(x, y);
}
मैं सिर्फ बस्ट की एक सूची वापस करता हूं क्योंकि मैं कई चीजों के लिए इस सूची का उपयोग करता हूं: गुफाएं, पेड़, फूल, घास, कोहरे, पानी आप यहां तक कि कई सूचियों को अलग-अलग तरीकों से जोड़ सकते हैं मैं पहले सभी छोटी गुफाओं को हटाता हूं फिर दो यादृच्छिक सूचियों का संघटन करता हूं
private int GetAdjacentCount(List<bool> list, Vector2 p)
{
int count = 0;
for (int y = -1; y <= 1; y++)
{
for (int x = -1; x <= 1; x++)
{
if (!((x == 0) && (y == 0)))
{
Vector2 point = new Vector2(p.x + x, p.y + y);
if (PathFinder.Instance.InsideMap(point))
{
int index = PathFinder.Instance.TileIndex(point);
if (list[index])
{
count++;
}
}
else
{
count++;
}
}
}
}
return count;
}
private List<bool> GetCellularList(int steps, float chance, int birth, int death)
{
int count = _width * _height;
List<bool> list = Enumerable.Repeat(false, count).ToList();
for (int y = 0; y < _height; y++)
{
for (int x = 0; x < _width; x++)
{
Vector2 p = new Vector2(x, y);
int index = PathFinder.Instance.TileIndex(p);
list[index] = Utility.RandomPercent(chance);
}
}
for (int i = 0; i < steps; i++)
{
var temp = Enumerable.Repeat(false, count).ToList();
for (int y = 0; y < _height; y++)
{
for (int x = 0; x < _width; x++)
{
Vector2 p = new Vector2(x, y);
int index = PathFinder.Instance.TileIndex(p);
if (index == -1) Debug.Log(index);
int adjacent = GetAdjacentCount(list, p);
bool set = list[index];
if (set)
{
if (adjacent < death)
set = false;
}
else
{
if (adjacent > birth)
set = true;
}
temp[index] = set;
}
}
list = temp;
}
if ((steps > 0) && Utility.RandomBool())
RemoveSmall(list);
return list;
}