• ベストアンサー

プログラム

趣味でゲームをDirectXとC++で作っているんですけど、ダメージ計算のプログラムで分からないことがあります。乱数0.85~1の範囲として計算するにはfloat型でやればいいと思うんですけど、結果を整数を使うようにしたいんです。計算式の他の変数はint型を使用しているので、うまいこといけません。ソースコードを載せておきますので、どなたか回答お願いします。 int damege1(int LV, int atk, int power, int def) {  int type_relation=1; //タイプ関係  flaot ransu; //乱数  int critical; //急所  int damage_point; //ダメージ値  ransu = (GetRandom1(15)+85)/100; if(GetRandom1(10)<8) critical = 1; else critical = 2; //「『レベル×0.4+2』×攻撃×技の威力÷防御÷50+2」×タイプ関係×乱数×急所 damage_point = (( (LV*0.4+2) *atk*power/(def*50)+2) *(type_relation*ransu*critical)); return damage_point; } int GetRandom(int max) //乱数生成 { int random = GetRand(max); return random; }

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

  • ベストアンサー
回答No.4

>としたときに、得られるdamagi_pointの値は"74~88"になるはずなんです。 「critical=2; ransu = 1;」の場合88になると仮定すると、 最小値は「critical=1; ransu = 0.85;」で、37.4(37)じゃないですか? >でも実際に(上記の)プログラムを実行すると、結果の値が"0"になっています。 「((LV*0.4+2) *atk) * (power/(def*50)+2))」こう計算されている可能性があります。 powerもdefもintなので整数同士の割り算、つまり分母の方が大きい場合0になります。

yossyk7
質問者

お礼

おっしゃる通り最小値は37です。 critical=2で計算していました。 アドバイスを参考にしてransuの設定を変更したら、 期待した数値が出るようになりました。 ありがとうございました。

その他の回答 (4)

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.5

damage_point = (( (LV*0.4+2) *atk*power/(def*50)+2) *(type_relation*ransu*critical)); この計算でLV:50 atk:107 power:120 def:118 type_relation:1 critical:1でdamage_point:88からransuを計算していくと ((ransu*1*1)*(((50*0.4+2)*107*120/(118*50))+2) = ransu * 49.8779 = damage_point となると思うのですが これに DP74-88を当てはめるとransuは100%超えるように思います critical=2の場合でもransu以外の部分は99.756になるので 100%なら88以上になります

yossyk7
質問者

お礼

確かに手計算をしてみると100%超えていました。 ご指摘ありがとうございます。

回答No.3

すみません、MesssageBox()は文字列しか扱えないですね。 return行にブレイクポイントをかけて、デバッグしてみるのが一番てっとりばやいです。

yossyk7
質問者

お礼

回答ありがとうございます。 一度、デバッグを試してみます。 (やり方がよくわかりませんが、ネットで調べてみます) ちなみにfloat型でも試してみたんですが、やっぱり駄目でした。

回答No.2

ransuとdamage_pointの値をデバッグかMessageBox()を使って調べてみれば、解決すると思います。 また計算式が間違ってる可能性もあるので、「float damage_point2;」などを用意して小数点も確認しておくと、良いかもしれません。

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.1

どのような入力で、どのような結果を期待して、実際の実行結果がどのようになるのかを書きましょう コンパイルした場合にエラーや警告が出るのであればその内容を省略しないで投稿の中に含めましょう ransuに取得される値が希望通りでないとか damage_pointが期待する値より大きすぎるとか 具体的な不具合箇所を提示しましょう

yossyk7
質問者

補足

情報不足ですみませんでした。 コンパイルの際、エラーはありませんでした。 ransuに取得される値は希望通りの値になっていたので問題はないと思います。 damege1の引数としてLV, atk, power, defの値をそれぞれ 50, 107, 120, 118 としたときに、得られるdamagi_pointの値は"74~88"になるはずなんです。 でも実際に(上記の)プログラムを実行すると、結果の値が"0"になっています。

関連するQ&A