• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:C++での乱射ショットについて教えてください。)

C++での乱射ショットについて教えてください。

このQ&Aのポイント
  • C++での乱射ショットについての質問です。乱射ショットのコードについて説明してください。
  • 現在、乱射ショットの実装について困っています。コードを追加しても乱射にならず、乱射する方法がわかりません。
  • 乱射ショットの部分のコードを提供してください。また、ENEMY::Shot()の全体のコードも教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.2

細かく全体を見てはいません。 //初回だけ乱数初期化 if(num==0){ srand((unsigned int)time(NULL)); shot[i].rad=atan2(py-y,px-x)-(60*PI/180)+((rand()%120)*PI/180); ++num; break; } 提示された部分で、rand が使われているのはここだけです。 これだと、 「num==0 のとき、必ず srand してからrand」となります。 ・numがどうなっているのか、コードからはわかりません。 最初の1回だけ角度がランダムに決定され、それ以降はnum!=0となり、shot[i].radが過去に設定されたもののまま、ということは無いですか? ・乱数の発生原理を理解しましょう。 randは「疑似乱数」と呼ばれるもので、「乱数のように見えるけど、実際には一定の法則に従った数列」です。 srand (seed,種と呼ばれます)は、その初期値を決めるものです。種が同じなら、発生する乱数列も同じになります。 例えば srand(10) 後、 rand()を繰り返したら 5,3,7,2 .... と乱数が求められたとします。 この場合、srand(10)とすれば、その後のrand()は、必ず 5,3,7,2 .... となります。 通常は、最初にsrandして、後はrandを繰り返す、という使い方をします。 srandは、プログラム実行時に初期値が設定されます。そのため、プログラム実行の度に同じ乱数列が発生します。 # いわゆる「電源パターン」です。 それを防ぐテクニックに一つが、「現在時刻を元に種を作る」です。 srand((unsigned int)time(NULL)); はそのためのものです。 ですが、これには「同じ時刻だと同じ乱数になる」という欠点があります。 time()は1秒単位です。よって、現在のプログラムだと、1秒間に撃たれた「乱射弾」は、全部同じ方向へ飛びます。

bari-kinki
質問者

お礼

お疲れ様です。 いろいろ復習になった部分もあったのでよかったです。 解決出来ました。 ありがとうございます。 失礼します。

すると、全ての回答が全文表示されます。

その他の回答 (1)

  • honor
  • ベストアンサー率35% (25/71)
回答No.1

他のショットはサンプルのように上手くできているのでしょうか? shot[i].flagやshot[i].radの値をデバッガで確認してみるとか。 乱数の初期化が出来ていないせいで全ての弾が重なってるなんてことはないですよね。

bari-kinki
質問者

お礼

お疲れ様です。 言葉をヒントに試していたら解決出来ました。 ありがとうございます。 失礼します。

すると、全ての回答が全文表示されます。

関連するQ&A