EZTIME2025 commited on
Commit
b4a2ca4
·
1 Parent(s): e84109f

adding pots

Browse files
.github/copilot-instructions.md CHANGED
@@ -1,98 +0,0 @@
1
- # PyCatan AI - Development Instructions
2
-
3
- ## 🎯 Project Status
4
-
5
- **The Game is Ready and Tested!**
6
-
7
- The project contains a complete and tested implementation of The Settlers of Catan game in Python, including:
8
- - ✅ Complete game logic and rules
9
- - ✅ GameManager that coordinates turns and gameplay
10
- - ✅ Built-in Actions system
11
- - ✅ Tested and working human user
12
- - ✅ Display systems (Console + Web)
13
- - ✅ Extensive integration and unit tests
14
-
15
- ## 🚀 New Focus: Building an AI Agent
16
-
17
- **From now on, the project moves to the next phase:**
18
-
19
- Building an LLM-based AI agent that can play the game autonomously.
20
-
21
- ### 🎮 How Will the Agent Play?
22
- The agent will interact with the game using the **existing Actions system** - the same actions a human user performs:
23
- - Building settlements and cities
24
- - Building roads
25
- - Trading with other players
26
- - Using development cards
27
- - Making strategic decisions
28
-
29
- ### 📋 Agent Development Stages
30
-
31
- 1. **Agent Architecture** (current stage)
32
- - Planning the overall structure
33
- - Defining interfaces
34
- - Integration with GameManager
35
-
36
- 2. **Basic Agent**
37
- - Implementing basic actions
38
- - Receiving game state
39
- - Returning simple decisions
40
-
41
- 3. **Strategy Improvement**
42
- - Adding strategic thinking
43
- - Planning ahead
44
- - Learning from mistakes
45
-
46
- ## 📚 Relevant Documents
47
-
48
- ### Architecture and Structure
49
- - **[AI_ARCHITECTURE.md](instructions/AI_ARCHITECTURE.md)** - Agent architecture and integration (new!)
50
- - **[MODULAR_ORGANIZATION.md](../docs/MODULAR_ORGANIZATION.md)** - Modular project structure
51
- - **[REORGANIZATION.md](../docs/REORGANIZATION.md)** - Documentation of project reorganization
52
-
53
- ### Code and Examples
54
- - **[README.md](../readme.md)** - Main documentation, usage examples
55
- - **[examples/](../examples/)** - Code examples and scripts
56
- - **[tests/](../tests/)** - Integration and unit tests
57
-
58
- ### Blog and Post Series
59
- - **[docs/blog/](../docs/blog/)** - Series of posts about project development
60
-
61
- ## 🏗️ Project Structure (Summary)
62
-
63
- ```
64
- pycatan/
65
- ├── core/ # Pure game logic
66
- │ ├── game.py
67
- │ ├── board.py
68
- │ ├── player.py
69
- │ └── ...
70
- ├── management/ # Coordination and game manager
71
- │ ├── game_manager.py
72
- │ ├── actions.py
73
- │ └── log_events.py
74
- ├── players/ # Player implementations
75
- │ ├── user.py # Base class
76
- │ ├── human_user.py # Human user ✅
77
- │ └── ai_agent.py # AI agent (under construction)
78
- ├── visualizations/ # Display interfaces
79
- └── config/ # Settings and mappings
80
- ```
81
-
82
- ## 💡 Working Principles
83
-
84
- 1. **The game is stable** - Don't change core/ and management/ unless truly necessary
85
- 2. **Use the Actions system** - All interactions go through Actions
86
- 3. **Document thoroughly** - The project is well-documented, maintain the standard
87
- 4. **Tests** - Write tests for every new feature
88
- 5. **Modularity** - Maintain clear separation between modules
89
-
90
- ## 🎯 Current Goal
91
-
92
- **Create an initial AI agent that can:**
93
- - Receive game state
94
- - Choose a legal action
95
- - Execute it through GameManager
96
- - Document the process
97
-
98
- See [AI_ARCHITECTURE.md](instructions/AI_ARCHITECTURE.md) for full details.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
examples/ai_testing/my_games/current_state.json ADDED
@@ -0,0 +1,885 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "timestamp": "2025-12-26T16:21:38.408731",
3
+ "state_number": 1,
4
+ "state": {
5
+ "hexes": [
6
+ {
7
+ "id": 1,
8
+ "type": "wood",
9
+ "number": 12,
10
+ "has_robber": false
11
+ },
12
+ {
13
+ "id": 2,
14
+ "type": "sheep",
15
+ "number": 5,
16
+ "has_robber": false
17
+ },
18
+ {
19
+ "id": 3,
20
+ "type": "wood",
21
+ "number": 4,
22
+ "has_robber": false
23
+ },
24
+ {
25
+ "id": 4,
26
+ "type": "sheep",
27
+ "number": 8,
28
+ "has_robber": false
29
+ },
30
+ {
31
+ "id": 5,
32
+ "type": "brick",
33
+ "number": 6,
34
+ "has_robber": false
35
+ },
36
+ {
37
+ "id": 6,
38
+ "type": "wood",
39
+ "number": 3,
40
+ "has_robber": false
41
+ },
42
+ {
43
+ "id": 7,
44
+ "type": "wheat",
45
+ "number": 8,
46
+ "has_robber": false
47
+ },
48
+ {
49
+ "id": 8,
50
+ "type": "brick",
51
+ "number": 10,
52
+ "has_robber": false
53
+ },
54
+ {
55
+ "id": 9,
56
+ "type": "wood",
57
+ "number": 11,
58
+ "has_robber": false
59
+ },
60
+ {
61
+ "id": 10,
62
+ "type": "desert",
63
+ "number": null,
64
+ "has_robber": true
65
+ },
66
+ {
67
+ "id": 11,
68
+ "type": "ore",
69
+ "number": 3,
70
+ "has_robber": false
71
+ },
72
+ {
73
+ "id": 12,
74
+ "type": "sheep",
75
+ "number": 4,
76
+ "has_robber": false
77
+ },
78
+ {
79
+ "id": 13,
80
+ "type": "brick",
81
+ "number": 10,
82
+ "has_robber": false
83
+ },
84
+ {
85
+ "id": 14,
86
+ "type": "wheat",
87
+ "number": 9,
88
+ "has_robber": false
89
+ },
90
+ {
91
+ "id": 15,
92
+ "type": "wheat",
93
+ "number": 6,
94
+ "has_robber": false
95
+ },
96
+ {
97
+ "id": 16,
98
+ "type": "sheep",
99
+ "number": 11,
100
+ "has_robber": false
101
+ },
102
+ {
103
+ "id": 17,
104
+ "type": "ore",
105
+ "number": 5,
106
+ "has_robber": false
107
+ },
108
+ {
109
+ "id": 18,
110
+ "type": "wheat",
111
+ "number": 9,
112
+ "has_robber": false
113
+ },
114
+ {
115
+ "id": 19,
116
+ "type": "ore",
117
+ "number": 2,
118
+ "has_robber": false
119
+ }
120
+ ],
121
+ "settlements": [],
122
+ "cities": [],
123
+ "roads": [],
124
+ "harbors": [
125
+ {
126
+ "id": 1,
127
+ "type": "any",
128
+ "ratio": 3,
129
+ "point_one": 9,
130
+ "point_two": 8
131
+ },
132
+ {
133
+ "id": 2,
134
+ "type": "sheep",
135
+ "ratio": 2,
136
+ "point_one": 17,
137
+ "point_two": 28
138
+ },
139
+ {
140
+ "id": 3,
141
+ "type": "wood",
142
+ "ratio": 2,
143
+ "point_one": 40,
144
+ "point_two": 48
145
+ },
146
+ {
147
+ "id": 4,
148
+ "type": "any",
149
+ "ratio": 3,
150
+ "point_one": 50,
151
+ "point_two": 51
152
+ },
153
+ {
154
+ "id": 5,
155
+ "type": "any",
156
+ "ratio": 3,
157
+ "point_one": 53,
158
+ "point_two": 54
159
+ },
160
+ {
161
+ "id": 6,
162
+ "type": "any",
163
+ "ratio": 3,
164
+ "point_one": 37,
165
+ "point_two": 38
166
+ },
167
+ {
168
+ "id": 7,
169
+ "type": "ore",
170
+ "ratio": 2,
171
+ "point_one": 26,
172
+ "point_two": 16
173
+ },
174
+ {
175
+ "id": 8,
176
+ "type": "brick",
177
+ "ratio": 2,
178
+ "point_one": 7,
179
+ "point_two": 6
180
+ },
181
+ {
182
+ "id": 9,
183
+ "type": "wheat",
184
+ "ratio": 2,
185
+ "point_one": 3,
186
+ "point_two": 2
187
+ }
188
+ ],
189
+ "players": [
190
+ {
191
+ "id": 0,
192
+ "name": "a",
193
+ "victory_points": 0,
194
+ "total_cards": 0,
195
+ "cards_list": [],
196
+ "dev_cards_list": [],
197
+ "settlements": 0,
198
+ "cities": 0,
199
+ "roads": 0,
200
+ "longest_road": 0,
201
+ "has_longest_road": false,
202
+ "knights": 0,
203
+ "knights_played": 0,
204
+ "has_largest_army": false
205
+ },
206
+ {
207
+ "id": 1,
208
+ "name": "b",
209
+ "victory_points": 0,
210
+ "total_cards": 0,
211
+ "cards_list": [],
212
+ "dev_cards_list": [],
213
+ "settlements": 0,
214
+ "cities": 0,
215
+ "roads": 0,
216
+ "longest_road": 0,
217
+ "has_longest_road": false,
218
+ "knights": 0,
219
+ "knights_played": 0,
220
+ "has_largest_army": false
221
+ },
222
+ {
223
+ "id": 2,
224
+ "name": "c",
225
+ "victory_points": 0,
226
+ "total_cards": 0,
227
+ "cards_list": [],
228
+ "dev_cards_list": [],
229
+ "settlements": 0,
230
+ "cities": 0,
231
+ "roads": 0,
232
+ "longest_road": 0,
233
+ "has_longest_road": false,
234
+ "knights": 0,
235
+ "knights_played": 0,
236
+ "has_largest_army": false
237
+ }
238
+ ],
239
+ "current_player": 0,
240
+ "current_phase": "SETUP_FIRST_ROUND",
241
+ "robber_position": [
242
+ 2,
243
+ 2
244
+ ],
245
+ "dice_result": null,
246
+ "points": [
247
+ {
248
+ "point_id": 1,
249
+ "adjacent_points": [
250
+ 2,
251
+ 9
252
+ ],
253
+ "adjacent_hexes": [
254
+ 1
255
+ ]
256
+ },
257
+ {
258
+ "point_id": 2,
259
+ "adjacent_points": [
260
+ 1,
261
+ 3
262
+ ],
263
+ "adjacent_hexes": [
264
+ 1
265
+ ]
266
+ },
267
+ {
268
+ "point_id": 3,
269
+ "adjacent_points": [
270
+ 2,
271
+ 4,
272
+ 11
273
+ ],
274
+ "adjacent_hexes": [
275
+ 2,
276
+ 1
277
+ ]
278
+ },
279
+ {
280
+ "point_id": 4,
281
+ "adjacent_points": [
282
+ 3,
283
+ 5
284
+ ],
285
+ "adjacent_hexes": [
286
+ 2
287
+ ]
288
+ },
289
+ {
290
+ "point_id": 5,
291
+ "adjacent_points": [
292
+ 4,
293
+ 6,
294
+ 13
295
+ ],
296
+ "adjacent_hexes": [
297
+ 3,
298
+ 2
299
+ ]
300
+ },
301
+ {
302
+ "point_id": 6,
303
+ "adjacent_points": [
304
+ 5,
305
+ 7
306
+ ],
307
+ "adjacent_hexes": [
308
+ 3
309
+ ]
310
+ },
311
+ {
312
+ "point_id": 7,
313
+ "adjacent_points": [
314
+ 6,
315
+ 15
316
+ ],
317
+ "adjacent_hexes": [
318
+ 3
319
+ ]
320
+ },
321
+ {
322
+ "point_id": 8,
323
+ "adjacent_points": [
324
+ 9,
325
+ 18
326
+ ],
327
+ "adjacent_hexes": [
328
+ 4
329
+ ]
330
+ },
331
+ {
332
+ "point_id": 9,
333
+ "adjacent_points": [
334
+ 8,
335
+ 10,
336
+ 1
337
+ ],
338
+ "adjacent_hexes": [
339
+ 4,
340
+ 1
341
+ ]
342
+ },
343
+ {
344
+ "point_id": 10,
345
+ "adjacent_points": [
346
+ 9,
347
+ 11,
348
+ 20
349
+ ],
350
+ "adjacent_hexes": [
351
+ 5,
352
+ 4,
353
+ 1
354
+ ]
355
+ },
356
+ {
357
+ "point_id": 11,
358
+ "adjacent_points": [
359
+ 10,
360
+ 12,
361
+ 3
362
+ ],
363
+ "adjacent_hexes": [
364
+ 5,
365
+ 2,
366
+ 1
367
+ ]
368
+ },
369
+ {
370
+ "point_id": 12,
371
+ "adjacent_points": [
372
+ 11,
373
+ 13,
374
+ 22
375
+ ],
376
+ "adjacent_hexes": [
377
+ 6,
378
+ 5,
379
+ 2
380
+ ]
381
+ },
382
+ {
383
+ "point_id": 13,
384
+ "adjacent_points": [
385
+ 12,
386
+ 14,
387
+ 5
388
+ ],
389
+ "adjacent_hexes": [
390
+ 6,
391
+ 3,
392
+ 2
393
+ ]
394
+ },
395
+ {
396
+ "point_id": 14,
397
+ "adjacent_points": [
398
+ 13,
399
+ 15,
400
+ 24
401
+ ],
402
+ "adjacent_hexes": [
403
+ 7,
404
+ 6,
405
+ 3
406
+ ]
407
+ },
408
+ {
409
+ "point_id": 15,
410
+ "adjacent_points": [
411
+ 14,
412
+ 16,
413
+ 7
414
+ ],
415
+ "adjacent_hexes": [
416
+ 7,
417
+ 3
418
+ ]
419
+ },
420
+ {
421
+ "point_id": 16,
422
+ "adjacent_points": [
423
+ 15,
424
+ 26
425
+ ],
426
+ "adjacent_hexes": [
427
+ 7
428
+ ]
429
+ },
430
+ {
431
+ "point_id": 17,
432
+ "adjacent_points": [
433
+ 18,
434
+ 28
435
+ ],
436
+ "adjacent_hexes": [
437
+ 8
438
+ ]
439
+ },
440
+ {
441
+ "point_id": 18,
442
+ "adjacent_points": [
443
+ 17,
444
+ 19,
445
+ 8
446
+ ],
447
+ "adjacent_hexes": [
448
+ 8,
449
+ 4
450
+ ]
451
+ },
452
+ {
453
+ "point_id": 19,
454
+ "adjacent_points": [
455
+ 18,
456
+ 20,
457
+ 30
458
+ ],
459
+ "adjacent_hexes": [
460
+ 9,
461
+ 8,
462
+ 4
463
+ ]
464
+ },
465
+ {
466
+ "point_id": 20,
467
+ "adjacent_points": [
468
+ 19,
469
+ 21,
470
+ 10
471
+ ],
472
+ "adjacent_hexes": [
473
+ 9,
474
+ 5,
475
+ 4
476
+ ]
477
+ },
478
+ {
479
+ "point_id": 21,
480
+ "adjacent_points": [
481
+ 20,
482
+ 22,
483
+ 32
484
+ ],
485
+ "adjacent_hexes": [
486
+ 10,
487
+ 9,
488
+ 5
489
+ ]
490
+ },
491
+ {
492
+ "point_id": 22,
493
+ "adjacent_points": [
494
+ 21,
495
+ 23,
496
+ 12
497
+ ],
498
+ "adjacent_hexes": [
499
+ 10,
500
+ 6,
501
+ 5
502
+ ]
503
+ },
504
+ {
505
+ "point_id": 23,
506
+ "adjacent_points": [
507
+ 22,
508
+ 24,
509
+ 34
510
+ ],
511
+ "adjacent_hexes": [
512
+ 11,
513
+ 10,
514
+ 6
515
+ ]
516
+ },
517
+ {
518
+ "point_id": 24,
519
+ "adjacent_points": [
520
+ 23,
521
+ 25,
522
+ 14
523
+ ],
524
+ "adjacent_hexes": [
525
+ 11,
526
+ 7,
527
+ 6
528
+ ]
529
+ },
530
+ {
531
+ "point_id": 25,
532
+ "adjacent_points": [
533
+ 24,
534
+ 26,
535
+ 36
536
+ ],
537
+ "adjacent_hexes": [
538
+ 12,
539
+ 11,
540
+ 7
541
+ ]
542
+ },
543
+ {
544
+ "point_id": 26,
545
+ "adjacent_points": [
546
+ 25,
547
+ 27,
548
+ 16
549
+ ],
550
+ "adjacent_hexes": [
551
+ 12,
552
+ 7
553
+ ]
554
+ },
555
+ {
556
+ "point_id": 27,
557
+ "adjacent_points": [
558
+ 26,
559
+ 38
560
+ ],
561
+ "adjacent_hexes": [
562
+ 12
563
+ ]
564
+ },
565
+ {
566
+ "point_id": 28,
567
+ "adjacent_points": [
568
+ 29,
569
+ 17
570
+ ],
571
+ "adjacent_hexes": [
572
+ 8
573
+ ]
574
+ },
575
+ {
576
+ "point_id": 29,
577
+ "adjacent_points": [
578
+ 28,
579
+ 30,
580
+ 39
581
+ ],
582
+ "adjacent_hexes": [
583
+ 13,
584
+ 8
585
+ ]
586
+ },
587
+ {
588
+ "point_id": 30,
589
+ "adjacent_points": [
590
+ 29,
591
+ 31,
592
+ 19
593
+ ],
594
+ "adjacent_hexes": [
595
+ 13,
596
+ 9,
597
+ 8
598
+ ]
599
+ },
600
+ {
601
+ "point_id": 31,
602
+ "adjacent_points": [
603
+ 30,
604
+ 32,
605
+ 41
606
+ ],
607
+ "adjacent_hexes": [
608
+ 14,
609
+ 13,
610
+ 9
611
+ ]
612
+ },
613
+ {
614
+ "point_id": 32,
615
+ "adjacent_points": [
616
+ 31,
617
+ 33,
618
+ 21
619
+ ],
620
+ "adjacent_hexes": [
621
+ 14,
622
+ 10,
623
+ 9
624
+ ]
625
+ },
626
+ {
627
+ "point_id": 33,
628
+ "adjacent_points": [
629
+ 32,
630
+ 34,
631
+ 43
632
+ ],
633
+ "adjacent_hexes": [
634
+ 15,
635
+ 14,
636
+ 10
637
+ ]
638
+ },
639
+ {
640
+ "point_id": 34,
641
+ "adjacent_points": [
642
+ 33,
643
+ 35,
644
+ 23
645
+ ],
646
+ "adjacent_hexes": [
647
+ 15,
648
+ 11,
649
+ 10
650
+ ]
651
+ },
652
+ {
653
+ "point_id": 35,
654
+ "adjacent_points": [
655
+ 34,
656
+ 36,
657
+ 45
658
+ ],
659
+ "adjacent_hexes": [
660
+ 16,
661
+ 15,
662
+ 11
663
+ ]
664
+ },
665
+ {
666
+ "point_id": 36,
667
+ "adjacent_points": [
668
+ 35,
669
+ 37,
670
+ 25
671
+ ],
672
+ "adjacent_hexes": [
673
+ 16,
674
+ 12,
675
+ 11
676
+ ]
677
+ },
678
+ {
679
+ "point_id": 37,
680
+ "adjacent_points": [
681
+ 36,
682
+ 38,
683
+ 47
684
+ ],
685
+ "adjacent_hexes": [
686
+ 16,
687
+ 12
688
+ ]
689
+ },
690
+ {
691
+ "point_id": 38,
692
+ "adjacent_points": [
693
+ 37,
694
+ 27
695
+ ],
696
+ "adjacent_hexes": [
697
+ 12
698
+ ]
699
+ },
700
+ {
701
+ "point_id": 39,
702
+ "adjacent_points": [
703
+ 40,
704
+ 29
705
+ ],
706
+ "adjacent_hexes": [
707
+ 13
708
+ ]
709
+ },
710
+ {
711
+ "point_id": 40,
712
+ "adjacent_points": [
713
+ 39,
714
+ 41,
715
+ 48
716
+ ],
717
+ "adjacent_hexes": [
718
+ 17,
719
+ 13
720
+ ]
721
+ },
722
+ {
723
+ "point_id": 41,
724
+ "adjacent_points": [
725
+ 40,
726
+ 42,
727
+ 31
728
+ ],
729
+ "adjacent_hexes": [
730
+ 17,
731
+ 14,
732
+ 13
733
+ ]
734
+ },
735
+ {
736
+ "point_id": 42,
737
+ "adjacent_points": [
738
+ 41,
739
+ 43,
740
+ 50
741
+ ],
742
+ "adjacent_hexes": [
743
+ 18,
744
+ 17,
745
+ 14
746
+ ]
747
+ },
748
+ {
749
+ "point_id": 43,
750
+ "adjacent_points": [
751
+ 42,
752
+ 44,
753
+ 33
754
+ ],
755
+ "adjacent_hexes": [
756
+ 18,
757
+ 15,
758
+ 14
759
+ ]
760
+ },
761
+ {
762
+ "point_id": 44,
763
+ "adjacent_points": [
764
+ 43,
765
+ 45,
766
+ 52
767
+ ],
768
+ "adjacent_hexes": [
769
+ 19,
770
+ 18,
771
+ 15
772
+ ]
773
+ },
774
+ {
775
+ "point_id": 45,
776
+ "adjacent_points": [
777
+ 44,
778
+ 46,
779
+ 35
780
+ ],
781
+ "adjacent_hexes": [
782
+ 19,
783
+ 16,
784
+ 15
785
+ ]
786
+ },
787
+ {
788
+ "point_id": 46,
789
+ "adjacent_points": [
790
+ 45,
791
+ 47,
792
+ 54
793
+ ],
794
+ "adjacent_hexes": [
795
+ 19,
796
+ 16
797
+ ]
798
+ },
799
+ {
800
+ "point_id": 47,
801
+ "adjacent_points": [
802
+ 46,
803
+ 37
804
+ ],
805
+ "adjacent_hexes": [
806
+ 16
807
+ ]
808
+ },
809
+ {
810
+ "point_id": 48,
811
+ "adjacent_points": [
812
+ 49,
813
+ 40
814
+ ],
815
+ "adjacent_hexes": [
816
+ 17
817
+ ]
818
+ },
819
+ {
820
+ "point_id": 49,
821
+ "adjacent_points": [
822
+ 48,
823
+ 50
824
+ ],
825
+ "adjacent_hexes": [
826
+ 17
827
+ ]
828
+ },
829
+ {
830
+ "point_id": 50,
831
+ "adjacent_points": [
832
+ 49,
833
+ 51,
834
+ 42
835
+ ],
836
+ "adjacent_hexes": [
837
+ 18,
838
+ 17
839
+ ]
840
+ },
841
+ {
842
+ "point_id": 51,
843
+ "adjacent_points": [
844
+ 50,
845
+ 52
846
+ ],
847
+ "adjacent_hexes": [
848
+ 18
849
+ ]
850
+ },
851
+ {
852
+ "point_id": 52,
853
+ "adjacent_points": [
854
+ 51,
855
+ 53,
856
+ 44
857
+ ],
858
+ "adjacent_hexes": [
859
+ 19,
860
+ 18
861
+ ]
862
+ },
863
+ {
864
+ "point_id": 53,
865
+ "adjacent_points": [
866
+ 52,
867
+ 54
868
+ ],
869
+ "adjacent_hexes": [
870
+ 19
871
+ ]
872
+ },
873
+ {
874
+ "point_id": 54,
875
+ "adjacent_points": [
876
+ 53,
877
+ 46
878
+ ],
879
+ "adjacent_hexes": [
880
+ 19
881
+ ]
882
+ }
883
+ ]
884
+ }
885
+ }
examples/ai_testing/my_games/game_20251226_143530_final.json DELETED
@@ -1,816 +0,0 @@
1
- {
2
- "hexes": [
3
- {
4
- "id": 1,
5
- "type": "wood",
6
- "number": 12,
7
- "has_robber": false
8
- },
9
- {
10
- "id": 2,
11
- "type": "sheep",
12
- "number": 5,
13
- "has_robber": false
14
- },
15
- {
16
- "id": 3,
17
- "type": "wood",
18
- "number": 4,
19
- "has_robber": false
20
- },
21
- {
22
- "id": 4,
23
- "type": "sheep",
24
- "number": 8,
25
- "has_robber": false
26
- },
27
- {
28
- "id": 5,
29
- "type": "brick",
30
- "number": 6,
31
- "has_robber": false
32
- },
33
- {
34
- "id": 6,
35
- "type": "wood",
36
- "number": 3,
37
- "has_robber": false
38
- },
39
- {
40
- "id": 7,
41
- "type": "wheat",
42
- "number": 8,
43
- "has_robber": false
44
- },
45
- {
46
- "id": 8,
47
- "type": "brick",
48
- "number": 10,
49
- "has_robber": false
50
- },
51
- {
52
- "id": 9,
53
- "type": "wood",
54
- "number": 11,
55
- "has_robber": false
56
- },
57
- {
58
- "id": 10,
59
- "type": "desert",
60
- "number": null,
61
- "has_robber": true
62
- },
63
- {
64
- "id": 11,
65
- "type": "ore",
66
- "number": 3,
67
- "has_robber": false
68
- },
69
- {
70
- "id": 12,
71
- "type": "sheep",
72
- "number": 4,
73
- "has_robber": false
74
- },
75
- {
76
- "id": 13,
77
- "type": "brick",
78
- "number": 10,
79
- "has_robber": false
80
- },
81
- {
82
- "id": 14,
83
- "type": "wheat",
84
- "number": 9,
85
- "has_robber": false
86
- },
87
- {
88
- "id": 15,
89
- "type": "wheat",
90
- "number": 6,
91
- "has_robber": false
92
- },
93
- {
94
- "id": 16,
95
- "type": "sheep",
96
- "number": 11,
97
- "has_robber": false
98
- },
99
- {
100
- "id": 17,
101
- "type": "ore",
102
- "number": 5,
103
- "has_robber": false
104
- },
105
- {
106
- "id": 18,
107
- "type": "wheat",
108
- "number": 9,
109
- "has_robber": false
110
- },
111
- {
112
- "id": 19,
113
- "type": "ore",
114
- "number": 2,
115
- "has_robber": false
116
- }
117
- ],
118
- "settlements": [],
119
- "cities": [],
120
- "roads": [],
121
- "players": [
122
- {
123
- "id": 0,
124
- "name": "ש",
125
- "victory_points": 0,
126
- "total_cards": 0,
127
- "cards_list": [],
128
- "dev_cards_list": [],
129
- "settlements": 0,
130
- "cities": 0,
131
- "roads": 0,
132
- "longest_road": 0,
133
- "has_longest_road": false,
134
- "knights": 0,
135
- "knights_played": 0,
136
- "has_largest_army": false
137
- },
138
- {
139
- "id": 1,
140
- "name": "ה",
141
- "victory_points": 0,
142
- "total_cards": 0,
143
- "cards_list": [],
144
- "dev_cards_list": [],
145
- "settlements": 0,
146
- "cities": 0,
147
- "roads": 0,
148
- "longest_road": 0,
149
- "has_longest_road": false,
150
- "knights": 0,
151
- "knights_played": 0,
152
- "has_largest_army": false
153
- },
154
- {
155
- "id": 2,
156
- "name": "ב",
157
- "victory_points": 0,
158
- "total_cards": 0,
159
- "cards_list": [],
160
- "dev_cards_list": [],
161
- "settlements": 0,
162
- "cities": 0,
163
- "roads": 0,
164
- "longest_road": 0,
165
- "has_longest_road": false,
166
- "knights": 0,
167
- "knights_played": 0,
168
- "has_largest_army": false
169
- }
170
- ],
171
- "current_player": 0,
172
- "current_phase": "SETUP_FIRST_ROUND",
173
- "robber_position": [
174
- 2,
175
- 2
176
- ],
177
- "dice_result": null,
178
- "points": [
179
- {
180
- "point_id": 1,
181
- "adjacent_points": [
182
- 2,
183
- 9
184
- ],
185
- "adjacent_hexes": [
186
- 1
187
- ]
188
- },
189
- {
190
- "point_id": 2,
191
- "adjacent_points": [
192
- 1,
193
- 3
194
- ],
195
- "adjacent_hexes": [
196
- 1
197
- ]
198
- },
199
- {
200
- "point_id": 3,
201
- "adjacent_points": [
202
- 2,
203
- 4,
204
- 11
205
- ],
206
- "adjacent_hexes": [
207
- 2,
208
- 1
209
- ]
210
- },
211
- {
212
- "point_id": 4,
213
- "adjacent_points": [
214
- 3,
215
- 5
216
- ],
217
- "adjacent_hexes": [
218
- 2
219
- ]
220
- },
221
- {
222
- "point_id": 5,
223
- "adjacent_points": [
224
- 4,
225
- 6,
226
- 13
227
- ],
228
- "adjacent_hexes": [
229
- 3,
230
- 2
231
- ]
232
- },
233
- {
234
- "point_id": 6,
235
- "adjacent_points": [
236
- 5,
237
- 7
238
- ],
239
- "adjacent_hexes": [
240
- 3
241
- ]
242
- },
243
- {
244
- "point_id": 7,
245
- "adjacent_points": [
246
- 6,
247
- 15
248
- ],
249
- "adjacent_hexes": [
250
- 3
251
- ]
252
- },
253
- {
254
- "point_id": 8,
255
- "adjacent_points": [
256
- 9,
257
- 18
258
- ],
259
- "adjacent_hexes": [
260
- 4
261
- ]
262
- },
263
- {
264
- "point_id": 9,
265
- "adjacent_points": [
266
- 8,
267
- 10,
268
- 1
269
- ],
270
- "adjacent_hexes": [
271
- 4,
272
- 1
273
- ]
274
- },
275
- {
276
- "point_id": 10,
277
- "adjacent_points": [
278
- 9,
279
- 11,
280
- 20
281
- ],
282
- "adjacent_hexes": [
283
- 5,
284
- 4,
285
- 1
286
- ]
287
- },
288
- {
289
- "point_id": 11,
290
- "adjacent_points": [
291
- 10,
292
- 12,
293
- 3
294
- ],
295
- "adjacent_hexes": [
296
- 5,
297
- 2,
298
- 1
299
- ]
300
- },
301
- {
302
- "point_id": 12,
303
- "adjacent_points": [
304
- 11,
305
- 13,
306
- 22
307
- ],
308
- "adjacent_hexes": [
309
- 6,
310
- 5,
311
- 2
312
- ]
313
- },
314
- {
315
- "point_id": 13,
316
- "adjacent_points": [
317
- 12,
318
- 14,
319
- 5
320
- ],
321
- "adjacent_hexes": [
322
- 6,
323
- 3,
324
- 2
325
- ]
326
- },
327
- {
328
- "point_id": 14,
329
- "adjacent_points": [
330
- 13,
331
- 15,
332
- 24
333
- ],
334
- "adjacent_hexes": [
335
- 7,
336
- 6,
337
- 3
338
- ]
339
- },
340
- {
341
- "point_id": 15,
342
- "adjacent_points": [
343
- 14,
344
- 16,
345
- 7
346
- ],
347
- "adjacent_hexes": [
348
- 7,
349
- 3
350
- ]
351
- },
352
- {
353
- "point_id": 16,
354
- "adjacent_points": [
355
- 15,
356
- 26
357
- ],
358
- "adjacent_hexes": [
359
- 7
360
- ]
361
- },
362
- {
363
- "point_id": 17,
364
- "adjacent_points": [
365
- 18,
366
- 28
367
- ],
368
- "adjacent_hexes": [
369
- 8
370
- ]
371
- },
372
- {
373
- "point_id": 18,
374
- "adjacent_points": [
375
- 17,
376
- 19,
377
- 8
378
- ],
379
- "adjacent_hexes": [
380
- 8,
381
- 4
382
- ]
383
- },
384
- {
385
- "point_id": 19,
386
- "adjacent_points": [
387
- 18,
388
- 20,
389
- 30
390
- ],
391
- "adjacent_hexes": [
392
- 9,
393
- 8,
394
- 4
395
- ]
396
- },
397
- {
398
- "point_id": 20,
399
- "adjacent_points": [
400
- 19,
401
- 21,
402
- 10
403
- ],
404
- "adjacent_hexes": [
405
- 9,
406
- 5,
407
- 4
408
- ]
409
- },
410
- {
411
- "point_id": 21,
412
- "adjacent_points": [
413
- 20,
414
- 22,
415
- 32
416
- ],
417
- "adjacent_hexes": [
418
- 10,
419
- 9,
420
- 5
421
- ]
422
- },
423
- {
424
- "point_id": 22,
425
- "adjacent_points": [
426
- 21,
427
- 23,
428
- 12
429
- ],
430
- "adjacent_hexes": [
431
- 10,
432
- 6,
433
- 5
434
- ]
435
- },
436
- {
437
- "point_id": 23,
438
- "adjacent_points": [
439
- 22,
440
- 24,
441
- 34
442
- ],
443
- "adjacent_hexes": [
444
- 11,
445
- 10,
446
- 6
447
- ]
448
- },
449
- {
450
- "point_id": 24,
451
- "adjacent_points": [
452
- 23,
453
- 25,
454
- 14
455
- ],
456
- "adjacent_hexes": [
457
- 11,
458
- 7,
459
- 6
460
- ]
461
- },
462
- {
463
- "point_id": 25,
464
- "adjacent_points": [
465
- 24,
466
- 26,
467
- 36
468
- ],
469
- "adjacent_hexes": [
470
- 12,
471
- 11,
472
- 7
473
- ]
474
- },
475
- {
476
- "point_id": 26,
477
- "adjacent_points": [
478
- 25,
479
- 27,
480
- 16
481
- ],
482
- "adjacent_hexes": [
483
- 12,
484
- 7
485
- ]
486
- },
487
- {
488
- "point_id": 27,
489
- "adjacent_points": [
490
- 26,
491
- 38
492
- ],
493
- "adjacent_hexes": [
494
- 12
495
- ]
496
- },
497
- {
498
- "point_id": 28,
499
- "adjacent_points": [
500
- 29,
501
- 17
502
- ],
503
- "adjacent_hexes": [
504
- 8
505
- ]
506
- },
507
- {
508
- "point_id": 29,
509
- "adjacent_points": [
510
- 28,
511
- 30,
512
- 39
513
- ],
514
- "adjacent_hexes": [
515
- 13,
516
- 8
517
- ]
518
- },
519
- {
520
- "point_id": 30,
521
- "adjacent_points": [
522
- 29,
523
- 31,
524
- 19
525
- ],
526
- "adjacent_hexes": [
527
- 13,
528
- 9,
529
- 8
530
- ]
531
- },
532
- {
533
- "point_id": 31,
534
- "adjacent_points": [
535
- 30,
536
- 32,
537
- 41
538
- ],
539
- "adjacent_hexes": [
540
- 14,
541
- 13,
542
- 9
543
- ]
544
- },
545
- {
546
- "point_id": 32,
547
- "adjacent_points": [
548
- 31,
549
- 33,
550
- 21
551
- ],
552
- "adjacent_hexes": [
553
- 14,
554
- 10,
555
- 9
556
- ]
557
- },
558
- {
559
- "point_id": 33,
560
- "adjacent_points": [
561
- 32,
562
- 34,
563
- 43
564
- ],
565
- "adjacent_hexes": [
566
- 15,
567
- 14,
568
- 10
569
- ]
570
- },
571
- {
572
- "point_id": 34,
573
- "adjacent_points": [
574
- 33,
575
- 35,
576
- 23
577
- ],
578
- "adjacent_hexes": [
579
- 15,
580
- 11,
581
- 10
582
- ]
583
- },
584
- {
585
- "point_id": 35,
586
- "adjacent_points": [
587
- 34,
588
- 36,
589
- 45
590
- ],
591
- "adjacent_hexes": [
592
- 16,
593
- 15,
594
- 11
595
- ]
596
- },
597
- {
598
- "point_id": 36,
599
- "adjacent_points": [
600
- 35,
601
- 37,
602
- 25
603
- ],
604
- "adjacent_hexes": [
605
- 16,
606
- 12,
607
- 11
608
- ]
609
- },
610
- {
611
- "point_id": 37,
612
- "adjacent_points": [
613
- 36,
614
- 38,
615
- 47
616
- ],
617
- "adjacent_hexes": [
618
- 16,
619
- 12
620
- ]
621
- },
622
- {
623
- "point_id": 38,
624
- "adjacent_points": [
625
- 37,
626
- 27
627
- ],
628
- "adjacent_hexes": [
629
- 12
630
- ]
631
- },
632
- {
633
- "point_id": 39,
634
- "adjacent_points": [
635
- 40,
636
- 29
637
- ],
638
- "adjacent_hexes": [
639
- 13
640
- ]
641
- },
642
- {
643
- "point_id": 40,
644
- "adjacent_points": [
645
- 39,
646
- 41,
647
- 48
648
- ],
649
- "adjacent_hexes": [
650
- 17,
651
- 13
652
- ]
653
- },
654
- {
655
- "point_id": 41,
656
- "adjacent_points": [
657
- 40,
658
- 42,
659
- 31
660
- ],
661
- "adjacent_hexes": [
662
- 17,
663
- 14,
664
- 13
665
- ]
666
- },
667
- {
668
- "point_id": 42,
669
- "adjacent_points": [
670
- 41,
671
- 43,
672
- 50
673
- ],
674
- "adjacent_hexes": [
675
- 18,
676
- 17,
677
- 14
678
- ]
679
- },
680
- {
681
- "point_id": 43,
682
- "adjacent_points": [
683
- 42,
684
- 44,
685
- 33
686
- ],
687
- "adjacent_hexes": [
688
- 18,
689
- 15,
690
- 14
691
- ]
692
- },
693
- {
694
- "point_id": 44,
695
- "adjacent_points": [
696
- 43,
697
- 45,
698
- 52
699
- ],
700
- "adjacent_hexes": [
701
- 19,
702
- 18,
703
- 15
704
- ]
705
- },
706
- {
707
- "point_id": 45,
708
- "adjacent_points": [
709
- 44,
710
- 46,
711
- 35
712
- ],
713
- "adjacent_hexes": [
714
- 19,
715
- 16,
716
- 15
717
- ]
718
- },
719
- {
720
- "point_id": 46,
721
- "adjacent_points": [
722
- 45,
723
- 47,
724
- 54
725
- ],
726
- "adjacent_hexes": [
727
- 19,
728
- 16
729
- ]
730
- },
731
- {
732
- "point_id": 47,
733
- "adjacent_points": [
734
- 46,
735
- 37
736
- ],
737
- "adjacent_hexes": [
738
- 16
739
- ]
740
- },
741
- {
742
- "point_id": 48,
743
- "adjacent_points": [
744
- 49,
745
- 40
746
- ],
747
- "adjacent_hexes": [
748
- 17
749
- ]
750
- },
751
- {
752
- "point_id": 49,
753
- "adjacent_points": [
754
- 48,
755
- 50
756
- ],
757
- "adjacent_hexes": [
758
- 17
759
- ]
760
- },
761
- {
762
- "point_id": 50,
763
- "adjacent_points": [
764
- 49,
765
- 51,
766
- 42
767
- ],
768
- "adjacent_hexes": [
769
- 18,
770
- 17
771
- ]
772
- },
773
- {
774
- "point_id": 51,
775
- "adjacent_points": [
776
- 50,
777
- 52
778
- ],
779
- "adjacent_hexes": [
780
- 18
781
- ]
782
- },
783
- {
784
- "point_id": 52,
785
- "adjacent_points": [
786
- 51,
787
- 53,
788
- 44
789
- ],
790
- "adjacent_hexes": [
791
- 19,
792
- 18
793
- ]
794
- },
795
- {
796
- "point_id": 53,
797
- "adjacent_points": [
798
- 52,
799
- 54
800
- ],
801
- "adjacent_hexes": [
802
- 19
803
- ]
804
- },
805
- {
806
- "point_id": 54,
807
- "adjacent_points": [
808
- 53,
809
- 46
810
- ],
811
- "adjacent_hexes": [
812
- 19
813
- ]
814
- }
815
- ]
816
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
examples/ai_testing/my_games/game_20251226_143530_full.json DELETED
@@ -1,822 +0,0 @@
1
- {
2
- "total_states": 1,
3
- "timestamp": "20251226_143530",
4
- "states": [
5
- {
6
- "hexes": [
7
- {
8
- "id": 1,
9
- "type": "wood",
10
- "number": 12,
11
- "has_robber": false
12
- },
13
- {
14
- "id": 2,
15
- "type": "sheep",
16
- "number": 5,
17
- "has_robber": false
18
- },
19
- {
20
- "id": 3,
21
- "type": "wood",
22
- "number": 4,
23
- "has_robber": false
24
- },
25
- {
26
- "id": 4,
27
- "type": "sheep",
28
- "number": 8,
29
- "has_robber": false
30
- },
31
- {
32
- "id": 5,
33
- "type": "brick",
34
- "number": 6,
35
- "has_robber": false
36
- },
37
- {
38
- "id": 6,
39
- "type": "wood",
40
- "number": 3,
41
- "has_robber": false
42
- },
43
- {
44
- "id": 7,
45
- "type": "wheat",
46
- "number": 8,
47
- "has_robber": false
48
- },
49
- {
50
- "id": 8,
51
- "type": "brick",
52
- "number": 10,
53
- "has_robber": false
54
- },
55
- {
56
- "id": 9,
57
- "type": "wood",
58
- "number": 11,
59
- "has_robber": false
60
- },
61
- {
62
- "id": 10,
63
- "type": "desert",
64
- "number": null,
65
- "has_robber": true
66
- },
67
- {
68
- "id": 11,
69
- "type": "ore",
70
- "number": 3,
71
- "has_robber": false
72
- },
73
- {
74
- "id": 12,
75
- "type": "sheep",
76
- "number": 4,
77
- "has_robber": false
78
- },
79
- {
80
- "id": 13,
81
- "type": "brick",
82
- "number": 10,
83
- "has_robber": false
84
- },
85
- {
86
- "id": 14,
87
- "type": "wheat",
88
- "number": 9,
89
- "has_robber": false
90
- },
91
- {
92
- "id": 15,
93
- "type": "wheat",
94
- "number": 6,
95
- "has_robber": false
96
- },
97
- {
98
- "id": 16,
99
- "type": "sheep",
100
- "number": 11,
101
- "has_robber": false
102
- },
103
- {
104
- "id": 17,
105
- "type": "ore",
106
- "number": 5,
107
- "has_robber": false
108
- },
109
- {
110
- "id": 18,
111
- "type": "wheat",
112
- "number": 9,
113
- "has_robber": false
114
- },
115
- {
116
- "id": 19,
117
- "type": "ore",
118
- "number": 2,
119
- "has_robber": false
120
- }
121
- ],
122
- "settlements": [],
123
- "cities": [],
124
- "roads": [],
125
- "players": [
126
- {
127
- "id": 0,
128
- "name": "ש",
129
- "victory_points": 0,
130
- "total_cards": 0,
131
- "cards_list": [],
132
- "dev_cards_list": [],
133
- "settlements": 0,
134
- "cities": 0,
135
- "roads": 0,
136
- "longest_road": 0,
137
- "has_longest_road": false,
138
- "knights": 0,
139
- "knights_played": 0,
140
- "has_largest_army": false
141
- },
142
- {
143
- "id": 1,
144
- "name": "ה",
145
- "victory_points": 0,
146
- "total_cards": 0,
147
- "cards_list": [],
148
- "dev_cards_list": [],
149
- "settlements": 0,
150
- "cities": 0,
151
- "roads": 0,
152
- "longest_road": 0,
153
- "has_longest_road": false,
154
- "knights": 0,
155
- "knights_played": 0,
156
- "has_largest_army": false
157
- },
158
- {
159
- "id": 2,
160
- "name": "ב",
161
- "victory_points": 0,
162
- "total_cards": 0,
163
- "cards_list": [],
164
- "dev_cards_list": [],
165
- "settlements": 0,
166
- "cities": 0,
167
- "roads": 0,
168
- "longest_road": 0,
169
- "has_longest_road": false,
170
- "knights": 0,
171
- "knights_played": 0,
172
- "has_largest_army": false
173
- }
174
- ],
175
- "current_player": 0,
176
- "current_phase": "SETUP_FIRST_ROUND",
177
- "robber_position": [
178
- 2,
179
- 2
180
- ],
181
- "dice_result": null,
182
- "points": [
183
- {
184
- "point_id": 1,
185
- "adjacent_points": [
186
- 2,
187
- 9
188
- ],
189
- "adjacent_hexes": [
190
- 1
191
- ]
192
- },
193
- {
194
- "point_id": 2,
195
- "adjacent_points": [
196
- 1,
197
- 3
198
- ],
199
- "adjacent_hexes": [
200
- 1
201
- ]
202
- },
203
- {
204
- "point_id": 3,
205
- "adjacent_points": [
206
- 2,
207
- 4,
208
- 11
209
- ],
210
- "adjacent_hexes": [
211
- 2,
212
- 1
213
- ]
214
- },
215
- {
216
- "point_id": 4,
217
- "adjacent_points": [
218
- 3,
219
- 5
220
- ],
221
- "adjacent_hexes": [
222
- 2
223
- ]
224
- },
225
- {
226
- "point_id": 5,
227
- "adjacent_points": [
228
- 4,
229
- 6,
230
- 13
231
- ],
232
- "adjacent_hexes": [
233
- 3,
234
- 2
235
- ]
236
- },
237
- {
238
- "point_id": 6,
239
- "adjacent_points": [
240
- 5,
241
- 7
242
- ],
243
- "adjacent_hexes": [
244
- 3
245
- ]
246
- },
247
- {
248
- "point_id": 7,
249
- "adjacent_points": [
250
- 6,
251
- 15
252
- ],
253
- "adjacent_hexes": [
254
- 3
255
- ]
256
- },
257
- {
258
- "point_id": 8,
259
- "adjacent_points": [
260
- 9,
261
- 18
262
- ],
263
- "adjacent_hexes": [
264
- 4
265
- ]
266
- },
267
- {
268
- "point_id": 9,
269
- "adjacent_points": [
270
- 8,
271
- 10,
272
- 1
273
- ],
274
- "adjacent_hexes": [
275
- 4,
276
- 1
277
- ]
278
- },
279
- {
280
- "point_id": 10,
281
- "adjacent_points": [
282
- 9,
283
- 11,
284
- 20
285
- ],
286
- "adjacent_hexes": [
287
- 5,
288
- 4,
289
- 1
290
- ]
291
- },
292
- {
293
- "point_id": 11,
294
- "adjacent_points": [
295
- 10,
296
- 12,
297
- 3
298
- ],
299
- "adjacent_hexes": [
300
- 5,
301
- 2,
302
- 1
303
- ]
304
- },
305
- {
306
- "point_id": 12,
307
- "adjacent_points": [
308
- 11,
309
- 13,
310
- 22
311
- ],
312
- "adjacent_hexes": [
313
- 6,
314
- 5,
315
- 2
316
- ]
317
- },
318
- {
319
- "point_id": 13,
320
- "adjacent_points": [
321
- 12,
322
- 14,
323
- 5
324
- ],
325
- "adjacent_hexes": [
326
- 6,
327
- 3,
328
- 2
329
- ]
330
- },
331
- {
332
- "point_id": 14,
333
- "adjacent_points": [
334
- 13,
335
- 15,
336
- 24
337
- ],
338
- "adjacent_hexes": [
339
- 7,
340
- 6,
341
- 3
342
- ]
343
- },
344
- {
345
- "point_id": 15,
346
- "adjacent_points": [
347
- 14,
348
- 16,
349
- 7
350
- ],
351
- "adjacent_hexes": [
352
- 7,
353
- 3
354
- ]
355
- },
356
- {
357
- "point_id": 16,
358
- "adjacent_points": [
359
- 15,
360
- 26
361
- ],
362
- "adjacent_hexes": [
363
- 7
364
- ]
365
- },
366
- {
367
- "point_id": 17,
368
- "adjacent_points": [
369
- 18,
370
- 28
371
- ],
372
- "adjacent_hexes": [
373
- 8
374
- ]
375
- },
376
- {
377
- "point_id": 18,
378
- "adjacent_points": [
379
- 17,
380
- 19,
381
- 8
382
- ],
383
- "adjacent_hexes": [
384
- 8,
385
- 4
386
- ]
387
- },
388
- {
389
- "point_id": 19,
390
- "adjacent_points": [
391
- 18,
392
- 20,
393
- 30
394
- ],
395
- "adjacent_hexes": [
396
- 9,
397
- 8,
398
- 4
399
- ]
400
- },
401
- {
402
- "point_id": 20,
403
- "adjacent_points": [
404
- 19,
405
- 21,
406
- 10
407
- ],
408
- "adjacent_hexes": [
409
- 9,
410
- 5,
411
- 4
412
- ]
413
- },
414
- {
415
- "point_id": 21,
416
- "adjacent_points": [
417
- 20,
418
- 22,
419
- 32
420
- ],
421
- "adjacent_hexes": [
422
- 10,
423
- 9,
424
- 5
425
- ]
426
- },
427
- {
428
- "point_id": 22,
429
- "adjacent_points": [
430
- 21,
431
- 23,
432
- 12
433
- ],
434
- "adjacent_hexes": [
435
- 10,
436
- 6,
437
- 5
438
- ]
439
- },
440
- {
441
- "point_id": 23,
442
- "adjacent_points": [
443
- 22,
444
- 24,
445
- 34
446
- ],
447
- "adjacent_hexes": [
448
- 11,
449
- 10,
450
- 6
451
- ]
452
- },
453
- {
454
- "point_id": 24,
455
- "adjacent_points": [
456
- 23,
457
- 25,
458
- 14
459
- ],
460
- "adjacent_hexes": [
461
- 11,
462
- 7,
463
- 6
464
- ]
465
- },
466
- {
467
- "point_id": 25,
468
- "adjacent_points": [
469
- 24,
470
- 26,
471
- 36
472
- ],
473
- "adjacent_hexes": [
474
- 12,
475
- 11,
476
- 7
477
- ]
478
- },
479
- {
480
- "point_id": 26,
481
- "adjacent_points": [
482
- 25,
483
- 27,
484
- 16
485
- ],
486
- "adjacent_hexes": [
487
- 12,
488
- 7
489
- ]
490
- },
491
- {
492
- "point_id": 27,
493
- "adjacent_points": [
494
- 26,
495
- 38
496
- ],
497
- "adjacent_hexes": [
498
- 12
499
- ]
500
- },
501
- {
502
- "point_id": 28,
503
- "adjacent_points": [
504
- 29,
505
- 17
506
- ],
507
- "adjacent_hexes": [
508
- 8
509
- ]
510
- },
511
- {
512
- "point_id": 29,
513
- "adjacent_points": [
514
- 28,
515
- 30,
516
- 39
517
- ],
518
- "adjacent_hexes": [
519
- 13,
520
- 8
521
- ]
522
- },
523
- {
524
- "point_id": 30,
525
- "adjacent_points": [
526
- 29,
527
- 31,
528
- 19
529
- ],
530
- "adjacent_hexes": [
531
- 13,
532
- 9,
533
- 8
534
- ]
535
- },
536
- {
537
- "point_id": 31,
538
- "adjacent_points": [
539
- 30,
540
- 32,
541
- 41
542
- ],
543
- "adjacent_hexes": [
544
- 14,
545
- 13,
546
- 9
547
- ]
548
- },
549
- {
550
- "point_id": 32,
551
- "adjacent_points": [
552
- 31,
553
- 33,
554
- 21
555
- ],
556
- "adjacent_hexes": [
557
- 14,
558
- 10,
559
- 9
560
- ]
561
- },
562
- {
563
- "point_id": 33,
564
- "adjacent_points": [
565
- 32,
566
- 34,
567
- 43
568
- ],
569
- "adjacent_hexes": [
570
- 15,
571
- 14,
572
- 10
573
- ]
574
- },
575
- {
576
- "point_id": 34,
577
- "adjacent_points": [
578
- 33,
579
- 35,
580
- 23
581
- ],
582
- "adjacent_hexes": [
583
- 15,
584
- 11,
585
- 10
586
- ]
587
- },
588
- {
589
- "point_id": 35,
590
- "adjacent_points": [
591
- 34,
592
- 36,
593
- 45
594
- ],
595
- "adjacent_hexes": [
596
- 16,
597
- 15,
598
- 11
599
- ]
600
- },
601
- {
602
- "point_id": 36,
603
- "adjacent_points": [
604
- 35,
605
- 37,
606
- 25
607
- ],
608
- "adjacent_hexes": [
609
- 16,
610
- 12,
611
- 11
612
- ]
613
- },
614
- {
615
- "point_id": 37,
616
- "adjacent_points": [
617
- 36,
618
- 38,
619
- 47
620
- ],
621
- "adjacent_hexes": [
622
- 16,
623
- 12
624
- ]
625
- },
626
- {
627
- "point_id": 38,
628
- "adjacent_points": [
629
- 37,
630
- 27
631
- ],
632
- "adjacent_hexes": [
633
- 12
634
- ]
635
- },
636
- {
637
- "point_id": 39,
638
- "adjacent_points": [
639
- 40,
640
- 29
641
- ],
642
- "adjacent_hexes": [
643
- 13
644
- ]
645
- },
646
- {
647
- "point_id": 40,
648
- "adjacent_points": [
649
- 39,
650
- 41,
651
- 48
652
- ],
653
- "adjacent_hexes": [
654
- 17,
655
- 13
656
- ]
657
- },
658
- {
659
- "point_id": 41,
660
- "adjacent_points": [
661
- 40,
662
- 42,
663
- 31
664
- ],
665
- "adjacent_hexes": [
666
- 17,
667
- 14,
668
- 13
669
- ]
670
- },
671
- {
672
- "point_id": 42,
673
- "adjacent_points": [
674
- 41,
675
- 43,
676
- 50
677
- ],
678
- "adjacent_hexes": [
679
- 18,
680
- 17,
681
- 14
682
- ]
683
- },
684
- {
685
- "point_id": 43,
686
- "adjacent_points": [
687
- 42,
688
- 44,
689
- 33
690
- ],
691
- "adjacent_hexes": [
692
- 18,
693
- 15,
694
- 14
695
- ]
696
- },
697
- {
698
- "point_id": 44,
699
- "adjacent_points": [
700
- 43,
701
- 45,
702
- 52
703
- ],
704
- "adjacent_hexes": [
705
- 19,
706
- 18,
707
- 15
708
- ]
709
- },
710
- {
711
- "point_id": 45,
712
- "adjacent_points": [
713
- 44,
714
- 46,
715
- 35
716
- ],
717
- "adjacent_hexes": [
718
- 19,
719
- 16,
720
- 15
721
- ]
722
- },
723
- {
724
- "point_id": 46,
725
- "adjacent_points": [
726
- 45,
727
- 47,
728
- 54
729
- ],
730
- "adjacent_hexes": [
731
- 19,
732
- 16
733
- ]
734
- },
735
- {
736
- "point_id": 47,
737
- "adjacent_points": [
738
- 46,
739
- 37
740
- ],
741
- "adjacent_hexes": [
742
- 16
743
- ]
744
- },
745
- {
746
- "point_id": 48,
747
- "adjacent_points": [
748
- 49,
749
- 40
750
- ],
751
- "adjacent_hexes": [
752
- 17
753
- ]
754
- },
755
- {
756
- "point_id": 49,
757
- "adjacent_points": [
758
- 48,
759
- 50
760
- ],
761
- "adjacent_hexes": [
762
- 17
763
- ]
764
- },
765
- {
766
- "point_id": 50,
767
- "adjacent_points": [
768
- 49,
769
- 51,
770
- 42
771
- ],
772
- "adjacent_hexes": [
773
- 18,
774
- 17
775
- ]
776
- },
777
- {
778
- "point_id": 51,
779
- "adjacent_points": [
780
- 50,
781
- 52
782
- ],
783
- "adjacent_hexes": [
784
- 18
785
- ]
786
- },
787
- {
788
- "point_id": 52,
789
- "adjacent_points": [
790
- 51,
791
- 53,
792
- 44
793
- ],
794
- "adjacent_hexes": [
795
- 19,
796
- 18
797
- ]
798
- },
799
- {
800
- "point_id": 53,
801
- "adjacent_points": [
802
- 52,
803
- 54
804
- ],
805
- "adjacent_hexes": [
806
- 19
807
- ]
808
- },
809
- {
810
- "point_id": 54,
811
- "adjacent_points": [
812
- 53,
813
- 46
814
- ],
815
- "adjacent_hexes": [
816
- 19
817
- ]
818
- }
819
- ]
820
- }
821
- ]
822
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
examples/ai_testing/my_games/game_20251226_143710_final.json DELETED
@@ -1,816 +0,0 @@
1
- {
2
- "hexes": [
3
- {
4
- "id": 1,
5
- "type": "wood",
6
- "number": 12,
7
- "has_robber": false
8
- },
9
- {
10
- "id": 2,
11
- "type": "sheep",
12
- "number": 5,
13
- "has_robber": false
14
- },
15
- {
16
- "id": 3,
17
- "type": "wood",
18
- "number": 4,
19
- "has_robber": false
20
- },
21
- {
22
- "id": 4,
23
- "type": "sheep",
24
- "number": 8,
25
- "has_robber": false
26
- },
27
- {
28
- "id": 5,
29
- "type": "brick",
30
- "number": 6,
31
- "has_robber": false
32
- },
33
- {
34
- "id": 6,
35
- "type": "wood",
36
- "number": 3,
37
- "has_robber": false
38
- },
39
- {
40
- "id": 7,
41
- "type": "wheat",
42
- "number": 8,
43
- "has_robber": false
44
- },
45
- {
46
- "id": 8,
47
- "type": "brick",
48
- "number": 10,
49
- "has_robber": false
50
- },
51
- {
52
- "id": 9,
53
- "type": "wood",
54
- "number": 11,
55
- "has_robber": false
56
- },
57
- {
58
- "id": 10,
59
- "type": "desert",
60
- "number": null,
61
- "has_robber": true
62
- },
63
- {
64
- "id": 11,
65
- "type": "ore",
66
- "number": 3,
67
- "has_robber": false
68
- },
69
- {
70
- "id": 12,
71
- "type": "sheep",
72
- "number": 4,
73
- "has_robber": false
74
- },
75
- {
76
- "id": 13,
77
- "type": "brick",
78
- "number": 10,
79
- "has_robber": false
80
- },
81
- {
82
- "id": 14,
83
- "type": "wheat",
84
- "number": 9,
85
- "has_robber": false
86
- },
87
- {
88
- "id": 15,
89
- "type": "wheat",
90
- "number": 6,
91
- "has_robber": false
92
- },
93
- {
94
- "id": 16,
95
- "type": "sheep",
96
- "number": 11,
97
- "has_robber": false
98
- },
99
- {
100
- "id": 17,
101
- "type": "ore",
102
- "number": 5,
103
- "has_robber": false
104
- },
105
- {
106
- "id": 18,
107
- "type": "wheat",
108
- "number": 9,
109
- "has_robber": false
110
- },
111
- {
112
- "id": 19,
113
- "type": "ore",
114
- "number": 2,
115
- "has_robber": false
116
- }
117
- ],
118
- "settlements": [],
119
- "cities": [],
120
- "roads": [],
121
- "players": [
122
- {
123
- "id": 0,
124
- "name": "a",
125
- "victory_points": 0,
126
- "total_cards": 0,
127
- "cards_list": [],
128
- "dev_cards_list": [],
129
- "settlements": 0,
130
- "cities": 0,
131
- "roads": 0,
132
- "longest_road": 0,
133
- "has_longest_road": false,
134
- "knights": 0,
135
- "knights_played": 0,
136
- "has_largest_army": false
137
- },
138
- {
139
- "id": 1,
140
- "name": "b",
141
- "victory_points": 0,
142
- "total_cards": 0,
143
- "cards_list": [],
144
- "dev_cards_list": [],
145
- "settlements": 0,
146
- "cities": 0,
147
- "roads": 0,
148
- "longest_road": 0,
149
- "has_longest_road": false,
150
- "knights": 0,
151
- "knights_played": 0,
152
- "has_largest_army": false
153
- },
154
- {
155
- "id": 2,
156
- "name": "c",
157
- "victory_points": 0,
158
- "total_cards": 0,
159
- "cards_list": [],
160
- "dev_cards_list": [],
161
- "settlements": 0,
162
- "cities": 0,
163
- "roads": 0,
164
- "longest_road": 0,
165
- "has_longest_road": false,
166
- "knights": 0,
167
- "knights_played": 0,
168
- "has_largest_army": false
169
- }
170
- ],
171
- "current_player": 0,
172
- "current_phase": "SETUP_FIRST_ROUND",
173
- "robber_position": [
174
- 2,
175
- 2
176
- ],
177
- "dice_result": null,
178
- "points": [
179
- {
180
- "point_id": 1,
181
- "adjacent_points": [
182
- 2,
183
- 9
184
- ],
185
- "adjacent_hexes": [
186
- 1
187
- ]
188
- },
189
- {
190
- "point_id": 2,
191
- "adjacent_points": [
192
- 1,
193
- 3
194
- ],
195
- "adjacent_hexes": [
196
- 1
197
- ]
198
- },
199
- {
200
- "point_id": 3,
201
- "adjacent_points": [
202
- 2,
203
- 4,
204
- 11
205
- ],
206
- "adjacent_hexes": [
207
- 2,
208
- 1
209
- ]
210
- },
211
- {
212
- "point_id": 4,
213
- "adjacent_points": [
214
- 3,
215
- 5
216
- ],
217
- "adjacent_hexes": [
218
- 2
219
- ]
220
- },
221
- {
222
- "point_id": 5,
223
- "adjacent_points": [
224
- 4,
225
- 6,
226
- 13
227
- ],
228
- "adjacent_hexes": [
229
- 3,
230
- 2
231
- ]
232
- },
233
- {
234
- "point_id": 6,
235
- "adjacent_points": [
236
- 5,
237
- 7
238
- ],
239
- "adjacent_hexes": [
240
- 3
241
- ]
242
- },
243
- {
244
- "point_id": 7,
245
- "adjacent_points": [
246
- 6,
247
- 15
248
- ],
249
- "adjacent_hexes": [
250
- 3
251
- ]
252
- },
253
- {
254
- "point_id": 8,
255
- "adjacent_points": [
256
- 9,
257
- 18
258
- ],
259
- "adjacent_hexes": [
260
- 4
261
- ]
262
- },
263
- {
264
- "point_id": 9,
265
- "adjacent_points": [
266
- 8,
267
- 10,
268
- 1
269
- ],
270
- "adjacent_hexes": [
271
- 4,
272
- 1
273
- ]
274
- },
275
- {
276
- "point_id": 10,
277
- "adjacent_points": [
278
- 9,
279
- 11,
280
- 20
281
- ],
282
- "adjacent_hexes": [
283
- 5,
284
- 4,
285
- 1
286
- ]
287
- },
288
- {
289
- "point_id": 11,
290
- "adjacent_points": [
291
- 10,
292
- 12,
293
- 3
294
- ],
295
- "adjacent_hexes": [
296
- 5,
297
- 2,
298
- 1
299
- ]
300
- },
301
- {
302
- "point_id": 12,
303
- "adjacent_points": [
304
- 11,
305
- 13,
306
- 22
307
- ],
308
- "adjacent_hexes": [
309
- 6,
310
- 5,
311
- 2
312
- ]
313
- },
314
- {
315
- "point_id": 13,
316
- "adjacent_points": [
317
- 12,
318
- 14,
319
- 5
320
- ],
321
- "adjacent_hexes": [
322
- 6,
323
- 3,
324
- 2
325
- ]
326
- },
327
- {
328
- "point_id": 14,
329
- "adjacent_points": [
330
- 13,
331
- 15,
332
- 24
333
- ],
334
- "adjacent_hexes": [
335
- 7,
336
- 6,
337
- 3
338
- ]
339
- },
340
- {
341
- "point_id": 15,
342
- "adjacent_points": [
343
- 14,
344
- 16,
345
- 7
346
- ],
347
- "adjacent_hexes": [
348
- 7,
349
- 3
350
- ]
351
- },
352
- {
353
- "point_id": 16,
354
- "adjacent_points": [
355
- 15,
356
- 26
357
- ],
358
- "adjacent_hexes": [
359
- 7
360
- ]
361
- },
362
- {
363
- "point_id": 17,
364
- "adjacent_points": [
365
- 18,
366
- 28
367
- ],
368
- "adjacent_hexes": [
369
- 8
370
- ]
371
- },
372
- {
373
- "point_id": 18,
374
- "adjacent_points": [
375
- 17,
376
- 19,
377
- 8
378
- ],
379
- "adjacent_hexes": [
380
- 8,
381
- 4
382
- ]
383
- },
384
- {
385
- "point_id": 19,
386
- "adjacent_points": [
387
- 18,
388
- 20,
389
- 30
390
- ],
391
- "adjacent_hexes": [
392
- 9,
393
- 8,
394
- 4
395
- ]
396
- },
397
- {
398
- "point_id": 20,
399
- "adjacent_points": [
400
- 19,
401
- 21,
402
- 10
403
- ],
404
- "adjacent_hexes": [
405
- 9,
406
- 5,
407
- 4
408
- ]
409
- },
410
- {
411
- "point_id": 21,
412
- "adjacent_points": [
413
- 20,
414
- 22,
415
- 32
416
- ],
417
- "adjacent_hexes": [
418
- 10,
419
- 9,
420
- 5
421
- ]
422
- },
423
- {
424
- "point_id": 22,
425
- "adjacent_points": [
426
- 21,
427
- 23,
428
- 12
429
- ],
430
- "adjacent_hexes": [
431
- 10,
432
- 6,
433
- 5
434
- ]
435
- },
436
- {
437
- "point_id": 23,
438
- "adjacent_points": [
439
- 22,
440
- 24,
441
- 34
442
- ],
443
- "adjacent_hexes": [
444
- 11,
445
- 10,
446
- 6
447
- ]
448
- },
449
- {
450
- "point_id": 24,
451
- "adjacent_points": [
452
- 23,
453
- 25,
454
- 14
455
- ],
456
- "adjacent_hexes": [
457
- 11,
458
- 7,
459
- 6
460
- ]
461
- },
462
- {
463
- "point_id": 25,
464
- "adjacent_points": [
465
- 24,
466
- 26,
467
- 36
468
- ],
469
- "adjacent_hexes": [
470
- 12,
471
- 11,
472
- 7
473
- ]
474
- },
475
- {
476
- "point_id": 26,
477
- "adjacent_points": [
478
- 25,
479
- 27,
480
- 16
481
- ],
482
- "adjacent_hexes": [
483
- 12,
484
- 7
485
- ]
486
- },
487
- {
488
- "point_id": 27,
489
- "adjacent_points": [
490
- 26,
491
- 38
492
- ],
493
- "adjacent_hexes": [
494
- 12
495
- ]
496
- },
497
- {
498
- "point_id": 28,
499
- "adjacent_points": [
500
- 29,
501
- 17
502
- ],
503
- "adjacent_hexes": [
504
- 8
505
- ]
506
- },
507
- {
508
- "point_id": 29,
509
- "adjacent_points": [
510
- 28,
511
- 30,
512
- 39
513
- ],
514
- "adjacent_hexes": [
515
- 13,
516
- 8
517
- ]
518
- },
519
- {
520
- "point_id": 30,
521
- "adjacent_points": [
522
- 29,
523
- 31,
524
- 19
525
- ],
526
- "adjacent_hexes": [
527
- 13,
528
- 9,
529
- 8
530
- ]
531
- },
532
- {
533
- "point_id": 31,
534
- "adjacent_points": [
535
- 30,
536
- 32,
537
- 41
538
- ],
539
- "adjacent_hexes": [
540
- 14,
541
- 13,
542
- 9
543
- ]
544
- },
545
- {
546
- "point_id": 32,
547
- "adjacent_points": [
548
- 31,
549
- 33,
550
- 21
551
- ],
552
- "adjacent_hexes": [
553
- 14,
554
- 10,
555
- 9
556
- ]
557
- },
558
- {
559
- "point_id": 33,
560
- "adjacent_points": [
561
- 32,
562
- 34,
563
- 43
564
- ],
565
- "adjacent_hexes": [
566
- 15,
567
- 14,
568
- 10
569
- ]
570
- },
571
- {
572
- "point_id": 34,
573
- "adjacent_points": [
574
- 33,
575
- 35,
576
- 23
577
- ],
578
- "adjacent_hexes": [
579
- 15,
580
- 11,
581
- 10
582
- ]
583
- },
584
- {
585
- "point_id": 35,
586
- "adjacent_points": [
587
- 34,
588
- 36,
589
- 45
590
- ],
591
- "adjacent_hexes": [
592
- 16,
593
- 15,
594
- 11
595
- ]
596
- },
597
- {
598
- "point_id": 36,
599
- "adjacent_points": [
600
- 35,
601
- 37,
602
- 25
603
- ],
604
- "adjacent_hexes": [
605
- 16,
606
- 12,
607
- 11
608
- ]
609
- },
610
- {
611
- "point_id": 37,
612
- "adjacent_points": [
613
- 36,
614
- 38,
615
- 47
616
- ],
617
- "adjacent_hexes": [
618
- 16,
619
- 12
620
- ]
621
- },
622
- {
623
- "point_id": 38,
624
- "adjacent_points": [
625
- 37,
626
- 27
627
- ],
628
- "adjacent_hexes": [
629
- 12
630
- ]
631
- },
632
- {
633
- "point_id": 39,
634
- "adjacent_points": [
635
- 40,
636
- 29
637
- ],
638
- "adjacent_hexes": [
639
- 13
640
- ]
641
- },
642
- {
643
- "point_id": 40,
644
- "adjacent_points": [
645
- 39,
646
- 41,
647
- 48
648
- ],
649
- "adjacent_hexes": [
650
- 17,
651
- 13
652
- ]
653
- },
654
- {
655
- "point_id": 41,
656
- "adjacent_points": [
657
- 40,
658
- 42,
659
- 31
660
- ],
661
- "adjacent_hexes": [
662
- 17,
663
- 14,
664
- 13
665
- ]
666
- },
667
- {
668
- "point_id": 42,
669
- "adjacent_points": [
670
- 41,
671
- 43,
672
- 50
673
- ],
674
- "adjacent_hexes": [
675
- 18,
676
- 17,
677
- 14
678
- ]
679
- },
680
- {
681
- "point_id": 43,
682
- "adjacent_points": [
683
- 42,
684
- 44,
685
- 33
686
- ],
687
- "adjacent_hexes": [
688
- 18,
689
- 15,
690
- 14
691
- ]
692
- },
693
- {
694
- "point_id": 44,
695
- "adjacent_points": [
696
- 43,
697
- 45,
698
- 52
699
- ],
700
- "adjacent_hexes": [
701
- 19,
702
- 18,
703
- 15
704
- ]
705
- },
706
- {
707
- "point_id": 45,
708
- "adjacent_points": [
709
- 44,
710
- 46,
711
- 35
712
- ],
713
- "adjacent_hexes": [
714
- 19,
715
- 16,
716
- 15
717
- ]
718
- },
719
- {
720
- "point_id": 46,
721
- "adjacent_points": [
722
- 45,
723
- 47,
724
- 54
725
- ],
726
- "adjacent_hexes": [
727
- 19,
728
- 16
729
- ]
730
- },
731
- {
732
- "point_id": 47,
733
- "adjacent_points": [
734
- 46,
735
- 37
736
- ],
737
- "adjacent_hexes": [
738
- 16
739
- ]
740
- },
741
- {
742
- "point_id": 48,
743
- "adjacent_points": [
744
- 49,
745
- 40
746
- ],
747
- "adjacent_hexes": [
748
- 17
749
- ]
750
- },
751
- {
752
- "point_id": 49,
753
- "adjacent_points": [
754
- 48,
755
- 50
756
- ],
757
- "adjacent_hexes": [
758
- 17
759
- ]
760
- },
761
- {
762
- "point_id": 50,
763
- "adjacent_points": [
764
- 49,
765
- 51,
766
- 42
767
- ],
768
- "adjacent_hexes": [
769
- 18,
770
- 17
771
- ]
772
- },
773
- {
774
- "point_id": 51,
775
- "adjacent_points": [
776
- 50,
777
- 52
778
- ],
779
- "adjacent_hexes": [
780
- 18
781
- ]
782
- },
783
- {
784
- "point_id": 52,
785
- "adjacent_points": [
786
- 51,
787
- 53,
788
- 44
789
- ],
790
- "adjacent_hexes": [
791
- 19,
792
- 18
793
- ]
794
- },
795
- {
796
- "point_id": 53,
797
- "adjacent_points": [
798
- 52,
799
- 54
800
- ],
801
- "adjacent_hexes": [
802
- 19
803
- ]
804
- },
805
- {
806
- "point_id": 54,
807
- "adjacent_points": [
808
- 53,
809
- 46
810
- ],
811
- "adjacent_hexes": [
812
- 19
813
- ]
814
- }
815
- ]
816
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
examples/ai_testing/my_games/game_20251226_143710_full.json DELETED
@@ -1,822 +0,0 @@
1
- {
2
- "total_states": 1,
3
- "timestamp": "20251226_143710",
4
- "states": [
5
- {
6
- "hexes": [
7
- {
8
- "id": 1,
9
- "type": "wood",
10
- "number": 12,
11
- "has_robber": false
12
- },
13
- {
14
- "id": 2,
15
- "type": "sheep",
16
- "number": 5,
17
- "has_robber": false
18
- },
19
- {
20
- "id": 3,
21
- "type": "wood",
22
- "number": 4,
23
- "has_robber": false
24
- },
25
- {
26
- "id": 4,
27
- "type": "sheep",
28
- "number": 8,
29
- "has_robber": false
30
- },
31
- {
32
- "id": 5,
33
- "type": "brick",
34
- "number": 6,
35
- "has_robber": false
36
- },
37
- {
38
- "id": 6,
39
- "type": "wood",
40
- "number": 3,
41
- "has_robber": false
42
- },
43
- {
44
- "id": 7,
45
- "type": "wheat",
46
- "number": 8,
47
- "has_robber": false
48
- },
49
- {
50
- "id": 8,
51
- "type": "brick",
52
- "number": 10,
53
- "has_robber": false
54
- },
55
- {
56
- "id": 9,
57
- "type": "wood",
58
- "number": 11,
59
- "has_robber": false
60
- },
61
- {
62
- "id": 10,
63
- "type": "desert",
64
- "number": null,
65
- "has_robber": true
66
- },
67
- {
68
- "id": 11,
69
- "type": "ore",
70
- "number": 3,
71
- "has_robber": false
72
- },
73
- {
74
- "id": 12,
75
- "type": "sheep",
76
- "number": 4,
77
- "has_robber": false
78
- },
79
- {
80
- "id": 13,
81
- "type": "brick",
82
- "number": 10,
83
- "has_robber": false
84
- },
85
- {
86
- "id": 14,
87
- "type": "wheat",
88
- "number": 9,
89
- "has_robber": false
90
- },
91
- {
92
- "id": 15,
93
- "type": "wheat",
94
- "number": 6,
95
- "has_robber": false
96
- },
97
- {
98
- "id": 16,
99
- "type": "sheep",
100
- "number": 11,
101
- "has_robber": false
102
- },
103
- {
104
- "id": 17,
105
- "type": "ore",
106
- "number": 5,
107
- "has_robber": false
108
- },
109
- {
110
- "id": 18,
111
- "type": "wheat",
112
- "number": 9,
113
- "has_robber": false
114
- },
115
- {
116
- "id": 19,
117
- "type": "ore",
118
- "number": 2,
119
- "has_robber": false
120
- }
121
- ],
122
- "settlements": [],
123
- "cities": [],
124
- "roads": [],
125
- "players": [
126
- {
127
- "id": 0,
128
- "name": "a",
129
- "victory_points": 0,
130
- "total_cards": 0,
131
- "cards_list": [],
132
- "dev_cards_list": [],
133
- "settlements": 0,
134
- "cities": 0,
135
- "roads": 0,
136
- "longest_road": 0,
137
- "has_longest_road": false,
138
- "knights": 0,
139
- "knights_played": 0,
140
- "has_largest_army": false
141
- },
142
- {
143
- "id": 1,
144
- "name": "b",
145
- "victory_points": 0,
146
- "total_cards": 0,
147
- "cards_list": [],
148
- "dev_cards_list": [],
149
- "settlements": 0,
150
- "cities": 0,
151
- "roads": 0,
152
- "longest_road": 0,
153
- "has_longest_road": false,
154
- "knights": 0,
155
- "knights_played": 0,
156
- "has_largest_army": false
157
- },
158
- {
159
- "id": 2,
160
- "name": "c",
161
- "victory_points": 0,
162
- "total_cards": 0,
163
- "cards_list": [],
164
- "dev_cards_list": [],
165
- "settlements": 0,
166
- "cities": 0,
167
- "roads": 0,
168
- "longest_road": 0,
169
- "has_longest_road": false,
170
- "knights": 0,
171
- "knights_played": 0,
172
- "has_largest_army": false
173
- }
174
- ],
175
- "current_player": 0,
176
- "current_phase": "SETUP_FIRST_ROUND",
177
- "robber_position": [
178
- 2,
179
- 2
180
- ],
181
- "dice_result": null,
182
- "points": [
183
- {
184
- "point_id": 1,
185
- "adjacent_points": [
186
- 2,
187
- 9
188
- ],
189
- "adjacent_hexes": [
190
- 1
191
- ]
192
- },
193
- {
194
- "point_id": 2,
195
- "adjacent_points": [
196
- 1,
197
- 3
198
- ],
199
- "adjacent_hexes": [
200
- 1
201
- ]
202
- },
203
- {
204
- "point_id": 3,
205
- "adjacent_points": [
206
- 2,
207
- 4,
208
- 11
209
- ],
210
- "adjacent_hexes": [
211
- 2,
212
- 1
213
- ]
214
- },
215
- {
216
- "point_id": 4,
217
- "adjacent_points": [
218
- 3,
219
- 5
220
- ],
221
- "adjacent_hexes": [
222
- 2
223
- ]
224
- },
225
- {
226
- "point_id": 5,
227
- "adjacent_points": [
228
- 4,
229
- 6,
230
- 13
231
- ],
232
- "adjacent_hexes": [
233
- 3,
234
- 2
235
- ]
236
- },
237
- {
238
- "point_id": 6,
239
- "adjacent_points": [
240
- 5,
241
- 7
242
- ],
243
- "adjacent_hexes": [
244
- 3
245
- ]
246
- },
247
- {
248
- "point_id": 7,
249
- "adjacent_points": [
250
- 6,
251
- 15
252
- ],
253
- "adjacent_hexes": [
254
- 3
255
- ]
256
- },
257
- {
258
- "point_id": 8,
259
- "adjacent_points": [
260
- 9,
261
- 18
262
- ],
263
- "adjacent_hexes": [
264
- 4
265
- ]
266
- },
267
- {
268
- "point_id": 9,
269
- "adjacent_points": [
270
- 8,
271
- 10,
272
- 1
273
- ],
274
- "adjacent_hexes": [
275
- 4,
276
- 1
277
- ]
278
- },
279
- {
280
- "point_id": 10,
281
- "adjacent_points": [
282
- 9,
283
- 11,
284
- 20
285
- ],
286
- "adjacent_hexes": [
287
- 5,
288
- 4,
289
- 1
290
- ]
291
- },
292
- {
293
- "point_id": 11,
294
- "adjacent_points": [
295
- 10,
296
- 12,
297
- 3
298
- ],
299
- "adjacent_hexes": [
300
- 5,
301
- 2,
302
- 1
303
- ]
304
- },
305
- {
306
- "point_id": 12,
307
- "adjacent_points": [
308
- 11,
309
- 13,
310
- 22
311
- ],
312
- "adjacent_hexes": [
313
- 6,
314
- 5,
315
- 2
316
- ]
317
- },
318
- {
319
- "point_id": 13,
320
- "adjacent_points": [
321
- 12,
322
- 14,
323
- 5
324
- ],
325
- "adjacent_hexes": [
326
- 6,
327
- 3,
328
- 2
329
- ]
330
- },
331
- {
332
- "point_id": 14,
333
- "adjacent_points": [
334
- 13,
335
- 15,
336
- 24
337
- ],
338
- "adjacent_hexes": [
339
- 7,
340
- 6,
341
- 3
342
- ]
343
- },
344
- {
345
- "point_id": 15,
346
- "adjacent_points": [
347
- 14,
348
- 16,
349
- 7
350
- ],
351
- "adjacent_hexes": [
352
- 7,
353
- 3
354
- ]
355
- },
356
- {
357
- "point_id": 16,
358
- "adjacent_points": [
359
- 15,
360
- 26
361
- ],
362
- "adjacent_hexes": [
363
- 7
364
- ]
365
- },
366
- {
367
- "point_id": 17,
368
- "adjacent_points": [
369
- 18,
370
- 28
371
- ],
372
- "adjacent_hexes": [
373
- 8
374
- ]
375
- },
376
- {
377
- "point_id": 18,
378
- "adjacent_points": [
379
- 17,
380
- 19,
381
- 8
382
- ],
383
- "adjacent_hexes": [
384
- 8,
385
- 4
386
- ]
387
- },
388
- {
389
- "point_id": 19,
390
- "adjacent_points": [
391
- 18,
392
- 20,
393
- 30
394
- ],
395
- "adjacent_hexes": [
396
- 9,
397
- 8,
398
- 4
399
- ]
400
- },
401
- {
402
- "point_id": 20,
403
- "adjacent_points": [
404
- 19,
405
- 21,
406
- 10
407
- ],
408
- "adjacent_hexes": [
409
- 9,
410
- 5,
411
- 4
412
- ]
413
- },
414
- {
415
- "point_id": 21,
416
- "adjacent_points": [
417
- 20,
418
- 22,
419
- 32
420
- ],
421
- "adjacent_hexes": [
422
- 10,
423
- 9,
424
- 5
425
- ]
426
- },
427
- {
428
- "point_id": 22,
429
- "adjacent_points": [
430
- 21,
431
- 23,
432
- 12
433
- ],
434
- "adjacent_hexes": [
435
- 10,
436
- 6,
437
- 5
438
- ]
439
- },
440
- {
441
- "point_id": 23,
442
- "adjacent_points": [
443
- 22,
444
- 24,
445
- 34
446
- ],
447
- "adjacent_hexes": [
448
- 11,
449
- 10,
450
- 6
451
- ]
452
- },
453
- {
454
- "point_id": 24,
455
- "adjacent_points": [
456
- 23,
457
- 25,
458
- 14
459
- ],
460
- "adjacent_hexes": [
461
- 11,
462
- 7,
463
- 6
464
- ]
465
- },
466
- {
467
- "point_id": 25,
468
- "adjacent_points": [
469
- 24,
470
- 26,
471
- 36
472
- ],
473
- "adjacent_hexes": [
474
- 12,
475
- 11,
476
- 7
477
- ]
478
- },
479
- {
480
- "point_id": 26,
481
- "adjacent_points": [
482
- 25,
483
- 27,
484
- 16
485
- ],
486
- "adjacent_hexes": [
487
- 12,
488
- 7
489
- ]
490
- },
491
- {
492
- "point_id": 27,
493
- "adjacent_points": [
494
- 26,
495
- 38
496
- ],
497
- "adjacent_hexes": [
498
- 12
499
- ]
500
- },
501
- {
502
- "point_id": 28,
503
- "adjacent_points": [
504
- 29,
505
- 17
506
- ],
507
- "adjacent_hexes": [
508
- 8
509
- ]
510
- },
511
- {
512
- "point_id": 29,
513
- "adjacent_points": [
514
- 28,
515
- 30,
516
- 39
517
- ],
518
- "adjacent_hexes": [
519
- 13,
520
- 8
521
- ]
522
- },
523
- {
524
- "point_id": 30,
525
- "adjacent_points": [
526
- 29,
527
- 31,
528
- 19
529
- ],
530
- "adjacent_hexes": [
531
- 13,
532
- 9,
533
- 8
534
- ]
535
- },
536
- {
537
- "point_id": 31,
538
- "adjacent_points": [
539
- 30,
540
- 32,
541
- 41
542
- ],
543
- "adjacent_hexes": [
544
- 14,
545
- 13,
546
- 9
547
- ]
548
- },
549
- {
550
- "point_id": 32,
551
- "adjacent_points": [
552
- 31,
553
- 33,
554
- 21
555
- ],
556
- "adjacent_hexes": [
557
- 14,
558
- 10,
559
- 9
560
- ]
561
- },
562
- {
563
- "point_id": 33,
564
- "adjacent_points": [
565
- 32,
566
- 34,
567
- 43
568
- ],
569
- "adjacent_hexes": [
570
- 15,
571
- 14,
572
- 10
573
- ]
574
- },
575
- {
576
- "point_id": 34,
577
- "adjacent_points": [
578
- 33,
579
- 35,
580
- 23
581
- ],
582
- "adjacent_hexes": [
583
- 15,
584
- 11,
585
- 10
586
- ]
587
- },
588
- {
589
- "point_id": 35,
590
- "adjacent_points": [
591
- 34,
592
- 36,
593
- 45
594
- ],
595
- "adjacent_hexes": [
596
- 16,
597
- 15,
598
- 11
599
- ]
600
- },
601
- {
602
- "point_id": 36,
603
- "adjacent_points": [
604
- 35,
605
- 37,
606
- 25
607
- ],
608
- "adjacent_hexes": [
609
- 16,
610
- 12,
611
- 11
612
- ]
613
- },
614
- {
615
- "point_id": 37,
616
- "adjacent_points": [
617
- 36,
618
- 38,
619
- 47
620
- ],
621
- "adjacent_hexes": [
622
- 16,
623
- 12
624
- ]
625
- },
626
- {
627
- "point_id": 38,
628
- "adjacent_points": [
629
- 37,
630
- 27
631
- ],
632
- "adjacent_hexes": [
633
- 12
634
- ]
635
- },
636
- {
637
- "point_id": 39,
638
- "adjacent_points": [
639
- 40,
640
- 29
641
- ],
642
- "adjacent_hexes": [
643
- 13
644
- ]
645
- },
646
- {
647
- "point_id": 40,
648
- "adjacent_points": [
649
- 39,
650
- 41,
651
- 48
652
- ],
653
- "adjacent_hexes": [
654
- 17,
655
- 13
656
- ]
657
- },
658
- {
659
- "point_id": 41,
660
- "adjacent_points": [
661
- 40,
662
- 42,
663
- 31
664
- ],
665
- "adjacent_hexes": [
666
- 17,
667
- 14,
668
- 13
669
- ]
670
- },
671
- {
672
- "point_id": 42,
673
- "adjacent_points": [
674
- 41,
675
- 43,
676
- 50
677
- ],
678
- "adjacent_hexes": [
679
- 18,
680
- 17,
681
- 14
682
- ]
683
- },
684
- {
685
- "point_id": 43,
686
- "adjacent_points": [
687
- 42,
688
- 44,
689
- 33
690
- ],
691
- "adjacent_hexes": [
692
- 18,
693
- 15,
694
- 14
695
- ]
696
- },
697
- {
698
- "point_id": 44,
699
- "adjacent_points": [
700
- 43,
701
- 45,
702
- 52
703
- ],
704
- "adjacent_hexes": [
705
- 19,
706
- 18,
707
- 15
708
- ]
709
- },
710
- {
711
- "point_id": 45,
712
- "adjacent_points": [
713
- 44,
714
- 46,
715
- 35
716
- ],
717
- "adjacent_hexes": [
718
- 19,
719
- 16,
720
- 15
721
- ]
722
- },
723
- {
724
- "point_id": 46,
725
- "adjacent_points": [
726
- 45,
727
- 47,
728
- 54
729
- ],
730
- "adjacent_hexes": [
731
- 19,
732
- 16
733
- ]
734
- },
735
- {
736
- "point_id": 47,
737
- "adjacent_points": [
738
- 46,
739
- 37
740
- ],
741
- "adjacent_hexes": [
742
- 16
743
- ]
744
- },
745
- {
746
- "point_id": 48,
747
- "adjacent_points": [
748
- 49,
749
- 40
750
- ],
751
- "adjacent_hexes": [
752
- 17
753
- ]
754
- },
755
- {
756
- "point_id": 49,
757
- "adjacent_points": [
758
- 48,
759
- 50
760
- ],
761
- "adjacent_hexes": [
762
- 17
763
- ]
764
- },
765
- {
766
- "point_id": 50,
767
- "adjacent_points": [
768
- 49,
769
- 51,
770
- 42
771
- ],
772
- "adjacent_hexes": [
773
- 18,
774
- 17
775
- ]
776
- },
777
- {
778
- "point_id": 51,
779
- "adjacent_points": [
780
- 50,
781
- 52
782
- ],
783
- "adjacent_hexes": [
784
- 18
785
- ]
786
- },
787
- {
788
- "point_id": 52,
789
- "adjacent_points": [
790
- 51,
791
- 53,
792
- 44
793
- ],
794
- "adjacent_hexes": [
795
- 19,
796
- 18
797
- ]
798
- },
799
- {
800
- "point_id": 53,
801
- "adjacent_points": [
802
- 52,
803
- 54
804
- ],
805
- "adjacent_hexes": [
806
- 19
807
- ]
808
- },
809
- {
810
- "point_id": 54,
811
- "adjacent_points": [
812
- 53,
813
- 46
814
- ],
815
- "adjacent_hexes": [
816
- 19
817
- ]
818
- }
819
- ]
820
- }
821
- ]
822
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
examples/ai_testing/play_and_capture.py CHANGED
@@ -21,6 +21,25 @@ from pycatan.management import game_manager as gm_module
21
  captured_states = []
22
  original_update_state = None
23
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
24
 
25
  def capturing_wrapper(original_method):
26
  """Wrap the display_game_state method to capture all calls."""
@@ -36,6 +55,10 @@ def capturing_wrapper(original_method):
36
  state_copy = json.loads(json.dumps(viz.current_game_state))
37
  captured_states.append(state_copy)
38
  print(f"[✅ Captured state #{len(captured_states)}]", flush=True)
 
 
 
 
39
  break # Only capture once per update
40
  except (TypeError, AttributeError) as e:
41
  # Skip if not serializable
@@ -114,6 +137,7 @@ def save_all_states():
114
  print(f" 📁 Full history: {history_file}")
115
  print(f" 📄 Final state: {final_file}")
116
  print(f" 📌 Quick access: {sample_file}")
 
117
  print("\n" + "="*80)
118
 
119
  # Print summary
@@ -152,8 +176,10 @@ def main():
152
  print("="*80)
153
  print("🎮 CATAN WITH GUARANTEED STATE CAPTURE")
154
  print("="*80)
155
- print("\nEvery game action will be automatically saved!")
156
- print("Press Ctrl+C anytime to stop and save.")
 
 
157
  print("="*80 + "\n")
158
 
159
  # Patch the VisualizationManager's display_game_state
@@ -176,6 +202,9 @@ def main():
176
  state_copy = json.loads(json.dumps(self.current_game_state))
177
  captured_states.append(state_copy)
178
  print(f"[✅ Captured state #{len(captured_states)}]", flush=True)
 
 
 
179
 
180
  return result
181
 
 
21
  captured_states = []
22
  original_update_state = None
23
 
24
+ # Output directory for states
25
+ OUTPUT_DIR = Path('examples/ai_testing/my_games')
26
+ CURRENT_STATE_FILE = OUTPUT_DIR / 'current_state.json'
27
+
28
+
29
+ def save_current_state(state):
30
+ """Save the current state to a file (updated in real-time)."""
31
+ try:
32
+ OUTPUT_DIR.mkdir(exist_ok=True)
33
+ cleaned = clean_state_for_llm(state)
34
+ with open(CURRENT_STATE_FILE, 'w', encoding='utf-8') as f:
35
+ json.dump({
36
+ 'timestamp': datetime.now().isoformat(),
37
+ 'state_number': len(captured_states),
38
+ 'state': cleaned
39
+ }, f, indent=2, ensure_ascii=False)
40
+ except Exception as e:
41
+ print(f"[⚠️ Failed to save current state: {e}]", flush=True)
42
+
43
 
44
  def capturing_wrapper(original_method):
45
  """Wrap the display_game_state method to capture all calls."""
 
55
  state_copy = json.loads(json.dumps(viz.current_game_state))
56
  captured_states.append(state_copy)
57
  print(f"[✅ Captured state #{len(captured_states)}]", flush=True)
58
+
59
+ # Save current state to file (real-time update)
60
+ save_current_state(state_copy)
61
+
62
  break # Only capture once per update
63
  except (TypeError, AttributeError) as e:
64
  # Skip if not serializable
 
137
  print(f" 📁 Full history: {history_file}")
138
  print(f" 📄 Final state: {final_file}")
139
  print(f" 📌 Quick access: {sample_file}")
140
+ print(f" 🔄 Real-time: {CURRENT_STATE_FILE} (updated during game)")
141
  print("\n" + "="*80)
142
 
143
  # Print summary
 
176
  print("="*80)
177
  print("🎮 CATAN WITH GUARANTEED STATE CAPTURE")
178
  print("="*80)
179
+ print("\n📝 Every game action will be automatically saved!")
180
+ print(f"🔄 Real-time state: {CURRENT_STATE_FILE}")
181
+ print("💾 Full history saved at end of game")
182
+ print("⌨️ Press Ctrl+C anytime to stop and save.")
183
  print("="*80 + "\n")
184
 
185
  # Patch the VisualizationManager's display_game_state
 
202
  state_copy = json.loads(json.dumps(self.current_game_state))
203
  captured_states.append(state_copy)
204
  print(f"[✅ Captured state #{len(captured_states)}]", flush=True)
205
+
206
+ # Save current state to file (real-time update)
207
+ save_current_state(state_copy)
208
 
209
  return result
210
 
examples/ai_testing/sample_states/captured_game.json CHANGED
@@ -115,21 +115,158 @@
115
  "has_robber": false
116
  }
117
  ],
118
- "settlements": [],
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
119
  "cities": [],
120
- "roads": [],
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
121
  "players": [
122
  {
123
  "id": 0,
124
  "name": "a",
125
- "victory_points": 0,
126
- "total_cards": 0,
127
- "cards_list": [],
 
 
 
 
128
  "dev_cards_list": [],
129
- "settlements": 0,
130
  "cities": 0,
131
- "roads": 0,
132
- "longest_road": 0,
133
  "has_longest_road": false,
134
  "knights": 0,
135
  "knights_played": 0,
@@ -138,14 +275,19 @@
138
  {
139
  "id": 1,
140
  "name": "b",
141
- "victory_points": 0,
142
- "total_cards": 0,
143
- "cards_list": [],
 
 
 
 
 
144
  "dev_cards_list": [],
145
- "settlements": 0,
146
  "cities": 0,
147
- "roads": 0,
148
- "longest_road": 0,
149
  "has_longest_road": false,
150
  "knights": 0,
151
  "knights_played": 0,
@@ -154,22 +296,26 @@
154
  {
155
  "id": 2,
156
  "name": "c",
157
- "victory_points": 0,
158
- "total_cards": 0,
159
- "cards_list": [],
 
 
 
 
160
  "dev_cards_list": [],
161
- "settlements": 0,
162
  "cities": 0,
163
- "roads": 0,
164
- "longest_road": 0,
165
  "has_longest_road": false,
166
  "knights": 0,
167
  "knights_played": 0,
168
  "has_largest_army": false
169
  }
170
  ],
171
- "current_player": 0,
172
- "current_phase": "SETUP_FIRST_ROUND",
173
  "robber_position": [
174
  2,
175
  2
 
115
  "has_robber": false
116
  }
117
  ],
118
+ "settlements": [
119
+ {
120
+ "id": "b_10",
121
+ "vertex": 10,
122
+ "player": 1
123
+ },
124
+ {
125
+ "id": "b_14",
126
+ "vertex": 14,
127
+ "player": 2
128
+ },
129
+ {
130
+ "id": "b_31",
131
+ "vertex": 31,
132
+ "player": 3
133
+ },
134
+ {
135
+ "id": "b_36",
136
+ "vertex": 36,
137
+ "player": 2
138
+ },
139
+ {
140
+ "id": "b_40",
141
+ "vertex": 40,
142
+ "player": 1
143
+ },
144
+ {
145
+ "id": "b_44",
146
+ "vertex": 44,
147
+ "player": 3
148
+ }
149
+ ],
150
  "cities": [],
151
+ "roads": [
152
+ {
153
+ "id": 1,
154
+ "from": 10,
155
+ "to": 11,
156
+ "player": 1
157
+ },
158
+ {
159
+ "id": 2,
160
+ "from": 14,
161
+ "to": 13,
162
+ "player": 2
163
+ },
164
+ {
165
+ "id": 3,
166
+ "from": 31,
167
+ "to": 30,
168
+ "player": 3
169
+ },
170
+ {
171
+ "id": 4,
172
+ "from": 44,
173
+ "to": 43,
174
+ "player": 3
175
+ },
176
+ {
177
+ "id": 5,
178
+ "from": 36,
179
+ "to": 35,
180
+ "player": 2
181
+ },
182
+ {
183
+ "id": 6,
184
+ "from": 40,
185
+ "to": 41,
186
+ "player": 1
187
+ }
188
+ ],
189
+ "harbors": [
190
+ {
191
+ "id": 1,
192
+ "type": "any",
193
+ "ratio": 3,
194
+ "point_one": 9,
195
+ "point_two": 8
196
+ },
197
+ {
198
+ "id": 2,
199
+ "type": "sheep",
200
+ "ratio": 2,
201
+ "point_one": 17,
202
+ "point_two": 28
203
+ },
204
+ {
205
+ "id": 3,
206
+ "type": "wood",
207
+ "ratio": 2,
208
+ "point_one": 40,
209
+ "point_two": 48
210
+ },
211
+ {
212
+ "id": 4,
213
+ "type": "any",
214
+ "ratio": 3,
215
+ "point_one": 50,
216
+ "point_two": 51
217
+ },
218
+ {
219
+ "id": 5,
220
+ "type": "any",
221
+ "ratio": 3,
222
+ "point_one": 53,
223
+ "point_two": 54
224
+ },
225
+ {
226
+ "id": 6,
227
+ "type": "any",
228
+ "ratio": 3,
229
+ "point_one": 37,
230
+ "point_two": 38
231
+ },
232
+ {
233
+ "id": 7,
234
+ "type": "ore",
235
+ "ratio": 2,
236
+ "point_one": 26,
237
+ "point_two": 16
238
+ },
239
+ {
240
+ "id": 8,
241
+ "type": "brick",
242
+ "ratio": 2,
243
+ "point_one": 7,
244
+ "point_two": 6
245
+ },
246
+ {
247
+ "id": 9,
248
+ "type": "wheat",
249
+ "ratio": 2,
250
+ "point_one": 3,
251
+ "point_two": 2
252
+ }
253
+ ],
254
  "players": [
255
  {
256
  "id": 0,
257
  "name": "a",
258
+ "victory_points": 2,
259
+ "total_cards": 3,
260
+ "cards_list": [
261
+ "ore",
262
+ "brick",
263
+ "sheep"
264
+ ],
265
  "dev_cards_list": [],
266
+ "settlements": 2,
267
  "cities": 0,
268
+ "roads": 2,
269
+ "longest_road": 1,
270
  "has_longest_road": false,
271
  "knights": 0,
272
  "knights_played": 0,
 
275
  {
276
  "id": 1,
277
  "name": "b",
278
+ "victory_points": 2,
279
+ "total_cards": 4,
280
+ "cards_list": [
281
+ "sheep",
282
+ "sheep",
283
+ "ore",
284
+ "wheat"
285
+ ],
286
  "dev_cards_list": [],
287
+ "settlements": 2,
288
  "cities": 0,
289
+ "roads": 2,
290
+ "longest_road": 1,
291
  "has_longest_road": false,
292
  "knights": 0,
293
  "knights_played": 0,
 
296
  {
297
  "id": 2,
298
  "name": "c",
299
+ "victory_points": 2,
300
+ "total_cards": 3,
301
+ "cards_list": [
302
+ "ore",
303
+ "wheat",
304
+ "wheat"
305
+ ],
306
  "dev_cards_list": [],
307
+ "settlements": 2,
308
  "cities": 0,
309
+ "roads": 2,
310
+ "longest_road": 1,
311
  "has_longest_road": false,
312
  "knights": 0,
313
  "knights_played": 0,
314
  "has_largest_army": false
315
  }
316
  ],
317
+ "current_player": 1,
318
+ "current_phase": "NORMAL_PLAY",
319
  "robber_position": [
320
  2,
321
  2
pycatan/core/game.py CHANGED
@@ -483,10 +483,23 @@ class Game:
483
  ports = []
484
  for harbor in self.board.harbors:
485
  if harbor:
 
 
 
 
 
 
 
 
 
 
 
 
486
  port_info = {
487
- 'position': getattr(harbor, 'position', [0, 0]),
 
488
  'resource': harbor.type.name.lower() if hasattr(harbor.type, 'name') else 'any',
489
- 'ratio': getattr(harbor, 'ratio', 3)
490
  }
491
  ports.append(port_info)
492
  return ports
 
483
  ports = []
484
  for harbor in self.board.harbors:
485
  if harbor:
486
+ # Get point coordinates for harbor location
487
+ point_one_coords = harbor.point_one.position if hasattr(harbor.point_one, 'position') else [0, 0]
488
+ point_two_coords = harbor.point_two.position if hasattr(harbor.point_two, 'position') else [0, 0]
489
+
490
+ # Convert points to point IDs using BoardDefinition
491
+ from pycatan.config.board_definition import board_definition
492
+ point_one_id = board_definition.game_coords_to_point_id(point_one_coords[0], point_one_coords[1])
493
+ point_two_id = board_definition.game_coords_to_point_id(point_two_coords[0], point_two_coords[1])
494
+
495
+ # Determine ratio based on harbor type
496
+ ratio = 2 if harbor.type.name.lower() != 'any' else 3
497
+
498
  port_info = {
499
+ 'point_one': point_one_id,
500
+ 'point_two': point_two_id,
501
  'resource': harbor.type.name.lower() if hasattr(harbor.type, 'name') else 'any',
502
+ 'ratio': ratio
503
  }
504
  ports.append(port_info)
505
  return ports
pycatan/static/css/style.css CHANGED
@@ -220,6 +220,20 @@ h1 {
220
  pointer-events: none;
221
  }
222
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
223
  /* יישובים */
224
  .settlement {
225
  stroke: #2c3e50;
 
220
  pointer-events: none;
221
  }
222
 
223
+ /* נמלים */
224
+ .harbor {
225
+ pointer-events: none;
226
+ }
227
+
228
+ .harbor circle {
229
+ filter: drop-shadow(2px 2px 4px rgba(0,0,0,0.4));
230
+ }
231
+
232
+ .harbor text {
233
+ pointer-events: none;
234
+ user-select: none;
235
+ }
236
+
237
  /* יישובים */
238
  .settlement {
239
  stroke: #2c3e50;
pycatan/static/js/board.js CHANGED
@@ -527,6 +527,128 @@ class CatanBoard {
527
  this.svg.appendChild(line);
528
  }
529
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
530
  // Update board from game state (called when receiving updates from server)
531
  updateFromGameState(gameState) {
532
  console.log('Updating board from game state:', gameState);
@@ -551,6 +673,14 @@ class CatanBoard {
551
  // Create vertices
552
  this.createVertices();
553
 
 
 
 
 
 
 
 
 
554
  // Add buildings from server data
555
  this.updateBuildings(gameState);
556
  this.updateRobberFromGameState(gameState);
 
527
  this.svg.appendChild(line);
528
  }
529
 
530
+ createHarbor(harbor) {
531
+ // Harbor is positioned on an edge between two points
532
+ // We'll place it at the midpoint between the two vertices
533
+
534
+ // Harbor types: 'wood', 'sheep', 'brick', 'wheat', 'ore', 'any'
535
+ // Harbor ratios: 2 (for specific resource) or 3 (for any resource)
536
+
537
+ const harborTypeColors = {
538
+ 'wood': '#228B22', // Forest Green
539
+ 'sheep': '#90EE90', // Light Green
540
+ 'brick': '#CD5C5C', // Indian Red
541
+ 'wheat': '#FFD700', // Gold
542
+ 'ore': '#696969', // Dim Gray
543
+ 'any': '#4169E1' // Royal Blue
544
+ };
545
+
546
+ const harborTypeIcons = {
547
+ 'wood': '🌲',
548
+ 'sheep': '🐑',
549
+ 'brick': '🧱',
550
+ 'wheat': '🌾',
551
+ 'ore': '⛰️',
552
+ 'any': '🏪'
553
+ };
554
+
555
+ // Find the two vertices for this harbor
556
+ const pointOne = this.getVertexByPointId(harbor.point_one);
557
+ const pointTwo = this.getVertexByPointId(harbor.point_two);
558
+
559
+ if (!pointOne || !pointTwo) {
560
+ console.warn(`Could not find vertices for harbor ${harbor.id}: points ${harbor.point_one} and ${harbor.point_two}`);
561
+ return;
562
+ }
563
+
564
+ // Calculate midpoint between the two vertices
565
+ const midX = (pointOne.x + pointTwo.x) / 2;
566
+ const midY = (pointOne.y + pointTwo.y) / 2;
567
+
568
+ // Calculate direction vector to push harbor outward from the board
569
+ const centerX = this.centerX;
570
+ const centerY = this.centerY;
571
+ const dx = midX - centerX;
572
+ const dy = midY - centerY;
573
+ const dist = Math.sqrt(dx * dx + dy * dy);
574
+
575
+ // Push harbor 45 pixels outward from the center
576
+ const offsetDist = 45;
577
+ const x = midX + (dx / dist) * offsetDist;
578
+ const y = midY + (dy / dist) * offsetDist;
579
+
580
+ // Create harbor group
581
+ const harborGroup = document.createElementNS('http://www.w3.org/2000/svg', 'g');
582
+ harborGroup.setAttribute('class', 'harbor');
583
+ harborGroup.setAttribute('data-harbor-id', harbor.id);
584
+ harborGroup.setAttribute('data-harbor-type', harbor.type);
585
+ harborGroup.setAttribute('data-point-one', harbor.point_one);
586
+ harborGroup.setAttribute('data-point-two', harbor.point_two);
587
+
588
+ // Create harbor circle background
589
+ const circle = document.createElementNS('http://www.w3.org/2000/svg', 'circle');
590
+ circle.setAttribute('cx', x);
591
+ circle.setAttribute('cy', y);
592
+ circle.setAttribute('r', 16);
593
+ circle.setAttribute('fill', harborTypeColors[harbor.type] || '#4169E1');
594
+ circle.setAttribute('stroke', 'white');
595
+ circle.setAttribute('stroke-width', 2.5);
596
+ circle.setAttribute('opacity', '0.95');
597
+
598
+ // Create harbor icon/text
599
+ const text = document.createElementNS('http://www.w3.org/2000/svg', 'text');
600
+ text.setAttribute('x', x);
601
+ text.setAttribute('y', y + 5);
602
+ text.setAttribute('text-anchor', 'middle');
603
+ text.setAttribute('fill', 'white');
604
+ text.setAttribute('font-size', '14');
605
+ text.textContent = harborTypeIcons[harbor.type] || '🏪';
606
+
607
+ // Create harbor ratio text (smaller, below the circle)
608
+ const ratioText = document.createElementNS('http://www.w3.org/2000/svg', 'text');
609
+ ratioText.setAttribute('x', x);
610
+ ratioText.setAttribute('y', y + 26);
611
+ ratioText.setAttribute('text-anchor', 'middle');
612
+ ratioText.setAttribute('fill', 'white');
613
+ ratioText.setAttribute('font-size', '8');
614
+ ratioText.setAttribute('font-weight', 'bold');
615
+ ratioText.textContent = `${harbor.ratio}:1`;
616
+
617
+ // Create lines connecting harbor to both vertices
618
+ const line1 = document.createElementNS('http://www.w3.org/2000/svg', 'line');
619
+ line1.setAttribute('x1', pointOne.x);
620
+ line1.setAttribute('y1', pointOne.y);
621
+ line1.setAttribute('x2', x);
622
+ line1.setAttribute('y2', y);
623
+ line1.setAttribute('stroke', harborTypeColors[harbor.type] || '#4169E1');
624
+ line1.setAttribute('stroke-width', 2.5);
625
+ line1.setAttribute('opacity', '0.7');
626
+
627
+ const line2 = document.createElementNS('http://www.w3.org/2000/svg', 'line');
628
+ line2.setAttribute('x1', pointTwo.x);
629
+ line2.setAttribute('y1', pointTwo.y);
630
+ line2.setAttribute('x2', x);
631
+ line2.setAttribute('y2', y);
632
+ line2.setAttribute('stroke', harborTypeColors[harbor.type] || '#4169E1');
633
+ line2.setAttribute('stroke-width', 2.5);
634
+ line2.setAttribute('opacity', '0.7');
635
+
636
+ // Add tooltip
637
+ const title = document.createElementNS('http://www.w3.org/2000/svg', 'title');
638
+ title.textContent = `Harbor: ${harbor.type} (${harbor.ratio}:1 trade)\nPoints: ${harbor.point_one}-${harbor.point_two}`;
639
+ harborGroup.appendChild(title);
640
+
641
+ // Add lines first (so they appear behind the circle)
642
+ harborGroup.appendChild(line1);
643
+ harborGroup.appendChild(line2);
644
+ harborGroup.appendChild(circle);
645
+ harborGroup.appendChild(text);
646
+ harborGroup.appendChild(ratioText);
647
+ this.svg.appendChild(harborGroup);
648
+
649
+ console.log(`🏪 Created harbor: ${harbor.type} (${harbor.ratio}:1) at points ${harbor.point_one}-${harbor.point_two}`);
650
+ }
651
+
652
  // Update board from game state (called when receiving updates from server)
653
  updateFromGameState(gameState) {
654
  console.log('Updating board from game state:', gameState);
 
673
  // Create vertices
674
  this.createVertices();
675
 
676
+ // Add harbors from game state (before buildings so they appear behind)
677
+ if (gameState.harbors && gameState.harbors.length > 0) {
678
+ console.log(`Creating ${gameState.harbors.length} harbors from server data`);
679
+ gameState.harbors.forEach(harbor => {
680
+ this.createHarbor(harbor);
681
+ });
682
+ }
683
+
684
  // Add buildings from server data
685
  this.updateBuildings(gameState);
686
  this.updateRobberFromGameState(gameState);
pycatan/visualizations/web_visualization.py CHANGED
@@ -278,6 +278,7 @@ class WebVisualization(Visualization):
278
  'settlements': [],
279
  'cities': [],
280
  'roads': [],
 
281
  'players': [],
282
  'current_player': getattr(game_state, 'current_player', 0),
283
  'current_phase': getattr(game_state, 'game_phase', 'ACTION').name if hasattr(getattr(game_state, 'game_phase', None), 'name') else str(getattr(game_state, 'game_phase', 'ACTION')),
@@ -294,6 +295,10 @@ class WebVisualization(Visualization):
294
  if hasattr(game_state.board_state, 'tiles'):
295
  web_state['hexes'] = self._convert_hexes(game_state.board_state.tiles)
296
 
 
 
 
 
297
  # Find robber position
298
  web_state['robber_position'] = self._find_robber_position(game_state.board_state)
299
 
@@ -396,6 +401,51 @@ class WebVisualization(Visualization):
396
 
397
  return hexes
398
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
399
  def _get_points_info(self) -> List[Dict[str, Any]]:
400
  """
401
  Get complete information about all points on the board.
 
278
  'settlements': [],
279
  'cities': [],
280
  'roads': [],
281
+ 'harbors': [],
282
  'players': [],
283
  'current_player': getattr(game_state, 'current_player', 0),
284
  'current_phase': getattr(game_state, 'game_phase', 'ACTION').name if hasattr(getattr(game_state, 'game_phase', None), 'name') else str(getattr(game_state, 'game_phase', 'ACTION')),
 
295
  if hasattr(game_state.board_state, 'tiles'):
296
  web_state['hexes'] = self._convert_hexes(game_state.board_state.tiles)
297
 
298
+ # Convert harbors
299
+ if hasattr(game_state.board_state, 'harbors'):
300
+ web_state['harbors'] = self._convert_harbors(game_state.board_state.harbors)
301
+
302
  # Find robber position
303
  web_state['robber_position'] = self._find_robber_position(game_state.board_state)
304
 
 
401
 
402
  return hexes
403
 
404
+ def _convert_harbors(self, harbors) -> List[Dict[str, Any]]:
405
+ """
406
+ Convert harbors to web format.
407
+
408
+ Args:
409
+ harbors: List of harbor dictionaries from GameState
410
+
411
+ Returns:
412
+ List of harbor data for web display
413
+ """
414
+ web_harbors = []
415
+
416
+ if not harbors:
417
+ return web_harbors
418
+
419
+ for i, harbor in enumerate(harbors):
420
+ if isinstance(harbor, dict):
421
+ # Harbor from Game._get_ports_info (new format)
422
+ harbor_data = {
423
+ 'id': i + 1,
424
+ 'type': harbor.get('resource', 'any'), # 'wood', 'sheep', 'brick', 'wheat', 'ore', 'any'
425
+ 'ratio': harbor.get('ratio', 3), # 2 or 3
426
+ 'point_one': harbor.get('point_one', 0), # Point ID of first vertex
427
+ 'point_two': harbor.get('point_two', 0), # Point ID of second vertex
428
+ }
429
+ web_harbors.append(harbor_data)
430
+ else:
431
+ # Harbor object (fallback for older code)
432
+ harbor_type = getattr(harbor, 'type', None)
433
+ if harbor_type:
434
+ # Convert HarborType enum to string
435
+ type_name = harbor_type.name.lower() if hasattr(harbor_type, 'name') else 'any'
436
+ ratio = 2 if type_name != 'any' else 3
437
+
438
+ harbor_data = {
439
+ 'id': i + 1,
440
+ 'type': type_name,
441
+ 'ratio': ratio,
442
+ 'point_one': 0,
443
+ 'point_two': 0
444
+ }
445
+ web_harbors.append(harbor_data)
446
+
447
+ return web_harbors
448
+
449
  def _get_points_info(self) -> List[Dict[str, Any]]:
450
  """
451
  Get complete information about all points on the board.
temp_viz_console.py ADDED
@@ -0,0 +1,31 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+
2
+ # -*- coding: utf-8 -*-
3
+ import sys
4
+ import time
5
+ import os
6
+
7
+ log_file = r"c:\GIT_new\PyCatan_AI\logs\game_viz.log"
8
+
9
+ print("PyCatan - Game Visualization Console")
10
+ print("=" * 50)
11
+ print("This window shows real-time game state updates.")
12
+ print("Keep this window open while playing!")
13
+ print("=" * 50)
14
+ print(f"Reading from: {log_file}")
15
+
16
+ # Wait for file to exist
17
+ while not os.path.exists(log_file):
18
+ time.sleep(0.1)
19
+
20
+ # Tail the file
21
+ with open(log_file, 'r', encoding='utf-8') as f:
22
+ # Go to the end of file
23
+ # f.seek(0, 2)
24
+ # Actually start from beginning since we just created it
25
+
26
+ while True:
27
+ line = f.readline()
28
+ if line:
29
+ print(line, end='')
30
+ else:
31
+ time.sleep(0.1)
test_harbors_display.py ADDED
@@ -0,0 +1,70 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """
2
+ Quick test to verify harbors are displayed in web visualization.
3
+ """
4
+
5
+ from pycatan.core.game import Game
6
+ from pycatan.visualizations.web_visualization import WebVisualization
7
+ import time
8
+
9
+ def test_harbors():
10
+ print("🧪 Testing Harbor Display in Web Visualization")
11
+ print("=" * 60)
12
+
13
+ # Create a simple game
14
+ print("1. Creating game with 3 players...")
15
+ game = Game(num_of_players=3)
16
+
17
+ # Get full game state
18
+ print("2. Getting game state...")
19
+ game_state = game.get_full_state()
20
+
21
+ # Check if harbors are in the state
22
+ print(f"3. Checking harbors in board_state...")
23
+ if hasattr(game_state.board_state, 'harbors'):
24
+ harbors = game_state.board_state.harbors
25
+ print(f" ✓ Found {len(harbors)} harbors!")
26
+
27
+ # Print first few harbors
28
+ for i, harbor in enumerate(harbors[:3]):
29
+ print(f" Harbor {i+1}: {harbor}")
30
+ else:
31
+ print(" ✗ No harbors found in board_state!")
32
+ return
33
+
34
+ # Create web visualization
35
+ print("\n4. Creating web visualization...")
36
+ web_viz = WebVisualization(port=5000, auto_open=True)
37
+
38
+ # Update with game state
39
+ print("5. Updating visualization with game state...")
40
+ web_viz.update_full_state(game_state)
41
+
42
+ # Check converted state
43
+ if web_viz.current_game_state and 'harbors' in web_viz.current_game_state:
44
+ converted_harbors = web_viz.current_game_state['harbors']
45
+ print(f" ✓ Converted {len(converted_harbors)} harbors for web display!")
46
+
47
+ # Print first few converted harbors
48
+ for i, harbor in enumerate(converted_harbors[:3]):
49
+ print(f" Harbor {i+1}: type={harbor['type']}, ratio={harbor['ratio']}, points={harbor.get('point_one')}-{harbor.get('point_two')}")
50
+ else:
51
+ print(" ✗ No harbors in converted state!")
52
+ return
53
+
54
+ # Start the server
55
+ print("\n6. Starting web server...")
56
+ print(" → Open http://localhost:5000 to see the game board")
57
+ print(" → Harbors should appear at the top of the board")
58
+ print(" → Press Ctrl+C to stop the server")
59
+
60
+ web_viz.start()
61
+
62
+ # Keep running
63
+ try:
64
+ while True:
65
+ time.sleep(1)
66
+ except KeyboardInterrupt:
67
+ print("\n\n✓ Test completed!")
68
+
69
+ if __name__ == "__main__":
70
+ test_harbors()