迷路2


※上記の広告は60日以上更新のないWIKIに表示されています。更新することで広告が下部へ移動します。

迷路のプログラムです。(未完成)

かな~り前ですが、迷路1をうpしたと思います。
      • あれ、消しました。

んで、ちょいとやり方を変えて区画分割で作成し直しました。
まだ、完成度50%で微妙なんですが一応うpします。

それにしても、汎用化しないと使い物にならない・・・ハァ
ここまで、プログラムのセンスがないといっそ清清しいw

いつものように記事にソースコードはっつけるの面倒なんでwikiに置いておきます。


//#include ".h"
#include <cstdlib>	// srand, rand使用
#include <ctime>	// time使用
#include <iostream>

extern const int g_width = 30;
extern const int g_height = 30;
bool g_map[g_width][g_height];
 
struct Rect
{
	// xの始点
	int x;
 
	// yの始点
	int y;
 
	// 横幅
	int width;
 
	// 縦幅
	int height;
};
 
int main( int argc, char* args[] )
{
	// 乱数の種を設定
	srand( (unsigned)time( NULL ) );
 
	// マップ初期化
	for( int i = 0; i < g_width; ++i )
	{
		for( int j = 0; j < g_height; ++j )
		{
			g_map[i][j] = false;
		}
	}
 
	// 区画を初期化
	const int partition_size = 4;
	Rect partition[partition_size];
	for( int i = 0; i < partition_size; ++i )
	{
		partition[i].x = 0;
		partition[i].y = 0;
		partition[i].width = g_width;
		partition[i].height = g_height;
	}
 
	// 縦に分割する
	partition[0].width = partition[0].width / 2;
	partition[1].x = partition[0].width;
	partition[1].y = partition[0].y;
	partition[1].width = partition[0].width;
	partition[1].height = partition[0].height;
 
	// 横に分割する
	partition[0].height = partition[0].height / 2;
	partition[2].x = partition[0].x;
	partition[2].y = partition[0].height;
	partition[2].height = partition[0].height;
	partition[2].width = partition[0].width;
 
	// 横に分割する
	partition[1].height = partition[1].height / 2;
	partition[3].x = partition[1].x;
	partition[3].y = partition[1].height;
	partition[3].height = partition[1].height;
	partition[3].width = partition[1].width;
 
	// 分割の確認
	for( int i = 0; i < partition_size; ++i )
	{
		std::cout << "partition" << i;
		std::cout << "(" << partition[i].x << ",";
		std::cout << partition[i].y << ",";
		std::cout << partition[i].width << ",";
		std::cout << partition[i].height << ")";
		std::cout << std::endl;
	}
 
	// mapに区画を追加
	for( int i = 0; i < partition_size; ++i )
	{
		// 縦
		for( int j = 0; j < partition[i].height; ++j )
		{
			//
			if( partition[i].x != 0 )
			{
				g_map[partition[i].y+j][partition[i].x] = true;
			}
		}
		// 横
		for( int j = 0; j < partition[i].width; ++j )
		{
			//
			if( partition[i].y != 0 )
			{
				g_map[partition[i].y][partition[i].x+j] = true;
			}
		}
	}
 
	// 部屋の生成
	Rect room[partition_size];
	const int room_size = 5;
	for( int i = 0; i < partition_size; ++i )
	{
		room[i].x = partition[i].x + (rand() % room_size + 2);
		room[i].y = partition[i].y + (rand() % room_size + 2);
		room[i].width = room_size;
		room[i].height = room_size;
	}
 
	// mapに部屋を追加
	for( int i = 0; i < partition_size; ++i )
	{
		for( int j = 0; j < room[i].height; ++j )
		{
			for( int k = 0; k < room[i].width; ++k )
			{
				g_map[room[i].y+j][room[i].x+k] = true;
			}
		}
	}
 
	// mapに通路を追加(要修正)
	for( int i = 0; i < partition_size; ++i )
	{
		if( partition[i].x < partition[i].width )
		{
			for( int j = 0; g_map[room[i].y][room[i].x+room[i].width+j] == false; ++j )
			{
				g_map[room[i].y][room[i].x+room[i].width+j] = true;
			}
		}
		else
		{
			// 初期値1は部屋のtrueを回避用
			for( int j = 1; g_map[room[i].y][room[i].x-j] == false; ++j )
			{
				g_map[room[i].y][room[i].x-j] = true;
			}
		}
	}
 
	// 分割の確認
	for( int i = 0; i < partition_size; ++i )
	{
		std::cout << "room" << i;
		std::cout << "(" << room[i].x << ",";
		std::cout << room[i].y << ",";
		std::cout << room[i].width << ",";
		std::cout << room[i].height << ")";
		std::cout << std::endl;
	}
 
	// マップの内容を表示する
	for( int i = 0; i < g_width; ++i )
	{
		for( int j = 0; j < g_height; ++j )
		{
			// 通過可能か判定
			if( g_map[i][j] ) { std::cout << "."; }// 通路
			else { std::cout << "#"; }// 壁
		}
		std::cout << std::endl;
	}
 
	return 0;
}
 


ツールボックス

下から選んでください:

新しいページを作成する
ヘルプ / FAQ もご覧ください。