はじめまして、yamaっていいます。
ここで、質問するのは初めてなんですがよろしくお願いします。
いま、学校の課題で、テキストRPG(DOS窓上での)を作っているのですが、そのダンジョン部分を不思議のダンジョンみたいなランダムダンジョンにしようと思ってがんばっていたのですが、通路生成の部分がうまくいきません。
使用言語はCのみでC++はダメなようです。
以下ソースです。
#include<stdio.h>
#include<windows.h>
#include<time.h>
#include<stdlib.h>
#define W 35
#define H 20
#define MH 4
#define MW 4
#define MAXROOM 4
int main(void)
{
int i, j, k, l, roomvalue, miti, door;
int map[H][W];
RECT *room;
srand((unsigned int)time(NULL));
roomvalue = rand() % MAXROOM + 4;
room = (RECT *)malloc(sizeof(RECT) * roomvalue);
for(i = 0; i < H; i++)
{
for(j = 0; j < W; j++)
map[j] = 0;
}
for(i = 0; i < roomvalue; i++)
{
room.left = rand() % 28;
room.top = rand() % 13;
room.right = room.left + rand() % MW + 3;
room.bottom = room.top + rand() % MH + 3;
for(j = 0; j < i; j++)
{
if(room.left <= room[j].right + 1 && room.right >= room[j].left - 1 && room.top <= room[j].bottom + 1 && room[i].bottom >= room[j].top - 1 )
{
i--;
break;
}
}
}
for(i = 0; i < roomvalue; i++)
{
for(j = room[i].top; j <= room[i].bottom; j++)
{
for(k = room[i].left; k <= room[i].right; k++)
{
map[j][k] = i + 1;
}
}
}
for(i = 0; i < roomvalue; i++)
{
for(l = 0; l < 5; l++)
{
miti = rand() % 4;
if(miti == 0)
{
door = rand() % (room[i].bottom - room[i].top) + room[i].top;
for(j = door, k = room[i].left - 1; k >= 0 && !(map[j][k] >= 1 && map[j][k] <= 10); k--)
{
map[j][k] = 10;
}
}
else if(miti == 1)
{
door = rand() % (room[i].right - room[i].left) + room[i].left;
for(j = room[i].top - 1, k = door; j >= 0 && !(map[j][k] >= 1 && map[j][k] <= 10); j--)
{
map[j][k] = 10;
}
}
else if(miti == 2)
{
door = rand() % (room[i].bottom - room[i].top) + room[i].top;
for(j = door, k = room[i].right + 1; k < 35 && !(map[j][k] >= 1 && map[j][k] <= 10); k++)
{
map[j][k] = 10;
}
}
else if(miti == 3)
{
door = rand() % (room[i].right - room[i].left) + room[i].left;
for(j = room[i].bottom + 1, k = door; j < 20 && !(map[j][k] >= 1 && map[j][k] <= 10); j++)
{
map[j][k] = 10;
}
}
}
}
for(i = 0; i < H; i++)
{
for(j = 0; j < W; j++)
{
switch(map[i][j])
{
case 0:
printf("#");//通路
break;
case 1:
case 2:
case 3:
case 4:
case 5:
case 6:
case 7:
case 8:
printf("?");//部屋
break;
case 10:
printf("+");//壁
break;
}
}
putchar('\n');
}
return 0;
}
部屋の生成はシューティングの当たり判定を利用して、重ならないようにずらして配置できます。
ですが、通路は画面外の壁にぶつかる、ほかの通路とぶつかる等でないと止まりません。
サイトを参考にがんばってみたのですが、やはり、難しいです。
参考サイトは
http://cat.zero.ad.jp/~zau37982/wwa/doja/005.htm
http://www.asahi-net.or.jp/~kh4s-smz/mi ... andom.html
http://racanhack.sourceforge.jp/rhdoc/index.html
です。このうち、三番目のサイトのglibはCに変換しようとがんばっていたのですが、途中で挫折してしまいました。
どうか、よろしくお願いします。
ランダムダンジョンの生成方法について・・・
Re:ランダムダンジョンの生成方法について・・・
良い方法かどうかは分からないので例えば…ですが、部屋の出入口となる座標を先に決めてやって、そこへ向かって通路を伸ばしてやる…なんていう方法はいかがでしょうか?