http://gumina.sakura.ne.jp/CREATION/OLD ... SESS03.htm
こちらを参考に書いたのですが、うまく動作しなくて迷っています。
元言語はdelphiで書かれているようで読み解きながらCにしてみました。
狙った動作は移動範囲がひし形になり、移動経路もstring型の変数に記録したいです。
実際動作させるとひし形ではなく経路探索が途中で途切れてしまっています。移動経路も少しおかしいです。
コードは以下のように書きました。ご指導をお願いいたします。
► スポイラーを表示
// 移動範囲検索テストP.cpp : コンソール アプリケーションのエントリ ポイントを定義します。
//
#include "stdafx.h"
#include<string>
using namespace std;
int ***MapBlock;
int **MoveResult;
int **BlockCheck;
string **MoveDirection;
int size = 16;//ay
int size2 = 32;//ax
int SerchClr(){
int i,n;
//配列の初期化 1が移動不可能
for(i = 0;i < size ;++i){
for(n = 0;n < size2;++n){
MoveResult[i][n] = 1;
}
}
//チェック用の配列を初期化 0が未チェック
for(i = 0;i < size ;++i){
for(n = 0;n < size2;++n){
BlockCheck[i][n] = 0;
}
}
//移動経路を記録した配列を初期化
for(i = 0;i < size ;++i){
for(n = 0;n < size2;++n){
MoveDirection[i][n].clear();
}
}
return 0;
}
//再帰用関数
int Serch2(int ax,int ay,int cost,int di,string str){
//バッファオーバーチェック
if(ax < 0 || ax > size2 || ay < 0 || ay > size2)return 0;
//移動量を引いて処理を続けるか判定する
if((cost-1) < 0)return 0;//コストがマイナスならば進めないので処理を抜ける
//チェック済みならばリターン
//if(BlockCheck[ay][ax] == 1)return 0;//ここをコメントアウトすると移動範囲がちゃんと表示される・・・何故
//フラグを立てる
MoveResult[ay][ax] = 0;//移動可能にする
BlockCheck[ay][ax] = 1;//チェック済みフラグを立てる
//経路情報を記録する
MoveDirection[ay][ax] = str;
//暫定的にコストは-1 //最後の文字列が経路情報
if(di != 3)Serch2(ax,ay-1,cost-1,1,str += "U");//上
if(di != 4)Serch2(ax+1,ay,cost-1,2,str += "R");//右
if(di != 1)Serch2(ax,ay+1,cost-1,3,str += "D");//下
if(di != 2)Serch2(ax-1,ay,cost-1,4,str += "L");//左
return 0;
}
int Serch(int ax,int ay,int cost){
//配列の初期化
SerchClr();
Serch2(ax,ay - 1,cost,1,"U");//上
Serch2(ax + 1,ay,cost,2,"R");//右
Serch2(ax,ay + 1,cost,3,"D");//下
Serch2(ax - 1,ay,cost,4,"L");//左
return 0;
}
int _tmain(int argc, _TCHAR* argv[])
{
int i,n;
//原点をどこにするのかの数値を代入
int ax = 10;
int ay = 6;
//移動できる量を代入
int cost = 5;
//目的地の数値を代入
int goalx = 13;
int goaly = 4;
//キャラクタの移動できるかどうかのパラメータを代入する配列を用意する
MoveResult = new int *[size];
for(i = 0;i < size;++i){
MoveResult[i] = new int[size2];
}
//そのブロックがチェックされてかどうかを記録する配列を用意する
BlockCheck = new int *[size];
for(i = 0;i < size;++i){
BlockCheck[i] = new int[size2];
}
//目的地に行くまでの経路を保存するstring型の二次元配列を用意する
MoveDirection = new string *[size];
for(i = 0;i < size;++i){
MoveDirection[i] = new string[size2];
}
//検索実行
Serch(ax,ay,cost);
//経路文字列の確認
printf("経路文字列 = %s\n",MoveDirection[goaly][goalx].c_str());
//ゴールとスタート埋め込み
MoveResult[goaly][goalx] = 3;
MoveResult[ay][ax] = 5;
//以下は確認作業
int count = 0;
for(i = 0;i < size;++i){
for(n = 0;n < size2;++n){
printf("%d,",MoveResult[i][n]);
count ++;
if(count == size2){
printf("\n");
count = 0;
}
}
}
printf("-----------------------\n\n");
count = 0;
for(i = 0;i < size;++i){
for(n = 0;n < size2;++n){
printf("%d,",BlockCheck[i][n]);
count ++;
if(count == size2){
printf("\n");
count = 0;
}
}
}
//ここまで
//キャラクタの移動できるかどうかのパラメータを代入する配列を開放
for(i = 0;i < size;++i){
delete[] MoveResult[i];
}
delete[] MoveResult;
//[]つけて解放
//キャラクタの移動できるかどうかのパラメータを代入する配列を開放
for(i = 0;i < size;++i){
delete[] MoveDirection[i];
}
delete[] MoveDirection;
//キャラクタの移動できるかどうかのパラメータを代入する配列を開放
for(i = 0;i < size;++i){
delete[] BlockCheck[i];
}
delete[] BlockCheck;
return 0;
}
/*
経路文字列 = UURURUUR //狙った文字列はUURRR
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,0,0,0,0,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,0,0,0,5,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,0,0,0,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
-----------------------
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,1,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
続行するには何かキーを押してください . . .
*/
/*
狙った形はこれ
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,0,0,0,0,0,0,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,0,0,0,0,0,5,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
*/