Help with procedural generation (Cellular Automata)
So im experementing with making a 2d sanbox game kinda like terraria and i want to generate caves. I followed a guide and now i ended upp with script and and ive tried with what feels like every setting to make it work.
My goal is to generate somthing similar to this (without the ore ofc) :
But i just keep on getting results that look like this :
Should i i change the settings and if so, which ones? Or is it the code that needs to be changed? Heres what the code looks like :
void GenerateWorld()
{
//Preparations
width = worldSize.x;
height = worldSize.y;
bool[,] cellMap = new bool[width, height];
//Looping trough every tile and randomizing if its going to start out alive or dead;
for (int x = 0; x < width; x++){
for (int y = 0; y < height; y++){
if (Random.Range(1, 101) < ChanceToStartAlive){
cellMap[x, y] = true;
}
}
}
//Run the simulation for a set number of steps
for (int i = 0; i < numberOfSteps; i++)
{
cellMap = doSimulationStep(cellMap);
}
for (int x = 0; x < width; x++){
for (int y = 0; y < height; y++){
if (cellMap[x, y])
{
Instantiate(stonePrefab, new Vector2(x, y), Quaternion.Euler(0, 0, 90 * Random.Range(0, 5)));//, transform);
}
}
}
}
public bool[,] doSimulationStep(bool[,] oldMap)
{
bool[,] newMap = new bool[width, height];
//Count the neighbours that are alive
//Looping trought all tiles
for (int x = 0; x < width; x++){
for (int y = 0; y < height; y++)
{
//looping trought all neighbours of that tile
int neighbourCount = 0;
for (int i = -1; i < 2; i++) {
for (int j = -1; j < 2; j++) {
//If were looking att the middle
if (i == 0 && j == 0) {
//Do nothing, we dont want the middle to count as a neighbour
}
//In case were looking at the edge of the map... This step is optional but it helps so fill in the edges of the map
else if (x+i < 0 || y+j < 0 || x+i >= width || y+j >= height) {
neighbourCount += 1;
}
//Otherwise, do a normal check for neighbour
else if (oldMap[x+i, y+j]) {
neighbourCount += 1;
}
}
}
//Killing and giving birth to tiles based on the simulation rules
//If a cell is alive but has too few neighbours, Kill it
if (oldMap[x, y]) {
if (neighbourCount < deathLimit) {
newMap[x, y] = false;
}
else {
newMap[x, y] = true;
}
}//Otherwise (if the cell is dead) check if it has the right number of neighbours to be born.
else {
if (neighbourCount > birthLimit) {
newMap[x, y] = true;
}
else {
newMap[x, y] = false;
}
}
}
}
return newMap;
}
private void Start()
{
GenerateWorld();
}
Your answer
Follow this Question
Related Questions
[SOLVED] Problems creating a Sprite through script 0 Answers
Randomly generated 2D hills 1 Answer
C# 2D Top down game how to detect if objects are touching while they can pass through each other? 1 Answer
Bounds.Intersects returns false while collision still works? 1 Answer
Player.cs erroring out for Roguelike tutorial in Unity v5.4 2 Answers