Skip to content

Commit

Permalink
Merge pull request #4 from bhaeussermann/master
Browse files Browse the repository at this point in the history
Added Gson as Json-parser option.
  • Loading branch information
mattpwest committed May 3, 2015
2 parents 17814f9 + 55c4b37 commit 10a12bf
Show file tree
Hide file tree
Showing 15 changed files with 254 additions and 130 deletions.
5 changes: 5 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
.classpath
.project
.settings/**
*.iml
.idea
**/target
Expand All @@ -6,3 +9,5 @@
logs
**/*.log
output/move.txt
/target/
**/*.class
8 changes: 7 additions & 1 deletion pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,12 @@
<artifactId>jackson-databind</artifactId>
<version>2.2.3</version>
</dependency>

<dependency>
<groupId>com.google.api-client</groupId>
<artifactId>google-api-client-gson</artifactId>
<version>1.18.0-rc</version>
</dependency>
</dependencies>

<build>
Expand Down Expand Up @@ -93,4 +99,4 @@
</resource>
</resources>
</build>
</project>
</project>
Empty file modified run.sh
100644 → 100755
Empty file.
139 changes: 14 additions & 125 deletions src/main/java/za/co/entelect/challenge/bot/BasicBot.java
Original file line number Diff line number Diff line change
@@ -1,23 +1,19 @@
package za.co.entelect.challenge.bot;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.jayway.jsonpath.JsonPath;
import com.jayway.jsonpath.PathNotFoundException;
import net.minidev.json.JSONArray;
import za.co.entelect.challenge.dto.GameState;
import za.co.entelect.challenge.dto.Missile;
import za.co.entelect.challenge.dto.Player;
import za.co.entelect.challenge.dto.Settings;
import za.co.entelect.challenge.dto.enums.EntityType;
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.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Random;

