diff --git a/ntakanabe/src/FightSimulation.java b/ntakanabe/src/FightSimulation.java new file mode 100644 index 0000000000000000000000000000000000000000..bb081b0c33f2c121fe5a94514cc7d168fb552518 --- /dev/null +++ b/ntakanabe/src/FightSimulation.java @@ -0,0 +1,171 @@ +package paiza.src; + +import java.util.ArrayList; +import java.util.List; +import java.util.Scanner; + +/** + * . C148 異世界転生した勇者のレベル変化をシミュレーションするメインクラス 戦闘回数と初期レベル、そして各戦闘相手のレベルを入力として受け取り、 N回の戦闘後の勇者のレベルを出力する + * + * @author ntakanabe + */ +public class FightSimulation { + + /** + * . 入力メソッド、戦闘シミュレーションメソッド、出力メソッドの呼び出しを行うmainメソッド + * + * @param args コマンドライン引数 + */ + public static void main(final String[] args) { + + final List inputValues = getInputSimulation(); + final int numOfBattles = inputValues.get(0); + final int initialHeroLevel = inputValues.get(1); + + final List enemyLevels = inputValues.subList(2, 2 + numOfBattles); + + final int finalHeroLevel = simulateCombat(numOfBattles, initialHeroLevel, enemyLevels); + outputResult(finalHeroLevel); + } + + /** + * . 戦闘回数と勇者の初期レベル、および各敵のレベルを読み込むメソッド + * + * @return 入力値を含むInteger型のリスト。要素[0]が戦闘回数、[1]が初期レベル、それ以降が敵のレベル + */ + private static List getInputSimulation() { + + final Scanner scan = new Scanner(System.in); + final List allInputs = new ArrayList<>(); + + final int numOfBattles = scan.nextInt(); + allInputs.add(numOfBattles); + + final int initialHeroLevel = scan.nextInt(); + allInputs.add(initialHeroLevel); + + for (int i = 0; i < numOfBattles; i++) { + allInputs.add(scan.nextInt()); + } + scan.close(); + + return allInputs; + } + + /** + * . 戦闘シミュレーションを実行し、最終的な勇者のレベルを計算するメソッド + * + * @param numOfBattles 戦闘回数 + * @param initialHeroLevel 勇者の初期レベル + * @param enemyLevels 敵のレベルのリスト + * @return N回の戦闘後の勇者の最終レベル + */ + private static int simulateCombat(final int numOfBattles, final int initialHeroLevel, + final List enemyLevels) { + + final Hero hero = new Hero(initialHeroLevel); + final BattleSimulator battle = new BattleSimulator(hero, enemyLevels); + battle.simulate(numOfBattles); + return hero.getLevel(); + } + + /** + * . シミュレーション結果(勇者の最終レベル)を出力するメソッド + * + * @param finalHeroLevel 勇者の最終レベル + */ + private static void outputResult(final int finalHeroLevel) { + + System.out.println(finalHeroLevel); + } +} + + +/** + * . 戦闘による勇者のレベル増減の計算を行うクラス + */ +class Hero { + + private int level; + + /** + * . 勇者オブジェクトを生成するコンストラクタ + * + * @param initialLevel 勇者の初期レベル + */ + public Hero(final int initialLevel) { + + this.level = initialLevel; + } + + /** + * . 勇者の現在のレベルを返すメソッド + * + * @return 勇者の現在のレベル + */ + public int getLevel() { + + return level; + } + + /** + * . 勇者と敵の戦闘における勝利判定をするメソッド + * + * @return 勇者の勝利 + */ + private boolean isHeroWin(final int heroLevel, final int enemyLevel) { + + return heroLevel > enemyLevel; + } + + /** + * . 勝利判定メソッドにより、勇者のレベルを更新するメソッド + * + * @param enemyLevel 敵のレベル + */ + public void updateLevel(final int enemyLevel) { + + if (isHeroWin(this.level, enemyLevel)) { + this.level += enemyLevel / 2; + } else if (!isHeroWin(this.level, enemyLevel) && this.level != enemyLevel) { + this.level /= 2; + } + } +} + + +/** + * . 勇者と敵のレベルの入力を受け取り、指定された回数の戦闘をシミュレーションするクラス + */ +class BattleSimulator { + + // シミュレーションの対象となる勇者オブジェクト + private final Hero hero; + // 敵のレベルの配列 + private final List enemyLevels; + + /** + * . 新しい戦闘シミュレーターを生成するコンストラクタ + * + * @param hero シミュレーションを行う勇者オブジェクト + * @param enemyLevels 敵のレベルのリスト + */ + public BattleSimulator(final Hero hero, final List enemyLevels) { + + this.hero = hero; + this.enemyLevels = enemyLevels; + } + + /** + * . 指定された回数だけ、入力された敵のレベルを読み込み、戦闘処理を行うメソッド + * + * @param numOfBattles 戦闘回数 + */ + public void simulate(final int numOfBattles) { + + for (int i = 0; i < numOfBattles; i++) { + final int enemyLevel = enemyLevels.get(i); + hero.updateLevel(enemyLevel); + } + } +}