マップランダム生成


どっかで見かけたフラクタルの書き方をちょっと弄ってぐにゃぐにゃしてみたけど砂漠みたいなマップしかできねぇ…

//DMD0.155
import std.math;
import std.random;

void makeMt(ubyte[] map, int fx, int fy, int tx, int ty, int deep, int w, int rn){
	if(deep >= 4)printf("makeMt : %d\n", deep);
	void zure(int x,int y){
		if(rn/2 > 0){
			map[x+y*w] = map[x+y*w] + cast(ubyte)((rand()%rn) - rn/2);
		}
	}
	
	if(deep == 0){
		//残りの部分を埋める作業
		assert(tx-fx != 0);
		assert(ty-fy != 0);
		
		double rx = (tx-fx);
		double ry = (ty-fy);
		for(int x=fx; x<=tx; x++){
			for(int y=fy; y<=ty; y++){
				map[x+y*w] = cast(ubyte)(
						  map[fx+fy*w] * (tx-x)/rx * (ty-y)/ry
						+ map[tx+fy*w] * (x-fx)/rx * (ty-y)/ry
						+ map[fx+ty*w] * (tx-x)/rx * (y-fy)/ry
						+ map[tx+ty*w] * (x-fx)/rx * (y-fy)/ry);
			}
		}
	}else{
		//四分割
		int mx = (fx+tx)/2;
		int my = (fy+ty)/2;
		if(fx == 0 && fy==0){
			zure(fx,fy);
		}
		if(fx==0){
			zure(fx,my);
			zure(fx,ty);
		}
		if(fy==0){
			zure(mx,fy);
			zure(tx,fy);
		}
		zure(mx,my);
		zure(mx,ty);
		zure(tx,my);
		zure(tx,ty);
		
		deep--;
		rn = rn * 3 / 4;
		makeMt(map,fx,fy,mx,my,deep,w,rn);
		makeMt(map,mx,fy,tx,my,deep,w,rn);
		makeMt(map,fx,my,mx,ty,deep,w,rn);
		makeMt(map,mx,my,tx,ty,deep,w,rn);
	}
}