http://gamedevelopment.tutsplus.com/tutorials/generate-random-cave-levels-USE-cellular-automata--gamedev-9664
đây là phiên bản của tôi về phương thức automata di động bắt đầu bằng cách điền vào lưới một cách ngẫu nhiên sau đó chạy các quy tắc automata cullular này trên nó một vài lần
- Nếu một tế bào sống có ít hơn hai hàng xóm sống, nó sẽ chết.
- Nếu một tế bào sống có hai hoặc ba hàng xóm sống, nó vẫn sống.
- Nếu một tế bào sống có nhiều hơn ba hàng xóm sống, nó sẽ chết.
- Nếu một tế bào chết có chính xác ba hàng xóm sống, nó sẽ trở nên sống động.
và nó trông giống như một cái hang
chỉ mục có thể được chuyển đổi sang vị trí x & y và quay lại với mã nà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);
}
Tôi chỉ trả về một danh sách các bool vì tôi sử dụng danh sách này cho nhiều thứ: hang, cây, hoa, cỏ, sương mù, nước thậm chí bạn có thể kết hợp nhiều danh sách theo nhiều cách khác nhau ở đây trước tiên tôi loại bỏ tất cả các hang nhỏ hơn sau đó kết hợp hai danh sách ngẫu nhiên
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;
}