掲示板ランキング  靴下・ストッキング(かかとケア用靴下)


掲示板利用宣言

 次のフォームをすべてチェックしてからご利用ください。

 私は

 題名と投稿者名は具体的に書きます。
 課題の丸投げはしません。
 ソースの添付は「HTML変換ツール」で字下げします。
 返信の引用は最小限にします。
 環境(OSとコンパイラ)や症状は具体的に詳しく書きます。
 返信の付いた投稿は削除しません。
 マルチポスト(多重投稿)はしません。

掲示板1

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    記事検索    ログ    タグ一覧

No.6998

ランダムで作成する棒倒し法迷路
投稿者---るる(2007/01/14 01:25:12)


棒倒し法でランダムに迷路を作成するプログラムです。

簡単だと聞いて挑戦してみたのですが、まだ力不足だったようです。
問題点の指摘、お願いします。


環境:WinXP Borland C++

#include<stdio.h>
#include<time.h>
#include<stdlib.h>

//道か壁かの判定用
#define ROAD    0      //道
#define WALL    1      //壁

#define FIELD   13

//穴を掘るための判定用:ランダムでどこに進むか決める
#define UP  0  //上
#define RIGHT   1    //右
#define UNDER   2    //下
#define LEFT    3      //左

int main(void)
{
    int i, j, k;
    int field[FIELD][FIELD];
        
    
    for(i = 0; i < FIELD; i++)
    {
        for(j = 0; j < FIELD; j++)
        {
            //初期化。一旦全て壁になる
            field[i][j] = ROAD; //全部を道にします
            
            //最外周を壁にします
            field[0][j] = WALL;   //最左
            field[FIELD-1][j] = WALL;   //最右
            field[i][0] = WALL;   //最上
            field[i][FIELD-1] = WALL;   //最下
            
            //(偶数,偶数)の座標を壁にします
            if(i % 2 == 0 && j % 2 == 0){
            field[i][j] = WALL;   //最左
            }
        }
    }
    
//------------------------------------------------棒倒し処理

    for(i = 0; i < FIELD; i++)
    {
        for(j = 0; j < FIELD; j++)
        {
            srand((unsigned)time(NULL));
            if(i == 2)
            {
                k = rand() % 3;
            }
            else{
                k = rand() % 5;
            }
            switch(k)
            {
                case UP:
                    if(field[i - 1][j] == WALL)
                    {
                        k = rand() % 3;
                    }
                    else
                    {
                        field[i - 1][j] = ROAD;
                    }
                    break;
                case RIGHT:
                    if(field[i][j + 1] == WALL)
                    {
                        k = rand() % 3;
                    }
                    else
                    {
                        field[i][j + 1] = ROAD;
                    }
                    break;
                case UNDER:
                    if(field[i + 1][j] == WALL)
                    {
                        k = rand() % 3;
                    }
                    else
                    {
                        field[i + 1][j] = ROAD;
                    }
                    break;
                case LEFT:
                    if(field[i][j - 1] == WALL)
                    {
                        k = rand() % 3;
                    }
                    else
                    {
                        field[i][j - 1] = ROAD;
                    }
                    break;
            }
        }
    }
    
//---------------------------------------------------
    
    //表示
    for(i = 0; i < FIELD; i++)
    {
        for(j = 0; j < FIELD; j++)
        {
            if(field[i][j] == WALL)
            {
                printf("■");
            }
            if(field[i][j] == ROAD)
            {
                printf("  ");
            }
        }
        printf("\n");
    }
    return 0;
}



この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:ランダムで作成する棒倒し法迷路 6999 kolona 2007/01/14 02:34:48


No.6999

Re:ランダムで作成する棒倒し法迷路
投稿者---kolona(2007/01/14 02:34:48)


>棒倒し法でランダムに迷路を作成するプログラムです。

2つ、問題が見つかりました。ひとつは
srand((unsigned)time(NULL));
の位置です。
このプログラムでは、for文の中で、srand()により乱数の種を設定しています。
しかし、これだと生成される関数は全て同じになります。
何故かというと、time()関数は秒数を返すため、for文が1秒以内に回ると同じ値を毎回返すからです。
この秒数で設定された乱数の1個目を使うので、1秒以内に終了すれば乱数は全て同じです。
乱数の初期化は処理の前の1回だけでいいと思います。

それから、棒倒し法は壁を作っていくアルゴリズムらしいですから、
field[i][j + 1] = ROAD;
は違うと思います。穴掘り法とごっちゃになってませんか?

それと、棒倒し法の、壁を作りたい場所が既に壁だったときの処理はどうするんでしょうか?
見たとこ、既に壁だったときの処理として乱数を新たに生成していますが、
別の位置を探すならjをデクリメントして、再評価しないといけません。


この投稿にコメントする

削除パスワード

No.7010

Re:ランダムで作成する棒倒し法迷路
投稿者---るる(2007/01/16 21:08:58)


kolona様、ご指摘ありがとうございます。

ご指摘頂いた点を直したのですが、何度コンパイルしても実行されなくなりました。(コンパイルは通るのですが。。。)







#include<stdio.h>
#include<time.h>
#include<stdlib.h>

//道か壁かの判定用
#define ROAD    0      //道
#define WALL    1      //壁

#define FIELD   13

//穴を掘るための判定用:ランダムでどこに進むか決める
#define UP  0  //上
#define RIGHT   1    //右
#define UNDER   2    //下
#define LEFT    3      //左

