Objective C シミュレーションRPGの移動経路のバグ

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
Killery
記事: 7
登録日時: 11年前

Objective C シミュレーションRPGの移動経路のバグ

#1

投稿記事 by Killery » 11年前

ゲームのアルゴリズム改訂版
思考ルーチンと物理シミュレーション
という書物から、移植しました。
ですが、マップの座標x またはy が 0 の時に
移動経路が正しく保存されないという現象が起きます。
問題は再起処理のところで、
g_moveRoute[i0][1]
g_moveRoute[i0][0]
に値が入らない点にあります。

なぜ入らないのでしょうか?
また、どうやったら解決できますか?

コード:

//-------------------------------------------------------------------searchRute
-(void)searchRoute{
    int i0;
    
    // ルートテンポラリとルートバッファの初期化
    for( i0 = 0; i0 < 2100; i0++ )
    { g_tmpRoute[i0][0] = 0; g_tmpRoute[i0][1] = 0; g_moveRoute[i0][0] = 0;
        g_moveRoute[i0][1] = 0; }
    
    for(int i = 0;i < 2100;i++){// テンポラリマップのゼロリセット
        for(int j = 0;j< 2100;j++){
            g_tmpMap[j][i] = 0;
        }
    }
    g_stackPointer = 0;	             // スタックポインタ初期化
    g_shallowDepth = 1002;   //「最も浅いスタック」を持たせるために、// 最も深い値を与えておく
    
    [self checkRoute:g_cursol_x startY:g_cursol_y];
    
    // 経路をテンポラリマップに書き込む
    i0 = 0;
    g_moveCount = 0;
    while( i0 < g_shallowDepth)
    {
        g_tmpMap[g_moveRoute[i0][1]][g_moveRoute[i0][0]] = 1;
        
        i0++;
    }
}

-(void)checkRoute:(int)startX startY:(int)startY{
    int i0;
    
    g_tmpMap[startY][startX]=1;
    g_tmpRoute[g_stackPointer][0] = startX;
    g_tmpRoute[g_stackPointer][1] = startY;
    g_stackPointer++;
    
    // ターゲットに到達したとき、スタック深度が今までより浅かったらそれを保存する
    if(( g_target_x == startX )&&( g_target_y == startY )&&( g_stackPointer < g_shallowDepth ))
    {
        g_shallowDepth = g_stackPointer;  // 最浅スタック深度更新
        int  j0 = 0;
        for( j0 = 0; j0 < g_shallowDepth; j0++ ) {
            g_moveRoute[j0][0] = g_tmpRoute[j0][0];
            g_moveRoute[j0][1] = g_tmpRoute[j0][1];
        }
    }
    
    // 再帰法で移動ルートを探し出す
    // 配列の添え字と関数の引数が逆になっていることに要注意
    i0 = g_selectRange[startY][startX];
    if(( g_selectRange[startY-1][startX] < i0 )&&(g_tmpMap[startY-1][startX] == 0 )
       ){
        [self checkRoute:startX startY:startY -1];
    }   // 上
    if(( g_selectRange[startY+1][startX] < i0 )&&(g_tmpMap[startY+1][startX] == 0 )
       ){
        [self checkRoute:startX startY:startY +1];
    }   // 下
    if(( g_selectRange[startY][startX-1] < i0 )&&(g_tmpMap[startY][startX-1] == 0 )
       ){
        [self checkRoute:startX-1 startY:startY];
    }   // 右
    if(( g_selectRange[startY][startX+1] < i0 )&&(g_tmpMap[startY][startX+1] == 0 )
       ){
        [self checkRoute:startX+1 startY:startY];
    }   // 左
    
    g_stackPointer--;                // スタックから捨てる
    g_tmpMap[startY][startX] = 0;    // 別経路探索のため
    
}


“C言語何でも質問掲示板” へ戻る