11package za .co .entelect .challenge .bot ;
22
3- import com .fasterxml .jackson .databind .ObjectMapper ;
4- import com .jayway .jsonpath .JsonPath ;
5- import com .jayway .jsonpath .PathNotFoundException ;
6- import net .minidev .json .JSONArray ;
73import za .co .entelect .challenge .dto .GameState ;
8- import za .co .entelect .challenge .dto .Missile ;
94import za .co .entelect .challenge .dto .Player ;
105import za .co .entelect .challenge .dto .Settings ;
11- import za .co .entelect .challenge .dto .enums .EntityType ;
126import za .co .entelect .challenge .dto .enums .ShipCommand ;
7+ import za .co .entelect .challenge .dto .reader .BasicGameStateReader ;
8+ import za .co .entelect .challenge .dto .reader .GameStateReader ;
9+ import za .co .entelect .challenge .dto .reader .GsonGameStateReader ;
10+ import za .co .entelect .challenge .dto .reader .JacksonGameStateReader ;
1311import za .co .entelect .challenge .utils .BotHelper ;
1412import za .co .entelect .challenge .utils .FileHelper ;
1513import za .co .entelect .challenge .utils .LogHelper ;
1614
1715import java .io .File ;
1816import java .io .IOException ;
19- import java .util .ArrayList ;
20- import java .util .LinkedHashMap ;
2117import java .util .List ;
2218import java .util .Random ;
2319
@@ -34,12 +30,13 @@ public BasicBot(Settings settings) {
3430 public void execute () {
3531
3632 //Choose how you want to access the JSON
37- boolean basicAccess = false ;
38-
39- gameState = basicAccess ? loadBasicState () : loadAdvancedState ();
40-
41- loadAdvancedState ();
33+ GameStateReader reader =
34+ new BasicGameStateReader ();
35+ //new JacksonGameStateReader();
36+ //new GsonGameStateReader();
4237
38+ gameState = loadGameState (reader );
39+
4340 logMatchState ();
4441
4542 StringBuilder map = loadMap ();
@@ -49,128 +46,22 @@ public void execute() {
4946 saveMove (move );
5047 }
5148
52- /**
53- * This method accesses the json elements directly
54- * Advantage: Fast and no need initialise everything - only use what you need
55- * Disadvantage: Match/Game State model only partially initialised
56- *
57- * @return match
58- */
59- private GameState loadBasicState () {
60- try {
61- GameState gameState = new GameState ();
62-
63- File jsonFile = FileHelper .getFile (settings .getDefaultOutputFolder (), settings .getStateFile ());
64-
65- loadRoundNumber (jsonFile , gameState );
66-
67- String player1Path = "$.Players[0]" ;
68- String player2Path = "$.Players[1]" ;
69-
70- Player player1 = loadPlayer (jsonFile , player1Path );
71- Player player2 = loadPlayer (jsonFile , player2Path );
72-
73- gameState .getPlayers ().add (player1 );
74- gameState .getPlayers ().add (player2 );
75-
76- return gameState ;
77- } catch (IOException ioe ) {
78- LogHelper .log ("Unable to read state file: " + settings .getStateFile ());
79- ioe .printStackTrace ();
80- return null ;
81- } catch (NumberFormatException nfe ) {
82- LogHelper .log ("Unable to convert Round Number to int: " + settings .getStateFile ());
83- nfe .printStackTrace ();
84- return null ;
85- }
86- }
87-
88- /**
89- * This method initialises the entire Game State model using Jackson
90- * Advantage: All elements are accessible
91- * Disadvantage: slower than method loadBasicState()
92- *
93- * @return match
94- */
95- private GameState loadAdvancedState () {
49+ private GameState loadGameState (GameStateReader reader ) {
9650 GameState gameState = null ;
9751
9852 File jsonFile = FileHelper .getFile (settings .getDefaultOutputFolder (), settings .getStateFile ());
9953
100- // ObjectMapper provides functionality for data binding between
101- // Java Bean Objects/POJO and JSON constructs/string
102- ObjectMapper mapper = new ObjectMapper ();
103-
10454 try {
105- gameState = mapper . readValue (jsonFile , GameState . class );
106- } catch (IOException ioe ) {
107- LogHelper .log ("Unable to read state file: " + settings .getStateFile ());
55+ gameState = reader . read (jsonFile );
56+ } catch (Exception ioe ) {
57+ LogHelper .log ("Error reading state file: " + settings .getStateFile ());
10858 ioe .printStackTrace ();
10959 return null ;
11060 }
11161
11262 return gameState ;
11363 }
11464
115- private void loadRoundNumber (File jsonFile , GameState gameState ) throws IOException {
116- String roundNumber = "$.RoundNumber" ;
117- gameState .setRoundNumber (Integer .valueOf (JsonPath .read (jsonFile , roundNumber ).toString ()));
118- }
119-
120- private Player loadPlayer (File jsonFile , String playerPath ) throws IOException {
121- Player player = new Player ();
122-
123- try {
124- LinkedHashMap <String , Object > playerMap = JsonPath .read (jsonFile , playerPath );
125-
126- player .setPlayerName ((String )playerMap .get ("PlayerName" ));
127- player .setPlayerNumber ((Integer )playerMap .get ("PlayerNumber" ));
128- player .setPlayerNumberReal ((Integer )playerMap .get ("PlayerNumberReal" ));
129- player .setKills ((Integer )playerMap .get ("Kills" ));
130- player .setLives ((Integer )playerMap .get ("Lives" ));
131- player .setMissileLimit ((Integer )playerMap .get ("MissileLimit" ));
132-
133- JSONArray missiles = (JSONArray )playerMap .get ("Missiles" );
134-
135- player .setMissiles (loadMissiles (missiles ));
136-
137- } catch (PathNotFoundException pnfe ) {
138- LogHelper .log ("Index out of bounds when evaluating path " + playerPath );
139- pnfe .printStackTrace ();
140- }
141-
142- return player ;
143- }
144-
145- private List <Object > loadMissiles (JSONArray missiles ) {
146- List <Object > playerMissiles = new ArrayList <>();
147- Missile playerMissile ;
148-
149- for (Object missile : missiles ) {
150- playerMissile = new Missile ();
151-
152- LinkedHashMap <String , Object > playerMissilesMap = (LinkedHashMap <String , Object >) missile ;
153-
154- playerMissile .setAlive ((Boolean )playerMissilesMap .get ("Alive" ));
155- playerMissile .setX ((Integer )playerMissilesMap .get ("x" ));
156- playerMissile .setY ((Integer )playerMissilesMap .get ("y" ));
157- playerMissile .setWidth ((Integer )playerMissilesMap .get ("Width" ));
158- playerMissile .setHeight ((Integer )playerMissilesMap .get ("Height" ));
159- for (EntityType type : EntityType .values ()) {
160- if (((String )playerMissilesMap .get ("Type" )).equalsIgnoreCase (type .toString ())) {
161- playerMissile .setType (type );
162- break ;
163- }
164- }
165- playerMissile .setPlayerNumber ((Integer )playerMissilesMap .get ("PlayerNumber" ));
166- playerMissile .setActionRate ((Integer )playerMissilesMap .get ("ActionRate" ));
167-
168- playerMissiles .add (playerMissile );
169- }
170-
171- return playerMissiles ;
172- }
173-
17465 private void logMatchState () {
17566 LogHelper .log (LogHelper .PREFIX + "Game state:" );
17667 LogHelper .log ("\t Round: " + gameState .getRoundNumber ());
@@ -221,6 +112,4 @@ private void saveMove(String move) {
221112 ioe .printStackTrace ();
222113 }
223114 }
224-
225-
226115}
0 commit comments