C++での挙動と微妙に違う気がして、詳しい方のアドバイスを頂きたいです。
2次元配列から指定した方向に最短でパラメータをセットされている座標を取得するプログラムを書きたいです。
■配列例 stageMapDatas
1,2,2,2,2
0,0,0,0,2
0,3,0,0,2
2,0,0,0,0
2,2,2,2,2
(0,0)を基準点として下方向に検索する場合、(0,3)の値を取得
(0,0)を基準点として右方向に検索する場合、(1,0)の値を取得
それっぽい処理が実装できたのですが、C#で再起処理を行うと完了後にreturnで抜けた後の部分まで処理をしてしまっているようでして、この辺の回避方法がわかりません。
CheckCellを1回しか呼ばなくても、再帰した回数分Debug.Logが呼ばれてしまいます。
こちらを一番最初にreturnした時点で止める方法はありませんでしょうか?
public class CELL {
public int pram;
public int x;
public int y;
};
CELL CheckCell(int x, int y, DIR dir){
// Cellの初期化
CELL cell = new CELL();
cell.x = -1;
cell.y = -1;
//Debug.Log ("cc");
// 範囲外
if(x < 0 || x >= stageMapDatas[0].Count){
cell.x = x;
cell.y = y;
Debug.Log ("step 1 " + cell.x + "," + cell.y);
return cell;
}
if(y < 0 || y >= stageMapDatas.Count){
cell.x = x;
cell.y = y;
Debug.Log ("step 2 " + cell.x + "," + cell.y);
return cell;
}
// 判定
if(stageMapDatas[y][x] > 0){
cell.x = x;
cell.y = y;
Debug.Log ("step 3 " + x + "," + y);
return cell;
}else{
int xx = x;
int yy = y;
switch (dir) {
case DIR.DIR_LEFT:
xx -= 1;
break;
case DIR.DIR_RIGHT:
xx += 1;
break;
case DIR.DIR_UP:
yy -= 1;
break;
case DIR.DIR_DOWN:
yy += 1;
break;
}
CheckCell(xx, yy, dir);
Debug.Log ("step 4 " + cell.x + "," + cell.y);
return cell; // ここが再帰回数分呼ばれてしまいます。
}
Debug.Log ("step 5 " + cell.x + "," + cell.y);
return cell;
}
~略~
// メインの判定部分 cellには検索の基準点を保存
if (Mathf.Abs (diffX) > Mathf.Abs (diffY)) {
if (diffX > 0) {
check = CheckCell (cell.x+1, cell.y, DIR.DIR_RIGHT);
Debug.Log ("→");
} else {
check = CheckCell (cell.x-1, cell.y, DIR.DIR_LEFT);
Debug.Log ("←");
}
} else {
if (diffY > 0) {
check = CheckCell (cell.x, cell.y-1, DIR.DIR_UP);
Debug.Log ("↑");
} else {
check = CheckCell (cell.x, cell.y+1, DIR.DIR_DOWN);
Debug.Log ("↓");
}
}
Debug.Log (check.x + "," + check.y);
step 3 0,3
step 4 -1,-1
step 4 -1,-1