架空地図生成ジェネレータもどき

アバター
大白定義
記事: 14
登録日時: 14年前
住所: 三重県

架空地図生成ジェネレータもどき

投稿記事 by 大白定義 » 14年前

ふと思いついて架空地図を生成するソフトが作りたくなり、それっぽいのをDXライブラリで弄り始めました。
架空地図ジェネレータ自体はvectorにあるのですが、架空地図の地図データをゲームに扱えたら素敵だと思ったんです。
まぁ、vectorにあるものは白黒のみにすることができるので、画像解析を使えばできないことはないと思いますがね。

とりあえずの処理の流れは
1、大陸の中心となる点を決定する
2、中心点から四方に点をランダムで伸ばす
という手順のみ。池や川はとりあえず保留です。

というわけで実験的に作ってみました。
ソースは以下のような感じです。マジックナンバーだらけなのは、まぁ、ね?(何

CODE:

#include "DxLib.h"
#include 
#include 
#include 

#define SCR_X	(640)
#define SCR_Y	(480)

#define LAND	(1)
#define SEA		(0)

#define LIMIT	(50)

int map[SCR_Y][SCR_X] = {0};

void makeMap(int x, int y, int num){
	if(map[y][x] == SEA) return;
	if(x  639) return;
	if(y  479) return;
	if(num >= LIMIT) return;

	srand((unsigned int)time(NULL));
	if(map[y-1][x] == SEA){
		if(rand()%100+1 >= 50){
			map[y-1][x] = LAND;
			makeMap(x, y-1, num+1);
		}
	}

	if(map[y][x+1] == SEA){
		if(rand()%100+1 >= 50){
			map[y][x+1] = LAND;
			makeMap(x+1, y, num+1);
		}
	}

	if(map[y+1][x] == SEA){
		if(rand()%100+1 >= 50){
			map[y+1][x] = LAND;
			makeMap(x, y+1, num+1);
		}
	}

	if(map[y][x-1] == SEA){
		if(rand()%100+1 >= 50){
			map[y][x-1] = LAND;
			makeMap(x-1, y, num+1);
		}
	}

	return;
}

int WINAPI WinMain(HINSTANCE hi, HINSTANCE hp, LPSTR lp, int ns){
	ChangeWindowMode(TRUE);
	if(DxLib_Init() == -1) return -1;

	map[240][320] = LAND;
	makeMap(320, 240, 0);
	for(int y=0; y<SCR_Y; y++){
		for(int x=0; x<SCR_X; x++){
			if(map[y][x] != SEA){
				DrawPixel(x, y, 0xffff);
			}
		}
	}
	WaitKey();

	DxLib_End();
	return 0;
}
実行結果がこちら
tizu.png
tizu.png (9.17 KiB) 閲覧数: 162 回
うまくできたのを出しましたが、何度かやってみると何故か三角形になったり、ただの線になったり。
ランダム周りも微妙に変な感じですし、もうちょっと改良していく必要がありますねえ。

アバター
大白定義
記事: 14
登録日時: 14年前
住所: 三重県

Re: 架空地図生成ジェネレータもどき

投稿記事 by 大白定義 » 14年前

ランダム生成する部分でsrandしてたら、そりゃあ同じ形ばかり出るわな、というお話でした。

アバター
Tatu
記事: 445
登録日時: 14年前

RE: 架空地図生成ジェネレータもどき

投稿記事 by Tatu » 14年前

この記事を見てなんとなく作ってみたくなったので作ってみました。
結果、こういう感じの画像が得られるプログラムができました。
無題.png
無題.png (59.79 KiB) 閲覧数: 112 回

コード
► スポイラーを表示

アバター
大白定義
記事: 14
登録日時: 14年前
住所: 三重県

Re: 架空地図生成ジェネレータもどき

投稿記事 by 大白定義 » 14年前

>Tatuさん
うおお…作りたかったものの形がそのまんま再現されている。
そうか、ランダムに領域を取って塗りつぶすという方法もあるか(違ったらごめんなさい)
参考になります。ありがとうございます。