@Override public Weapon requestNextMove(Player player) { Scanner scanner = new Scanner(System.in); Weapon nextMove = null; System.out.println(player.getDescription() + ", select next move:"); Weapon[] weapons = Weapon.values(); for (Weapon weapon : weapons) { StringBuilder promptBuilder = new StringBuilder(); promptBuilder.append(weapon.name()).append(" : ").append(weapon.ordinal()); System.out.println(promptBuilder.toString()); } while (nextMove == null) { if (scanner.hasNextInt()) { int ordinal = scanner.nextInt(); if (ordinal >= 0 && ordinal < weapons.length) { nextMove = weapons[ordinal]; } else { System.out.println("Error please re-enter [0-" + (weapons.length - 1) + "]"); } } else { scanner.next(); System.out.println("Error please re-enter [0-" + (weapons.length - 1) + "]"); } } return nextMove; }
@Override public WeaponJudgingResult judgeWinningWeapon(Weapon weaponOne, Weapon weaponTwo) { validateNumberOfWeaponsOrFail(); if (weaponOne.equals(weaponTwo)) { return WeaponJudgingResult.tie(); } else { int numWeapons = Weapon.values().length; int mod = (numWeapons + weaponOne.ordinal() - weaponTwo.ordinal()) % numWeapons; if (mod % 2 == 1) { return new WeaponJudgingResult(weaponOne); } else { return new WeaponJudgingResult(weaponTwo); } } }
private void validateNumberOfWeaponsOrFail() { if (Weapon.values().length < 3 || Weapon.values().length % 2 == 0) { throw new UnsupportedOperationException( "ModuloArithmeticWeaponJudge is only a valid strategy when there are at least 3 weapons and the number of weapons is an odd number"); } }