-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathfiles.ml
323 lines (311 loc) · 11.3 KB
/
files.ml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
let solitaire_save (st : Solitaire_state.t) (name : string) =
let output = open_out (name ^ ".json") in
let deck = Solitaire_state.get_deck st in
let deck_list = Deck.to_list !deck in
let player_hand = Solitaire_state.current_hand st in
let dealer_hand = Solitaire_state.dealer_hand st in
let player_list = Hand.list_of_hand player_hand in
let dealer_list = Hand.list_of_hand dealer_hand in
let rec output_loop (input : Card.t list) (output_string : string) =
match input with
| [] -> output_string
| h :: t ->
let split_string =
String.split_on_char ' ' (Card.string_of_card h)
in
output_loop t "\n\t\t{\n\t\t\t\"color\": "
^ "\"" ^ List.hd split_string ^ "\","
^ "\n\t\t\t\"indicator\": " ^ "\""
^ List.hd (List.tl split_string)
^ "\"" ^ "\n\t\t}" ^ "," ^ output_string
(* let split_string = String.split_on_char ' ' (Card.string_of_card
h) in output_loop t "\n\t\t{\n\t\t\t\"color\": " ^ output_string
^ "\"" ^ List.hd split_string ^ "\"," ^ "\n\t\t\t\"indicator\": "
^ "\"" ^ List.hd (List.tl split_string) ^ "\"" ^ "\n\t\t}" ^ "," *)
in
Printf.fprintf output "{";
Printf.fprintf output "\n\t\"Game\": \"Solitaire\",";
Printf.fprintf output "\n\t\"Deck\": ";
Printf.fprintf output "[";
let deck_outputted = output_loop deck_list "" in
let deck_formatted =
String.sub deck_outputted 0 (String.length deck_outputted - 1)
in
Printf.fprintf output "%s" deck_formatted;
Printf.fprintf output " ],";
Printf.fprintf output "\n\t\"Player_cards\": ";
Printf.fprintf output "[";
let player_outputted = output_loop player_list "" in
let player_formatted =
String.sub player_outputted 0 (String.length player_outputted - 1)
in
Printf.fprintf output "%s" player_formatted;
Printf.fprintf output " ],";
Printf.fprintf output "\n\t\"Dealer_cards\": ";
Printf.fprintf output "[";
let dealer_outputted = output_loop dealer_list "" in
let dealer_formatted =
String.sub dealer_outputted 0 (String.length dealer_outputted - 1)
in
Printf.fprintf output "%s" dealer_formatted;
Printf.fprintf output " ],";
Printf.fprintf output "\n\t\"Turn_count\": \"";
Printf.fprintf output "%i" (Solitaire_state.turns st);
Printf.fprintf output "\"";
Printf.fprintf output "\n}";
close_out output
let solitaire_load (name : string) =
let input = name ^ ".json" in
let rec cards_rec cards =
match cards with
| [] -> []
| h :: t ->
let color =
Yojson.Basic.Util.to_string
(List.assoc "color" (Yojson.Basic.Util.to_assoc h))
in
let indicator =
Yojson.Basic.Util.to_string
(List.assoc "indicator" (Yojson.Basic.Util.to_assoc h))
in
let output =
Card.create_card
(Card.color_of_string color)
(Card.indicator_of_string indicator)
in
output :: cards_rec t
in
let json = Yojson.Basic.from_file input in
let turns =
int_of_string
(Yojson.Basic.Util.to_string
(List.assoc "Turn_count" (Yojson.Basic.Util.to_assoc json)))
in
let player_cards =
cards_rec
(Yojson.Basic.Util.to_list
(List.assoc "Player_cards" (Yojson.Basic.Util.to_assoc json)))
in
let dealer_cards =
cards_rec
(Yojson.Basic.Util.to_list
(List.assoc "Dealer_cards" (Yojson.Basic.Util.to_assoc json)))
in
let deck =
cards_rec
(Yojson.Basic.Util.to_list
(List.assoc "Deck" (Yojson.Basic.Util.to_assoc json)))
in
let ref_deck = Deck.create_deck deck Deck.empty_deck in
Solitaire_state.create_state (ref ref_deck)
(Hand.create_hand player_cards Hand.empty_hand)
(Hand.create_hand dealer_cards Hand.empty_hand)
turns
let uno_save (st : Uno_state.t) (name : string) =
let output = open_out (name ^ ".json") in
let deck = Uno_state.get_deck st in
let deck_list = Deck.to_list !deck in
let players_card = Uno_state.current_players_card st in
let players_card_zero = players_card.(0) in
let players_card_one = players_card.(1) in
let players_card_two = players_card.(2) in
let players_card_three = players_card.(3) in
let players_card_zero_list = Hand.list_of_hand players_card_zero in
let players_card_one_list = Hand.list_of_hand players_card_one in
let players_card_two_list = Hand.list_of_hand players_card_two in
let players_card_three_list = Hand.list_of_hand players_card_three in
let discard_pile = Uno_state.current_discard st in
let ai_list = Uno_state.current_ai_list st in
let rec output_loop (input : Card.t list) (output_string : string) =
match input with
| [] -> output_string
| h :: t ->
let split_string =
String.split_on_char ' ' (Card.string_of_card h)
in
output_loop t "\n\t\t{\n\t\t\t\"color\": "
^ "\"" ^ List.hd split_string ^ "\","
^ "\n\t\t\t\"indicator\": " ^ "\""
^ List.hd (List.tl split_string)
^ "\"" ^ "\n\t\t}" ^ "," ^ output_string
(* let split_string = String.split_on_char ' ' (Card.string_of_card
h) in output_loop t "\n\t\t{\n\t\t\t\"color\": " ^ output_string
^ "\"" ^ List.hd split_string ^ "\"," ^ "\n\t\t\t\"indicator\": "
^ "\"" ^ List.hd (List.tl split_string) ^ "\"" ^ "\n\t\t}" ^ "," *)
in
let rec ai_loop (input : bool list) (output_string : string) =
match input with
| [] -> output_string
| h :: t ->
ai_loop t (output_string ^ "\"" ^ string_of_bool h ^ "\"" ^ ",")
in
Printf.fprintf output "{";
Printf.fprintf output "\n\t\"Game\": \"Uno\",";
Printf.fprintf output "\n\t\"Deck\": ";
Printf.fprintf output "[";
let deck_outputted = output_loop deck_list "" in
let deck_formatted =
String.sub deck_outputted 0 (String.length deck_outputted - 1)
in
Printf.fprintf output "%s" deck_formatted;
Printf.fprintf output " ],";
let player_zero_outputted = output_loop players_card_zero_list "" in
let player_one_outputted = output_loop players_card_one_list "" in
let player_two_outputted = output_loop players_card_two_list "" in
let player_three_outputted = output_loop players_card_three_list "" in
let player_zero_formatted =
String.sub player_zero_outputted 0
(String.length player_zero_outputted - 1)
in
let player_one_formatted =
String.sub player_one_outputted 0
(String.length player_one_outputted - 1)
in
let player_two_formatted =
String.sub player_two_outputted 0
(String.length player_two_outputted - 1)
in
let player_three_formatted =
String.sub player_three_outputted 0
(String.length player_three_outputted - 1)
in
let discard_outputted = output_loop discard_pile "" in
let discard_formatted =
String.sub discard_outputted 0 (String.length discard_outputted - 1)
in
Printf.fprintf output "\n\t\"Player_zero\": ";
Printf.fprintf output "[";
Printf.fprintf output "%s" player_zero_formatted;
Printf.fprintf output " ],";
Printf.fprintf output "\n\t\"Player_one\": ";
Printf.fprintf output "[";
Printf.fprintf output "%s" player_one_formatted;
Printf.fprintf output " ],";
Printf.fprintf output "\n\t\"Player_two\": ";
Printf.fprintf output "[";
Printf.fprintf output "%s" player_two_formatted;
Printf.fprintf output " ],";
Printf.fprintf output "\n\t\"Player_three\": ";
Printf.fprintf output "[";
Printf.fprintf output "%s" player_three_formatted;
Printf.fprintf output " ],";
Printf.fprintf output "\n\t\"Discard_pile\": ";
Printf.fprintf output "[";
Printf.fprintf output "%s" discard_formatted;
Printf.fprintf output " ],";
Printf.fprintf output "\n\t\"Current_Player\": \"";
Printf.fprintf output "%i" (Uno_state.current_player st);
Printf.fprintf output "\",";
Printf.fprintf output "\n";
Printf.fprintf output "\n\t\"Direction\": \"";
Printf.fprintf output "%s"
(Uno_state.direction_to_string (Uno_state.current_direction st));
Printf.fprintf output "\",";
Printf.fprintf output "\n";
Printf.fprintf output "\n\t\"Color\": \"";
Printf.fprintf output "%s"
(Uno_state.color_to_string (Uno_state.current_color st));
Printf.fprintf output "\",";
Printf.fprintf output "\n";
Printf.fprintf output "\n\t\"Ai_List\": ";
Printf.fprintf output "[";
let output_ai_loop = ai_loop ai_list "" in
let formatted_ai_loop =
String.sub output_ai_loop 0 (String.length output_ai_loop - 1)
in
Printf.fprintf output "%s" formatted_ai_loop;
Printf.fprintf output " ]";
Printf.fprintf output "\n}";
close_out output
let uno_load (name : string) =
let input = name ^ ".json" in
let rec cards_rec cards =
match cards with
| [] -> []
| h :: t ->
let color =
Yojson.Basic.Util.to_string
(List.assoc "color" (Yojson.Basic.Util.to_assoc h))
in
let indicator =
Yojson.Basic.Util.to_string
(List.assoc "indicator" (Yojson.Basic.Util.to_assoc h))
in
let output =
Card.create_card
(Card.color_of_string color)
(Card.indicator_of_string indicator)
in
output :: cards_rec t
in
let rec ai_rec ls (outputter : bool list) =
match ls with
| [] -> outputter
| h :: t ->
ai_rec t
(List.append outputter
[ bool_of_string (Yojson.Basic.Util.to_string h) ])
in
let json = Yojson.Basic.from_file input in
let current_player =
int_of_string
(Yojson.Basic.Util.to_string
(List.assoc "Current_Player" (Yojson.Basic.Util.to_assoc json)))
in
let direction =
Uno_state.string_to_direction
(Yojson.Basic.Util.to_string
(List.assoc "Direction" (Yojson.Basic.Util.to_assoc json)))
in
let color =
Uno_state.string_to_color
(Yojson.Basic.Util.to_string
(List.assoc "Color" (Yojson.Basic.Util.to_assoc json)))
in
let discard_pile =
cards_rec
(Yojson.Basic.Util.to_list
(List.assoc "Discard_pile" (Yojson.Basic.Util.to_assoc json)))
in
let ai_list_yo_json =
Yojson.Basic.Util.to_list
(List.assoc "Ai_List" (Yojson.Basic.Util.to_assoc json))
in
let ai_list_no_json = ai_rec ai_list_yo_json [] in
let hand_list_zero =
Yojson.Basic.Util.to_list
(List.assoc "Player_zero" (Yojson.Basic.Util.to_assoc json))
in
let hand_list_one =
Yojson.Basic.Util.to_list
(List.assoc "Player_one" (Yojson.Basic.Util.to_assoc json))
in
let hand_list_two =
Yojson.Basic.Util.to_list
(List.assoc "Player_two" (Yojson.Basic.Util.to_assoc json))
in
let hand_list_three =
Yojson.Basic.Util.to_list
(List.assoc "Player_three" (Yojson.Basic.Util.to_assoc json))
in
let hand_list_zero_cards = cards_rec hand_list_zero in
let hand_list_one_cards = cards_rec hand_list_one in
let hand_list_two_cards = cards_rec hand_list_two in
let hand_list_three_cards = cards_rec hand_list_three in
let hand_array =
[|
Hand.create_hand hand_list_zero_cards Hand.empty_hand;
Hand.create_hand hand_list_one_cards Hand.empty_hand;
Hand.create_hand hand_list_two_cards Hand.empty_hand;
Hand.create_hand hand_list_three_cards Hand.empty_hand;
|]
in
let deck =
cards_rec
(Yojson.Basic.Util.to_list
(List.assoc "Deck" (Yojson.Basic.Util.to_assoc json)))
in
let ref_deck = Deck.create_deck deck Deck.empty_deck in
(*needs changed to an actual ai_list*)
Uno_state.create_state (ref ref_deck) hand_array discard_pile
current_player direction color ai_list_no_json