[Author Prev][Author Next][Thread Prev][Thread Next][Author Index][Thread Index]

Re: [pygame] Random Terrain Generator



Nice screenshot. Is that multiple runs of the terrain generator tiled, or one run?

Thanks. The screenshot is one run of another program making the generator run repeatedly, then applying a texture heightmap (like, anything in a certain height range is blue), then blitting the little maps into a big surface and saving it.



JoN wrote:
By the way -

Given the same input parameters will it generate the same terrain every time, or
is it random ?

Yes. 8)

It uses the function random.randint(), so the numbers involved are as random as you can get with a computer... but by calling random.seed(), you can feed the number generator some data and get the same terrain every time.

In the screenshot:
http://kschnee.xepher.net/pics/061025skygold.jpg
You can see what happened when I called seed() using the X,Y coordinates of a game-world "zone," on the theory that every time you visited zone (4,2) it'd be the same even though it's "random." But I found there was this weird repetition. Looking into it, I found that seed() was calling hash(), and that (say) the values (1,-1) and (1,-2) had the same hash value, causing copies of the same islands to get generated. Not good. The solution hashed out was to mess with the data some more, to be relatively sure of getting unique hash values for each coordinate pair. The result was this:
http://kschnee.xepher.net/pics/061025skygold2.jpg
Which has no obvious repetition. Still, there's an obvious grid of similarly-sized islands. I tried making bigger zones and found that my algorithm wasn't very well suited to the 300x300 size, and that it still gave me an obvious grid. So, what I'm thinking of doing now is to make some zones more flooded than others, so that some have little or no land, reducing the sameness of the world and creating more water areas instead of the street-like NSEW waterways seen above. Another option would be to somehow alternate semi-randomly between big zones (2x2, 3x3) and little ones, or to semi-randomly switch between algorithms.


I made this partly in reaction to traditional random dungeon games, which I dislike (except for "Disgaea!"). By using a seed function it's possible to avoid the problem that everybody's game is different. I made fun of the randomness in an article on RPGamer.com:
http://www.rpgamer.com/editor/2001/q3/070601ks.html


By the way, I did a couple of random-content generators using Python and CGI, here:
http://kschnee.xepher.net/generators.htm


Kris