1
1
package za .co .entelect .challenge .bot ;
2
2
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 ;
7
3
import za .co .entelect .challenge .dto .GameState ;
8
- import za .co .entelect .challenge .dto .Missile ;
9
4
import za .co .entelect .challenge .dto .Player ;
10
5
import za .co .entelect .challenge .dto .Settings ;
11
- import za .co .entelect .challenge .dto .enums .EntityType ;
12
6
import 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 ;
13
11
import za .co .entelect .challenge .utils .BotHelper ;
14
12
import za .co .entelect .challenge .utils .FileHelper ;
15
13
import za .co .entelect .challenge .utils .LogHelper ;
16
14
17
15
import java .io .File ;
18
16
import java .io .IOException ;
19
- import java .util .ArrayList ;
20
- import java .util .LinkedHashMap ;
21
17
import java .util .List ;
22
18
import java .util .Random ;
23
19
@@ -34,12 +30,13 @@ public BasicBot(Settings settings) {
34
30
public void execute () {
35
31
36
32
//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();
42
37
38
+ gameState = loadGameState (reader );
39
+
43
40
logMatchState ();
44
41
45
42
StringBuilder map = loadMap ();
@@ -49,128 +46,22 @@ public void execute() {
49
46
saveMove (move );
50
47
}
51
48
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 ) {
96
50
GameState gameState = null ;
97
51
98
52
File jsonFile = FileHelper .getFile (settings .getDefaultOutputFolder (), settings .getStateFile ());
99
53
100
- // ObjectMapper provides functionality for data binding between
101
- // Java Bean Objects/POJO and JSON constructs/string
102
- ObjectMapper mapper = new ObjectMapper ();
103
-
104
54
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 ());
108
58
ioe .printStackTrace ();
109
59
return null ;
110
60
}
111
61
112
62
return gameState ;
113
63
}
114
64
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
-
174
65
private void logMatchState () {
175
66
LogHelper .log (LogHelper .PREFIX + "Game state:" );
176
67
LogHelper .log ("\t Round: " + gameState .getRoundNumber ());
@@ -221,6 +112,4 @@ private void saveMove(String move) {
221
112
ioe .printStackTrace ();
222
113
}
223
114
}
224
-
225
-
226
115
}
0 commit comments