This commit is contained in:
Miloslav Ciz 2023-12-05 03:47:28 +01:00
parent dfc4a5d61b
commit 45ef176b13
5 changed files with 117 additions and 4 deletions

View file

@ -215,4 +215,112 @@ int main(void)
}
```
Now let's take a look at some iterative algorithm: an extremely simple dungeon generator. All it's going to do is just randomly choose a cardinal direction (up, right, down, left), draw a line of random length, and repeat the same from the line's endpoint, until predefined number of lines has been drawn. Here is the C code:
```
#include <stdio.h>
#define W 30 // world width
#define H 30 // world height
char world[H * W]; // 2D world array
unsigned int r = 12345; // random seed here
unsigned int random()
{
r = r * 321 + 29;
return r >> 4;
}
void generateWorld()
{
int steps = 100; // draw this many lines
int pos = 0;
int add = 1; // movement offset
int nextLineIn = 1;
for (int i = 0; i < H * W; ++i)
world[i] = ' ';
while (steps)
{
world[pos] = 'X';
nextLineIn--;
int nextPos = pos + add;
if (nextPos < 0 || nextPos >= W * H || // going over world edge?
(add == 1 && nextPos % W == 0) ||
(add == -1 && nextPos % W == W - 1))
nextLineIn = 0;
else
pos = nextPos;
if (nextLineIn <= 0)
{
steps--;
nextLineIn = W / 5 + random() % (W / 3);
add = (random() & 0x10) ? W : 1;
if (rand() & 0x80)
add *= -1;
}
}
}
int main(void)
{
generateWorld();
for (int i = 0; i < H * W; ++i) // draw
{
char c = world[i];
putchar(c);
putchar(c);
if ((i + 1) % W == 0)
putchar('\n');
}
return 0;
}
```
And here is one possible output of the program:
```
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXX XXXX XX XXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXX XXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXX XXXX XX XX XXXX XX XX X
XXXX XXXX XX XX XXXX XX XX X
XXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XX X
XXXX XXXX XX XX XX XXXX XX XX X
XXXX XXXX XX XX XX XXXX XX X
XXXX XXXX XX XX XX XXXX XX X
XXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX X
XX XX XX XX XX XXXX XX X
XX XX XX XX XX XXXX XX X
XXXXXXXXXXXXXX XX XX XXXX X
XX XX XX XX XX XXXX X
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX X
XXXXXXXXXXXXXXXXXXXXXX XX X
XX XX XX XX XX X
XX XX XX XX XX X
XX XX XX XX XX X
XX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX X
XX XX XX XX XX X
XX XX XX XX XX X
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX X
XX XX XX XX XX XX X
XX XX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XX XX XX XX XX XX X
XX XX XX XXXXXXXXXXXXXXXXXXXXXXXXXXX
XX XX XX XX
XX XX XX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XX
```
TODO: some example with noise