Java モンスターブリーダー プログラム作成方法
Javaでモンスターブリーダー(ループ)のプログラムを作成する方法を教えてください。
【1】プログラムの説明
指定数のモンスター(最初は経験値が全て「1 」)に、自分が持っている経験値を効率よく分け与えると
したら、分け与える回数は何回になるかな? という問題です。
まず、3 つのモンスター( 仮にA,B,C としましょう) がいます。この3 匹は以下の状態です。
レベル: 1, 1, 1
固有の値: 2, 3, 1
自分が分け与えられる経験値は全部で「10 」ですね。
これらのモンスターのレベルを上げるには、「レベル× 固有の値」の経験値が必要です。
例えば、A のモンスターのレベルを上げるには、レベル(1)× 固有値(2)= 2 の経験値が必要。
これでモンスターA はレベルが「2 」になります。・・・この時点で使った経験値は「2 」
さらに、A のモンスターのレベルを上げるには、レベル(2)× 固有値(2)= 4 の経験値が必要。
これでモンスターA はレベル「3 」になります。・・・この時点で使った経験値は2 + 4 で「6 」
またさらに、A のモンスターのレベルを上げるには、レベル(3)× 固有値(2)= 6 の経験値が必要。
この経験値を与えると、使った経験値は全部で2 + 4 + 6 = 12 となってしまいます。
自分が持っている経験値は10 なので、モンスターA をレベル4 に上げることはできません。
では、他のモンスターに残りの4 の経験値を使う場合は・・・というこんな感じになります。
今は、たとえの話なのでモンスターA から与えましたが、これをどのモンスターから与えていくかということも考えなくてはならないというわけです。
ここで、2 つのサンプルをみても分かるように、実は必要な経験値が最も小さくなるものから順次与えていっているということが分かりますか?
つまり、その時点で最も必要な経験値が小さくなるモンスターを探して、そのモンスターに経験値を与えていき、自分の持っている経験値では足りなくなったら終了。結局何回経験値を与えたかな?
というのを求めれば良いわけです。
【2】プログラムの作成方法
まず、入力値を元に、各モンスターの固有値、およびレベルを確保するものとして、配列を2 つ用意
しましょう。
固有値は入力ですね。(配列に入力させるとよいでしょう) 経験値は全て「1 」となりますね。
次に、使用する経験値の合計が持っている経験値(入力)を超えないように繰り返し処理をしますが、
今回は永久ループを使って、使用する経験値の合計が持っている経験値を超えたら抜けるとした方
が作成しやすいと思います。
ループの中では、先のサンプルでみたように、その時点での必要経験値が最も小さくなるモンスターが
何番目のモンスターかを探します(これは最小値探しと同じです)
見つかったら、その番号のモンスターに必要な経験値を手持ちの経験値から引き、そのモンスターの
レベルを上げてやります。
ただし、必要な経験値が手持ちの経験値の残りでは足りないようなら終了でループを抜けます。
足りているときは、回数をカウントすれば良いですね。
こんな感じです。そんなにややこしい流れではないかと思います。
【3】入力値
N(モンスターの数)、X(自由に割り振れる経験値)
a_1 ~ a_N (N個の各モンスター固有の値)
【4】.出力値
モンスターのレベルを上げることのできる最大の回数を出力
お礼
citizen_S様、ご回答ありがとうございます。 ・・・それは、かなりの災難ですね。