SLG 移動範囲の求め方について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
あさか

SLG 移動範囲の求め方について

#1

投稿記事 by あさか » 14年前

タイトル通りです。
移動可能範囲の調べ方が分かりません・・・。

自分はオセロやはさみ将棋の様に一方向を番兵まで調べる、という簡単な方法なら実装出来るくらいの知識量です。
環境はVC++(仕様言語はC言語) DXライブラリ。

こちらのフォーラムでもかなりの回数登場しているhttp://www5f.biglobe.ne.jp/~kenmo/program/SLG/move/move.htmlを参考にしてみたのですが、どうにも・・・。
このサイトでは二つの関数を交互に呼び出して索敵している様なのですが、最初一方向を調べつくした後一マス戻って左を調べ、また戻って右を調べ・・・の時点で詰まりました。

if(移動ポイント>0){
Search(一マス上へずらした座標の引数,移動ポイント-1);
}else if(移動ポイント == 0){
Search(一マス戻した後左へずらした座標の引数,移動ポイント)   ←ここで移動ポイントの引数をどうすれば良いのか分からず止まりました・・・。

上のサイトよりももう少し踏み入った説明のされているサイトがありましたら是非ご紹介下さい(一応調べてはみたのですが・・。)
考え方のヒントだけでも構いませんので、教えて頂ければこちらで自力でどうにかします。

non
記事: 1097
登録日時: 15年前

Re: SLG 移動範囲の求め方について

#2

投稿記事 by non » 14年前

なぜか、朝早くから、眠れないので暇つぶしにサンプルを作りました。
自分で解析してね。

コード:

#include <stdio.h>
#include <conio.h>
void Search(int,int,int);
void Search4(int,int,int);

int map[12][12]={0};
void init_map(void)
{
	int i,j;
	for(i=1;i<11;i++){
		for(j=1;j<11;j++)
			map[i][j]=-1;
	}
}
void disp_map(void)
{
	int i,j;
	for(i=0;i<12;i++){
		for(j=0;j<12;j++)
			printf("%2d ",map[i][j]);
		printf("\n");
	}
}
void debug(int y,int x,int move)
{
	printf("%d %d %d\n",y,x,move);
	disp_map();
	printf("PUSH ENTER\n");
	getche();
}
void Search(int y,int x,int move)
{
	if(move-1<map[y][x])
		return;
	Search4(y,x,move-1);
}
void Search4(int y,int x,int move)
{
	map[y][x]=move;
	debug(y,x,move);
	if(move<=0)
		return;
	Search(y-1,x  ,move);
	Search(y  ,x-1,move);
	Search(y  ,x+1,move);
	Search(y+1,x  ,move);
}

int main(void)
{
	init_map();
	Search4(6,6,3);
	return 0;
}
non

あさか

Re: SLG 移動範囲の求め方について

#3

投稿記事 by あさか » 14年前

お返事有難う御座います。
自分のゲームではマスの値は地形によって変えているタイプだったためちょっと違った形になってしまいましたが、骨組みはnonさんのものと似たプログラムを組ませて頂きました。
有難う御座いますm(_ _)m

関数のif文内にreturnを設けるだけで関数の処理をキャンセルして呼び出し元に戻るという事を初めて知りました・・・orz

閉鎖

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