謎のグラフっぽい何か

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

謎のグラフっぽい何か

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

またシレン風の何かが作りたくなり、設計も考えず、かるーい気持ちでさくっとランダムダンジョンを作る処理を書いてみたんですよ。
ソースは↓みたいな感じです(相変わらずコメントが無いので見づらいです。読み飛ばし安定)

CODE:

//h_map.h

//移動できるかどうか
#define CAN_MOVE		(1)
#define CANNOT_MOVE		(0)

//乗ると何が起こるか
#define GET_NONE		(0)
#define GET_DAMAGE		(1)
#define GET_LIFE		(2)
//イベントの場合、xにイベントID
#define GET_EVENT(x)	(100+x)

//エリアの最低サイズ
#define AREA_UNDERLIMIT	(5)

//最大値検出マクロ
#define MAX(a,b)		(((a)>(b))?(a):(b))
#define MIN(a,b)		(((a)
#include 
#include 
#include 

#include "h_maps.h"

int GetRandom(int min,int max){
	return min + (int)(rand()*(max-min+1.0)/(1.0+RAND_MAX));
}

TIPTYPE MakeTipType(int m, int g){
	TIPTYPE tiptype;
	
	tiptype.gets = g;
	tiptype.move = m;

	return tiptype;
}

TIP MakeTip(int m, int g, int s, int c){
	TIP tip;
	
	tip.type = MakeTipType(m, g);
	tip.set = s;
	tip.chara = c;
	
	return tip;
}

AREA MakeArea(int lux, int luy, int rdx, int rdy){
	AREA area;

	if(abs(lux - rdx) <= AREA_UNDERLIMIT){
		area.leftup_x = lux;
		area.rightdown_x = rdx;
	}
	else{
		int x1, x2;
		do{
				x1 = GetRandom(lux, rdx);
				x2 = GetRandom(lux, rdx);
		}while(abs(x1 - x2) <= AREA_UNDERLIMIT);

		area.leftup_x = MIN(x1, x2);
		area.rightdown_x = MAX(x1, x2);
	}

	if(abs(luy - rdy) <= AREA_UNDERLIMIT){
		area.leftup_y = luy;
		area.rightdown_y = rdy;
	}
	else{
		int y1, y2;
		do{
				y1 = GetRandom(luy, rdy);
				y2 = GetRandom(luy, rdy);
		}while(abs(y1 - y2) <= AREA_UNDERLIMIT);
		
		area.leftup_y = MIN(y1, y2);
		area.rightdown_y = MAX(y1, y2);
	}

	return area;
}

MAP MakeMap(int w, int h){
	int i, j, k;
	MAP map;

	map.height = h;
	map.width = w;
	map.tips = new TIP*[h];
	for(i=0;i<h;i++){
		map.tips[i] = new TIP[w];
	}
	for(i=0;i<h;i++){
		for(j=0;j<w;j++){
			map.tips[i][j] = MakeTip(CANNOT_MOVE, GET_NONE, 0, 0);
		}
	}

	srand((unsigned int)time(NULL));
	int xdiv = GetRandom(1, w / AREA_UNDERLIMIT);
	int ydiv = GetRandom(1, h / AREA_UNDERLIMIT);
	map.area_num = xdiv*ydiv;
	map.area = new AREA[map.area_num];
	int xdiv_size = w / xdiv;
	int ydiv_size = h / ydiv;

	k = 0;
	for(i=0;i<xdiv;i++){
		for(j=0;j<ydiv;j++){
			int lux = (j * xdiv_size) + 1;
			int luy = (i * ydiv_size) + 1;
			int rdx = lux + xdiv_size - 1;
			int rdy = luy + ydiv_size - 1;
			map.area[k] = MakeArea(lux, luy, rdx, rdy);
			k++;
		}
	}

	for(i=0;i<map.area_num;i++){
		for(j=map.area[i].leftup_y;j<map.area[i].rightdown_x;j++){
			for(k=map.area[i].leftup_x;k<map.area[i].rightdown_x;k++){
				map.tips[k][j] = MakeTip(CAN_MOVE, GET_NONE, 0, 0);
			}
		}
	}

	return map;
}

void DestMap(MAP map){
	int i=0;

	delete[] map.area;

	for(i=0;i<map.height;i++){
		delete[] map.tips[i];
	}
	delete[] map.tips;
}

void DrawMap(MAP map){
	int i, j;
	for(i=0;i<map.height;i++){
		for(j=0;j<map.width;j++){
			if(map.tips[i][j].type.move == CANNOT_MOVE) printf("#");
			else printf(".");
		}
		printf("\n");
	}
}

CODE:

//main.cpp

#include "h_maps.h"

int main(){
	MAP m = MakeMap(50, 50);
	DrawMap(m);
	DestMap(m);
}
で、実行結果がこちら。

CODE:

##################################################
#....#############################################
#....#############################################
#....#############################################
#....#############################################
##################################################
#.........########################################
#.........########################################
#.........########################################
#.........########################################
##################################################
#..............###################################
#..............###################################
#..............###################################
#..............###################################
##################################################
#...................##############################
#...................##############################
#...................##############################
#...................##############################
##################################################
#........................#########################
#........................#########################
#........................#########################
#........................#########################
##################################################
#.............................####################
#.............................####################
#.............................####################
#.............................####################
##################################################
#..................................###############
#..................................###############
#..................................###############
#..................................###############
##################################################
##################################################
##################################################
##################################################
##################################################
##################################################
##################################################
##################################################
##################################################
##################################################
##################################################
##################################################
##################################################
##################################################
##################################################
なんじゃこりゃ!
(ランダムなので色々変わりますが、大体こんな感じに表示されます)

なんだかグラフっぽい何かが生成されるようになっちゃいました。

うーん、何が原因なんだろう。
最後に編集したユーザー 大白定義 on 2011年11月27日(日) 15:54 [ 編集 1 回目 ]

コメントはまだありません。