Expand All @@ -34,12 +30,13 @@ public BasicBot(Settings settings) {
public void execute() {

//Choose how you want to access the JSON
boolean basicAccess = false;

gameState = basicAccess ? loadBasicState() : loadAdvancedState();

loadAdvancedState();
GameStateReader reader =
new BasicGameStateReader();
//new JacksonGameStateReader();
//new GsonGameStateReader();

gameState = loadGameState(reader);

logMatchState();

StringBuilder map = loadMap();
Expand All @@ -49,128 +46,22 @@ public void execute() {
saveMove(move);
}

/**
* This method accesses the json elements directly
* Advantage: Fast and no need initialise everything - only use what you need
* Disadvantage: Match/Game State model only partially initialised
*
* @return match
*/
private GameState loadBasicState() {
try {
GameState gameState = new GameState();

File jsonFile = FileHelper.getFile(settings.getDefaultOutputFolder(), settings.getStateFile());

loadRoundNumber(jsonFile, gameState);

String player1Path = "$.Players[0]";
String player2Path = "$.Players[1]";

Player player1 = loadPlayer(jsonFile, player1Path);
Player player2 = loadPlayer(jsonFile, player2Path);

gameState.getPlayers().add(player1);
gameState.getPlayers().add(player2);

return gameState;
} catch (IOException ioe) {
LogHelper.log("Unable to read state file: " + settings.getStateFile());
ioe.printStackTrace();
return null;
} catch (NumberFormatException nfe) {
LogHelper.log("Unable to convert Round Number to int: " + settings.getStateFile());
nfe.printStackTrace();
return null;
}
}

/**
* This method initialises the entire Game State model using Jackson
* Advantage: All elements are accessible
* Disadvantage: slower than method loadBasicState()
*
* @return match
*/
private GameState loadAdvancedState() {
private GameState loadGameState(GameStateReader reader) {
GameState gameState = null;

File jsonFile = FileHelper.getFile(settings.getDefaultOutputFolder(), settings.getStateFile());

// ObjectMapper provides functionality for data binding between
// Java Bean Objects/POJO and JSON constructs/string
ObjectMapper mapper = new ObjectMapper();

try {
gameState = mapper.readValue(jsonFile, GameState.class);
} catch (IOException ioe) {
LogHelper.log("Unable to read state file: " + settings.getStateFile());
gameState = reader.read(jsonFile);
} catch (Exception ioe) {
LogHelper.log("Error reading state file: " + settings.getStateFile());
ioe.printStackTrace();
return null;
}

return gameState;
}

private void loadRoundNumber(File jsonFile, GameState gameState) throws IOException {
String roundNumber = "$.RoundNumber";
gameState.setRoundNumber(Integer.valueOf(JsonPath.read(jsonFile, roundNumber).toString()));
}

private Player loadPlayer(File jsonFile, String playerPath) throws IOException {
Player player = new Player();

try {
LinkedHashMap<String, Object> playerMap = JsonPath.read(jsonFile, playerPath);

player.setPlayerName((String)playerMap.get("PlayerName"));
player.setPlayerNumber((Integer)playerMap.get("PlayerNumber"));
player.setPlayerNumberReal((Integer)playerMap.get("PlayerNumberReal"));
player.setKills((Integer)playerMap.get("Kills"));
player.setLives((Integer)playerMap.get("Lives"));
player.setMissileLimit((Integer)playerMap.get("MissileLimit"));

JSONArray missiles = (JSONArray)playerMap.get("Missiles");

player.setMissiles(loadMissiles(missiles));

} catch (PathNotFoundException pnfe) {
LogHelper.log("Index out of bounds when evaluating path " + playerPath);
pnfe.printStackTrace();
}

return player;
}

private List<Object> loadMissiles(JSONArray missiles) {
List<Object> playerMissiles = new ArrayList<>();
Missile playerMissile;

for (Object missile : missiles) {
playerMissile = new Missile();

LinkedHashMap<String, Object> playerMissilesMap = (LinkedHashMap<String, Object>) missile;

playerMissile.setAlive((Boolean)playerMissilesMap.get("Alive"));
playerMissile.setX((Integer)playerMissilesMap.get("x"));
playerMissile.setY((Integer)playerMissilesMap.get("y"));
playerMissile.setWidth((Integer)playerMissilesMap.get("Width"));
playerMissile.setHeight((Integer)playerMissilesMap.get("Height"));
for (EntityType type : EntityType.values()) {
if (((String)playerMissilesMap.get("Type")).equalsIgnoreCase(type.toString())) {
playerMissile.setType(type);
break;
}
}
playerMissile.setPlayerNumber((Integer)playerMissilesMap.get("PlayerNumber"));
playerMissile.setActionRate((Integer)playerMissilesMap.get("ActionRate"));

playerMissiles.add(playerMissile);
}

return playerMissiles;
}

private void logMatchState() {
LogHelper.log(LogHelper.PREFIX + "Game state:");
LogHelper.log("\tRound: " + gameState.getRoundNumber());
Expand Down Expand Up @@ -221,6 +112,4 @@ private void saveMove(String move) {
ioe.printStackTrace();
}
}


}
9 changes: 9 additions & 0 deletions src/main/java/za/co/entelect/challenge/dto/AlienManager.java
Original file line number Diff line number Diff line change
@@ -1,7 +1,10 @@
package za.co.entelect.challenge.dto;

import com.fasterxml.jackson.annotation.*;
import com.google.gson.annotations.SerializedName;

import javax.annotation.Generated;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
Expand All @@ -20,16 +23,22 @@
public class AlienManager {

@JsonProperty("PlayerNumber")
@SerializedName("PlayerNumber")
private Integer playerNumber;
@JsonProperty("Disabled")
@SerializedName("Disabled")
private Boolean disabled;
@JsonProperty("Waves")
@SerializedName("Waves")
private List<List<Wave>> waves = new ArrayList<List<Wave>>();
@JsonProperty("ShotEnergyCost")
@SerializedName("ShotEnergyCost")
private Integer shotEnergyCost;
@JsonProperty("ShotEnergy")
@SerializedName("ShotEnergy")
private Integer shotEnergy;
@JsonProperty("DeltaX")
@SerializedName("DeltaX")
private Integer deltaX;
@JsonIgnore
private Map<String, Object> additionalProperties = new HashMap<String, Object>();
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
package za.co.entelect.challenge.dto;

import com.fasterxml.jackson.annotation.*;
import com.google.gson.annotations.SerializedName;

import javax.annotation.Generated;

import java.util.HashMap;

@JsonInclude(JsonInclude.Include.NON_NULL)
Expand All @@ -15,10 +17,13 @@
public class BuildingsAvailable {

@JsonProperty("Command")
@SerializedName("Command")
private String command;
@JsonProperty("Type")
@SerializedName("Type")
private String type;
@JsonProperty("Cost")
@SerializedName("Cost")
private Integer cost;
@JsonIgnore
private java.util.Map<String, Object> additionalProperties = new HashMap<String, Object>();
Expand Down
8 changes: 8 additions & 0 deletions src/main/java/za/co/entelect/challenge/dto/GameState.java
Original file line number Diff line number Diff line change
@@ -1,7 +1,10 @@
package za.co.entelect.challenge.dto;

import com.fasterxml.jackson.annotation.*;
import com.google.gson.annotations.SerializedName;

import javax.annotation.Generated;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
Expand All @@ -18,14 +21,19 @@
public class GameState {

@JsonProperty("BuildingsAvailable")
@SerializedName("BuildingsAvailable")
private List<BuildingsAvailable> buildingsAvailable = new ArrayList<BuildingsAvailable>();
@JsonProperty("Map")
@SerializedName("Map")
private Map map;
@JsonProperty("Players")
@SerializedName("Players")
private List<Player> players = new ArrayList<Player>();
@JsonProperty("RoundNumber")
@SerializedName("RoundNumber")
private Integer roundNumber;
@JsonProperty("RoundLimit")
@SerializedName("RoundLimit")
private Integer roundLimit;
@JsonIgnore
private java.util.Map<String, Object> additionalProperties = new HashMap<String, Object>();
Expand Down
5 changes: 5 additions & 0 deletions src/main/java/za/co/entelect/challenge/dto/Map.java
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
package za.co.entelect.challenge.dto;

import com.fasterxml.jackson.annotation.*;
import com.google.gson.annotations.SerializedName;

import javax.annotation.Generated;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
Expand All @@ -17,10 +19,13 @@
public class Map {

@JsonProperty("Width")
@SerializedName("Width")
private Integer width;
@JsonProperty("Height")
@SerializedName("Height")
private Integer height;
@JsonProperty("Rows")
@SerializedName("Rows")
private List<List<Row>> rows = new ArrayList<List<Row>>();
@JsonIgnore
private java.util.Map<String, Object> additionalProperties = new HashMap<String, Object>();
Expand Down
15 changes: 15 additions & 0 deletions src/main/java/za/co/entelect/challenge/dto/Player.java
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
package za.co.entelect.challenge.dto;

import com.fasterxml.jackson.annotation.*;
import com.google.gson.annotations.SerializedName;

import javax.annotation.Generated;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
Expand All @@ -27,30 +29,43 @@
public class Player {

@JsonProperty("PlayerNumberReal")
@SerializedName("PlayerNumberReal")
private Integer playerNumberReal;
@JsonProperty("PlayerNumber")
@SerializedName("PlayerNumber")
private Integer playerNumber;
@JsonProperty("PlayerName")
@SerializedName("PlayerName")
private String playerName;
@JsonProperty("Ship")
@SerializedName("Ship")
private Object ship;
@JsonProperty("Kills")
@SerializedName("Kills")
private Integer kills;
@JsonProperty("Lives")
@SerializedName("Lives")
private Integer lives;
@JsonProperty("RespawnTimer")
@SerializedName("RespawnTimer")
private Integer respawnTimer;
@JsonProperty("Missiles")
@SerializedName("Missiles")
private List<Object> missiles = new ArrayList<Object>();
@JsonProperty("MissileLimit")
@SerializedName("MissileLimit")
private Integer missileLimit;
@JsonProperty("AlienWaveSize")
@SerializedName("AlienWaveSize")
private Integer alienWaveSize;
@JsonProperty("AlienFactory")
@SerializedName("AlienFactory")
private Object alienFactory;
@JsonProperty("MissileController")
@SerializedName("MissileController")
private Object missileController;
@JsonProperty("AlienManager")
@SerializedName("AlienManager")
private za.co.entelect.challenge.dto.AlienManager alienManager;
@JsonIgnore
private java.util.Map<String, Object> additionalProperties = new HashMap<String, Object>();
Expand Down
Loading

0 comments on commit 10a12bf

Please sign in to comment.