敵が一番近くの敵をロックオンするにはどうしたらよいのか

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

敵が一番近くの敵をロックオンするにはどうしたらよいのか

#1

投稿記事 by アップルミスト » 7年前

20体の勝手に動いてくれるものがいるとして
それらどうしを闘わせるために一番近いものをロックオンしたい
そういうときにはどういうふうに書いていけばいいでしょうか。

とりあえず1→20の索敵をして2番目に近いもののフラグを立てればいいのか・・・
1→19をしてから一番近いのもありですかね・・・
うまく思いつきません・・・

「一番近いもの」というもののコードの書き方もよくわかりません
ご教授お願いします


開発環境
Visual C++
DXライブラリ

jay
記事: 314
登録日時: 9年前
住所: 大阪市
連絡を取る:

Re: 敵が一番近くの敵をロックオンするにはどうしたらよいのか

#2

投稿記事 by jay » 7年前

何を言わんとしたいのかは伝わってきますが
もう少し分かりやすいように言葉を選んでくれると答えるほうとしても嬉しいですね
それに開発に使う言語などの情報を書いておくのも、一応フォーラムのルールにあったはずです(推奨事項だったかもしれませんが)


で、本題ですが
一番近い敵を探すなら、自分以外の全員を順番に調べて行くしかないでしょう
おっしゃる通りに、ループ処理で配列の最初から最後まで調べて行くのが良いですね

自分と相手との距離を求める方法に関してですが
C言語ならばsqrt関数と中学校3年生程度の数学の知識があれば求めることが出来ます
具体的には三平方の定理、ですね
♪僕たちは まだ森の中 抜け出そう 陽のあたる場所へ

アップルミスト

Re: 敵が一番近くの敵をロックオンするにはどうしたらよいのか

#3

投稿記事 by アップルミスト » 7年前

わかりにくい質問で申し訳ありませんでした。

とりあえず書いてみましたがこの先はどうしたらよいでしょう。また、このやり方はあっているのでしょうか?
大きさを比べていくには順番に比べていくのがいいですか?なにかいい方法があれば教えてください。
ほかのソースをはるのが面倒くさいので重要そうなところだけ抜き出します。

コード:

typedef struct
{
	double x,y;
	double hp;
	int flag;
	double angle;
	double lockx,locky;
	int frd;
	double distance[20];
}AI1_t;

AI1_t Enemy[20];


void enemylockon()
 {
	 for(int i=0;i<20;i++)
		 if(Enemy[i].flag==1)
			 for(int j=0;j<20;j++)
				 if(Enemy[j].flag==1)
					 Enemy[i].distance[j]=((Enemy[i].x-Enemy[j].x)*(Enemy[i].x-Enemy[j].x)+(Enemy[i].y-Enemy[j].y)*(Enemy[i].y-Enemy[j].y));
 }
平方根につっこむ意味がわからないのですが、必要あるのでしょうか?
2乗した形でも大小が比較できるような気がしますが・・・

アバター
GRAM
記事: 164
登録日時: 10年前
住所: 大阪

Re: 敵が一番近くの敵をロックオンするにはどうしたらよいのか

#4

投稿記事 by GRAM » 7年前

なにがし さんが書きました:平方根につっこむ意味がわからないのですが、必要あるのでしょうか?
2乗した形でも大小が比較できるような気がしますが・・・
ないでしょうね。その通りです
ところでdistanceを20個保管しておく必要があるのでしょうか?
(別のところで利用するのでしたらごめんなさい)
敵の番号が0~19で管理されているのであれば、
各個体が
①「その個体から現在までに調べた他の個体への最短の距離」

②「最短距離となる個体番号」
を記録するような処理を記述し、
新たに別の個体までの距離を調べたときに
その個体までの距離が現在記録されている最短距離よりも短ければ
①と②を更新し、全部調べおわった時の②の個体番号をロック対象とすればよいのではないのでしょうか?
ただロック対象を探すだけならば①「その個体から現在までに調べた他の個体への最短の距離」
これも構造体の変数にする必要がないと思います

ちなみにコードを改善しようと思うのでしたらn^2乗回調べなくても、
総あたりで調べるのなら個体数nに対しn(n-1)/2回調べれば済みます。
(リーグ戦の表を考えてみてください)
あとこのコードのまま行くとしてもi=jなら外すことも必要かと

jay
記事: 314
登録日時: 9年前
住所: 大阪市
連絡を取る:

Re: 敵が一番近くの敵をロックオンするにはどうしたらよいのか

#5

投稿記事 by jay » 7年前

あぁ、別にそこまで正確な距離を求めなくても
大小の比較が正確にできればそれで良いのですね

これは失礼しました
♪僕たちは まだ森の中 抜け出そう 陽のあたる場所へ

アップルミスト

Re: 敵が一番近くの敵をロックオンするにはどうしたらよいのか

#6

投稿記事 by アップルミスト » 7年前

だいぶ返信が遅れてしまいました。申し訳ございません。

周りに何機いるかでも分岐したいので20個分(19?)用意したいです。
その場合もひとつづつ比べていく方法でいけますかね・・・?
もっといいやり方はあったり・・・しませんか

閉鎖

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