int main(void)
{
    int i, j, k;
    int field[FIELD][FIELD];
            
    for(i = 0; i < FIELD; i++)
    {
        for(j = 0; j < FIELD; j++)
        {
            //初期化。
            field[i][j] = ROAD; //全部を道にします
            
            //最外周を壁にします
            field[0][j] = WALL;   //最左
            field[FIELD-1][j] = WALL;   //最右
            field[i][0] = WALL;   //最上
            field[i][FIELD-1] = WALL;   //最下
            
            //(偶数,偶数)の座標を壁にします
            if(i % 2 == 0 && j % 2 == 0){
                field[i][j] = WALL;
            }
        }
    }
    
//------------------------------------------------棒倒し処理
    srand((unsigned)time(NULL));
    for(i = 0; i < FIELD; i++)
    {
        for(j = 0; j < FIELD; j++)
        {
            if(i == 2)
            {
                k = rand() % 3;
            }
            else{
                k = rand() % 4;
            }
            switch(k)
            {
                case UP:
                    if(field[i - 1][j] == WALL)
                    {
                        j--;
                    }
                    else
                    {
                        field[i - 1][j] = WALL;
                    }
                    break;
                case RIGHT:
                    if(field[i][j + 1] == WALL)
                    {
                        j--;
                    }
                    else
                    {
                        field[i][j + 1] = WALL;
                    }
                    break;
                case UNDER:
                    if(field[i + 1][j] == WALL)
                    {
                        j--;
                    }
                    else
                    {
                        field[i + 1][j] = WALL;
                    }
                    break;
                case LEFT:
                    if(field[i][j - 1] == WALL)
                    {
                        j--;
                    }
                    else
                    {
                        field[i][j - 1] = WALL;
                    }
                    break;
            }
        }
    }
    
//---------------------------------------------------
    
    //表示
    for(i = 0; i < FIELD; i++)
    {
        for(j = 0; j < FIELD; j++)
        {
            if(field[i][j] == WALL)
            {
                printf("■");
            }
            if(field[i][j] == ROAD)
            {
                printf("  ");
            }
        }
        printf("\n");
    }
    return 0;
}



この投稿にコメントする

削除パスワード

No.7011

Re:ランダムで作成する棒倒し法迷路
投稿者---akg(2007/01/16 21:49:22)


>実行されなくなりました。

そうではなく、実行中に棒倒し処理のところで
無限ループに陥っています。
ロジックを見直してください。


この投稿にコメントする

削除パスワード

No.7031

Re:ランダムで作成する棒倒し法迷路
投稿者---るる(2007/01/24 21:02:09)


ありがとうございました。
無事、棒倒し法プログラムを作成できました。(1本道のみですが;)

今度は穴掘り法に挑戦して見ます。


#include<stdio.h>
#include<time.h>
#include<stdlib.h>

//道か壁かの判定用
#define ROAD    0      //道
#define WALL    1      //壁

#define FIELD   13

//穴を掘るための判定用:ランダムでどこに進むか決める
#define UP  0  //上
#define RIGHT   1    //右
#define UNDER   2    //下
#define LEFT    3      //左

int main(void)
{
    int i, j, k;
    int field[FIELD][FIELD];
        
    for(i = 0; i < FIELD; i++)
    {
        for(j = 0; j < FIELD; j++)
        {
        }
    }
    
    for(i = 0; i < FIELD; i++)
    {
        for(j = 0; j < FIELD; j++)
        {
            //初期化。
            field[i][j] = ROAD; //全部を道にします
            
            //最外周を壁にします
            field[0][j] = WALL;   //最左
            field[FIELD-1][j] = WALL;   //最右
            field[i][0] = WALL;   //最上
            field[i][FIELD-1] = WALL;   //最下
            
            //(偶数,偶数)の座標を壁にします
            if(i % 2 == 0 && j % 2 == 0){
                field[i][j] = WALL;
            }
        }
    }
    
//------------------------------------------------棒倒し処理
    srand((unsigned)time(NULL));
    for(i = 2; i < FIELD-2; i+=2)
    {
        for(j = 2; j < FIELD-2; j+=2)
        {
            if(i == 2)
            {
                k = rand() % 4;
                switch(k)
                {
                    case UP:
                        field[i - 1][j] = WALL;
                        break;
                    case RIGHT:
                        field[i][j + 1] = WALL;
                        break;
                    case UNDER:
                        field[i + 1][j] = WALL;
                        break;
                    default:
                        field[i][j - 1] = WALL;
                        break;
                }
            }
            else{
                k = rand() % 3;
                switch(k)
                {
                    case UP:
                        field[i][j + 1] = WALL;
                        break;
                    case RIGHT:
                        field[i + 1][j] = WALL;
                        break;
                    default:
                        field[i][j - 1] = WALL;
                        break;
                }
            }
        }
    }
    
//---------------------------------------------------
    
    //表示
    for(i = 0; i < FIELD; i++)
    {
        for(j = 0; j < FIELD; j++)
        {
            if(field[i][j] == WALL)
            {
                printf("■");
            }
            if(field[i][j] == ROAD)
            {
                printf("  ");
            }
        }
        printf("\n");
    }
    return 0;
}



この投稿にコメントする

削除パスワード

No.7033

Re:ランダムで作成する棒倒し法迷路
投稿者---akg(2007/01/24 21:14:58)


>     for(i = 0; i < FIELD; i++)
>     {
>         for(j = 0; j < FIELD; j++)
>         {
>         }
>     }

これは不要ですね。

>             if(i == 2)
>             {
>                 k = rand() % 4;
>                 switch(k)

iが2のときを特別視しているのはなぜですか?




この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    記事検索    ログ    タグ一覧





掲示板提供:(有)リアル・インテグリティ