思考ルーチンと物理シミュレーション
という書物から、移植しました。
ですが、マップの座標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; // 別経路探索のため
}