Update
This commit is contained in:
parent
dfc4a5d61b
commit
45ef176b13
5 changed files with 117 additions and 4 deletions
108
procgen.md
108
procgen.md
|
@ -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
|
Loading…
Add table
Add a link
Reference in a new issue