package za.co.entelect.challenge.bot; import za.co.entelect.challenge.dto.GameState; import za.co.entelect.challenge.dto.Player; import za.co.entelect.challenge.dto.Settings; import za.co.entelect.challenge.dto.enums.ShipCommand; import za.co.entelect.challenge.dto.reader.BasicGameStateReader; import za.co.entelect.challenge.dto.reader.GameStateReader; import za.co.entelect.challenge.dto.reader.GsonGameStateReader; import za.co.entelect.challenge.dto.reader.JacksonGameStateReader; import za.co.entelect.challenge.utils.BotHelper; import za.co.entelect.challenge.utils.FileHelper; import za.co.entelect.challenge.utils.LogHelper; import java.io.File; import java.io.IOException; import java.util.List; import java.util.Random; public class BasicBot { private Settings settings = null; public BasicBot(Settings settings) { this.settings = settings; } private GameState gameState; public void execute() { //Choose how you want to access the JSON GameStateReader reader = new BasicGameStateReader(); //new JacksonGameStateReader(); //new GsonGameStateReader(); gameState = loadGameState(reader); logMatchState(); StringBuilder map = loadMap(); LogHelper.logPartsOnDifferentLines("Map", map); String move = getRandomMove(); saveMove(move); } private GameState loadGameState(GameStateReader reader) { GameState gameState = null; File jsonFile = FileHelper.getFile(settings.getDefaultOutputFolder(), settings.getStateFile()); try { gameState = reader.read(jsonFile); } catch (Exception ioe) { LogHelper.log("Error reading state file: " + settings.getStateFile()); ioe.printStackTrace(); return null; } return gameState; } private void logMatchState() { LogHelper.log(LogHelper.PREFIX + "Game state:"); LogHelper.log("\tRound: " + gameState.getRoundNumber()); for (Player player : getPlayers()) { logPlayerState(player); } } public GameState getGameState() { return gameState; } public List<Player> getPlayers() { return gameState.getPlayers(); } private void logPlayerState(Player player) { LogHelper.log("\tPlayer " + player.getPlayerNumberReal() + " Kills: " + player.getKills()); LogHelper.log("\tPlayer " + player.getPlayerNumberReal() + " Lives: " + player.getLives()); LogHelper.log("\tPlayer " + player.getPlayerNumberReal() + " Missiles: " + player.getMissiles().size() + "/" + player.getMissileLimit()); } private StringBuilder loadMap() { try { return FileHelper.readFile(settings.getDefaultOutputFolder(), settings.getMapFile()); } catch(IOException ioe) { LogHelper.log("Unable to read map file: " + settings.getMapFile()); ioe.printStackTrace(); return new StringBuilder(); } } private String getRandomMove() { long seed = System.currentTimeMillis(); Random random = new Random(seed); int move = Math.abs(random.nextInt() % ShipCommand.values().length); String translatedMove = BotHelper.translateMove(move); return translatedMove; } private void saveMove(String move) { try { FileHelper.writeFile(settings.getDefaultOutputFolder(), settings.getOutputFile(), move); LogHelper.log("Move", move); } catch (IOException ioe) { LogHelper.log("Unable to write move file: " + settings.getOutputFile()); ioe.printStackTrace(); } } }