不規則移動の処理

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

不規則移動の処理

#1

投稿記事 by チルチル » 16年前

龍神録1面の中ボスのように不規則な移動を実装しようとしたのですがうまく行きません

できる事はできるのですが、方向が偏ってしまいます
上→下→上→下みたいな事が起きやすいです

何か偏りにくい方法は無いでしょうか?
ボスが移動範囲内のどこに移動するかを求めたいです
今は画面内にランダムに点を打ち、移動範囲内なら移動を登録しています
int SetBossRandMove(int CenterX,int CenterY,int ReachX,int ReachY,int Reach_MAX,int Reach_MINI,int Count){//不規則移動を登録する関数

	float flag,X,Y;
	do{
		X=(GetRand(1)==0)?GetRand(447):Boss.x;
		Y=(GetRand(1)==0)?GetRand(479):Boss.y;
		if( X<CenterX-ReachX || X>CenterX+ReachX || Y<CenterY-ReachY || Y>CenterY+ReachY )flag=1;
		else if( (X-Boss.x)*(X-Boss.x)+(Y-Boss.y)*(Y-Boss.y)>Reach_MAX*Reach_MAX || (X-Boss.x)*(X-Boss.x)+(Y-Boss.y)*(Y-Boss.y)<Reach_MINI*Reach_MINI )flag=1;
		else flag=0;
	}while( flag );
	SetBossMove(X-Boss.x,Y-Boss.y,Count);//物理的計算を登録
	return (Boss.ReachX==0.0)?1:(Boss.ReachX<0.0)?0:2;

}//不規則移動を登録する関数

御津凪

Re:不規則移動の処理

#2

投稿記事 by 御津凪 » 16年前

擬似乱数値が偏りやすいのは GetRand 関数に問題があり、
ある間隔でとある部分が規則的に出やすいために起こっている可能性があります。

このコードでは、GetRand(1) で条件判断を行っているため、
1の位がある傾向(偶数と奇数が交互に出やすいなど)があると、処理が偏ることがあります。

根本的解決は別のよりよい擬似乱数を生成する関数を用意するのが一番ですが、
とりあえず、do文内で
int rand_x = GetRand(447*2);
    int rand_y = GetRand(479*2);
    X=(rand_x<447)?rand_x:Boss.x;
    Y=(rand_y<479)?rand_y:Boss.y;
とすることである程度は解消されるかもしれません。

チルチル

Re:不規則移動の処理

#3

投稿記事 by チルチル » 16年前

なるほど~GetRand関数が偏るんですね
調整してみます

どうもありがとうございます

閉鎖

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