迷路

2003/6/17作成

迷路

迷路
画面サンプル

迷路を自動的に作成します。

迷路を作成するアルゴリズムは壁伸ばし法というものを使っています。迷路を作成するには他にも穴掘り法や壁倒し法などがあります。ソースコードはifが多くて読みにくいですが、やっている事は単純で4方向について壁が既に存在するかどうかをチェックしているだけです。

プログラム


/********************************************************/
/*  外側の壁作成                                        */
/********************************************************/

locate( 0, 0 );
printstr( "@@@@@@@@@@@@@@@\n" );
printstr( "@             @\n" );
printstr( "@             @\n" );
printstr( "@             @\n" );
printstr( "@             @\n" );
printstr( "@             @\n" );
printstr( "@             @\n" );
printstr( "@             @\n" );
printstr( "@             @\n" );
printstr( "@             @\n" );
printstr( "@@@@@@@@@@@@@@@" );


/********************************************************/
/*  ランダム壁作成                                      */
/********************************************************/

while( 1 ) {
    a = rnd( 14 * 9 );
    x = 2;  y = 2;
    while( a >= 0 ) {
        if( scan( x, y ) == '@' )
            goto    skip;

        // 下
        if( scan( x, y - 2 ) == '@' && scan( x + 1, y ) != '@' && scan( x + 1, y + 1 ) != '@' && scan( x, y + 1 ) != '@' && scan( x - 1, y + 1 ) != '@' && scan( x - 1, y ) != '@' ) {
            if( a == 0 ) {
                locate( x, y - 1 );
                printstr( "@" );
                locate( x, y );
                printstr( "@" );
            }
            a--;
            goto    skip;
        }

        //  右
        if( scan( x - 2, y ) == '@' && scan( x, y - 1 ) != '@' && scan( x + 1, y - 1 ) != '@' && scan( x + 1, y ) != '@' && scan( x + 1, y + 1 ) != '@' && scan( x, y + 1 ) != '@' ) {
            if( a == 0 ) {
                locate( x - 1, y );
                printstr( "@" );
                locate( x, y );
                printstr( "@" );
            }
            a--;
            goto    skip;
        }

        //  上
        if( scan( x, y + 2 ) == '@' && scan( x + 1, y ) != '@' && scan( x + 1, y - 1 ) != '@' && scan( x, y - 1 ) != '@' && scan( x - 1, y - 1 ) != '@' && scan( x - 1, y ) != '@' ) {
            if( a == 0 ) {
                locate( x, y + 1 );
                printstr( "@" );
                locate( x, y );
                printstr( "@" );
            }
            a--;
            goto    skip;
        }

        //  左
        if( scan( x + 2, y ) == '@' && scan( x, y - 1 ) != '@' && scan( x - 1, y - 1 ) != '@' && scan( x - 1, y ) != '@' && scan( x - 1, y + 1 ) != '@' && scan( x, y + 1 ) != '@' ) {
            if( a == 0 ) {
                locate( x + 1, y );
                printstr( "@" );
                locate( x, y );
                printstr( "@" );
            }
            a--;
            goto    skip;
        }

        skip:
        x += 2;
        if( x >= 15 ) {
            x = 2;  y += 2;
        }
        if( y >= 10 )
            y = 2;
    }

    wait( 500 );
}

ダウンロード

maze.zip

改良案

このプログラムでは手抜きな事に、迷路の完成チェックを省いているのでいつまでたっても終わりません。完成チェックを付け加えるのは簡単ですが、さてどうやればいいでしょう。

文字で迷路を作ったので15*11という大きさになってしまいますが、ドットで作れば127*87という大きさまで作る事が出来ます。注意しないといけないのは、壁と壁の間に通路が出来る都合上、迷路の大きさは必ず奇数×奇数になる事です。

迷路が出来上がったら、キャラクタを操作してスタートからゴールまで歩くようにすればゲームになります。