tsaglam / Carcassonne

A digital version of the board game Carcassonne, implemented in Java. This desktop computer game supports up to five players at the same time (shared-screen multiplayer mode).
Eclipse Public License 2.0
96 stars 16 forks source link

Adapt AI behavior to avoid enclaves of free spots if multiple equally well-scoring moves are available #6

Open tsaglam opened 2 years ago

tsaglam commented 2 years ago

I should adapt the improve the AI behavior to avoid enclaves of free spots if multiple equally well-scoring moves are available. This makes the grids built by the AI more visually pleasing by reducing the number of holes in the grid. Moreover, this should not affect the AI performance, as this is only done for moves that are equally well-scoring.

Holes in the grid after a three-player AI-only game with doubled stack size and a large grid:

holes in the grid

Final patterns ``` GridPattern[type: ROAD, size: 3, complete: false, disbursed: false, meeples: [], on: [(18|9), (18|10), (18|11)] GridPattern[type: FIELDS, size: 19, complete: false, disbursed: false, meeples: [FieldsMeeple by Player 1 placed on (18|9) at EAST ], on: [(18|9), (19|9), (19|10), (20|10), (20|11), (19|11), (18|10), (18|11), (19|11), (20|11), (18|12), (18|13), (17|13), (16|13), (17|12), (17|11), (16|11), (18|10), (18|9)] GridPattern[type: MONASTERY, size: 8, complete: false, disbursed: false, meeples: [], on: [(19|10), (19|9), (20|10), (19|11), (18|10), (20|11), (18|11), (18|9)] GridPattern[type: CASTLE, size: 1, complete: false, disbursed: false, meeples: [], on: [(19|9)] GridPattern[type: ROAD, size: 1, complete: false, disbursed: false, meeples: [], on: [(23|9)] GridPattern[type: CASTLE, size: 2, complete: true, disbursed: false, meeples: [], on: [(23|9), (23|10)] GridPattern[type: FIELDS, size: 1, complete: false, disbursed: false, meeples: [], on: [(23|9)] GridPattern[type: FIELDS, size: 1, complete: false, disbursed: false, meeples: [], on: [(23|9)] GridPattern[type: MONASTERY, size: 7, complete: false, disbursed: false, meeples: [], on: [(24|10), (25|10), (24|11), (23|10), (25|11), (23|11), (23|9)] GridPattern[type: MONASTERY, size: 6, complete: false, disbursed: false, meeples: [], on: [(22|10), (23|10), (22|11), (21|10), (23|9), (23|11)] GridPattern[type: ROAD, size: 3, complete: true, disbursed: false, meeples: [], on: [(19|10), (19|11), (20|11)] GridPattern[type: ROAD, size: 2, complete: false, disbursed: false, meeples: [], on: [(20|10), (20|11)] GridPattern[type: FIELDS, size: 3, complete: false, disbursed: false, meeples: [], on: [(20|10), (21|10), (20|11)] GridPattern[type: CASTLE, size: 1, complete: false, disbursed: false, meeples: [], on: [(21|10)] GridPattern[type: FIELDS, size: 7, complete: false, disbursed: false, meeples: [], on: [(21|10), (22|10), (23|10), (24|10), (25|10), (24|11), (22|11)] GridPattern[type: ROAD, size: 1, complete: false, disbursed: false, meeples: [], on: [(22|10)] GridPattern[type: CASTLE, size: 8, complete: false, disbursed: false, meeples: [CastleMeeple by Player 2 placed on (22|11) at SOUTH ], on: [(23|10), (23|11), (24|11), (25|11), (25|10), (26|11), (22|11), (22|12)] GridPattern[type: MONASTERY, size: 3, complete: false, disbursed: false, meeples: [], on: [(16|11), (17|11), (17|12)] GridPattern[type: CASTLE, size: 2, complete: true, disbursed: false, meeples: [], on: [(17|11), (17|12)] GridPattern[type: MONASTERY, size: 8, complete: false, disbursed: false, meeples: [], on: [(19|12), (19|11), (20|12), (18|12), (20|11), (20|13), (18|13), (18|11)] GridPattern[type: CASTLE, size: 4, complete: false, disbursed: false, meeples: [CastleMeeple by Player 2 placed on (19|12) at WEST ], on: [(19|11), (19|12), (20|12), (18|12)] GridPattern[type: ROAD, size: 1, complete: false, disbursed: false, meeples: [], on: [(20|11)] GridPattern[type: CASTLE, size: 2, complete: true, disbursed: false, meeples: [], on: [(20|11), (20|12)] GridPattern[type: ROAD, size: 2, complete: true, disbursed: false, meeples: [], on: [(23|11), (23|12)] GridPattern[type: FIELDS, size: 6, complete: false, disbursed: false, meeples: [], on: [(23|11), (23|12), (24|12), (24|11), (25|12), (25|11)] GridPattern[type: FIELDS, size: 71, complete: false, disbursed: false, meeples: [FieldsMeeple by Player 1 placed on (21|15) at SOUTH , FieldsMeeple by Player 0 placed on (24|13) at SOUTH ], on: [(23|11), (23|12), (22|12), (21|12), (20|12), (20|13), (21|13), (21|14), (22|14), (22|13), (21|15), (22|15), (23|15), (24|15), (24|14), (24|14), (24|14), (23|16), (24|16), (24|17), (25|17), (22|16), (21|16), (20|16), (20|15), (19|15), (19|14), (21|13), (21|12), (22|12), (23|12), (24|12), (24|13), (25|13), (25|14), (25|15), (26|15), (27|15), (27|14), (27|13), (26|13), (26|12), (26|11), (25|12), (25|11), (25|13), (25|14), (26|14), (26|11), (26|11), (26|14), (28|13), (27|12), (26|16), (27|16), (28|16), (26|17), (27|17), (27|18), (26|18), (25|17), (24|14), (24|14), (25|12), (24|12), (24|14), (23|13), (23|14), (22|14), (22|13), (24|14)] GridPattern[type: ROAD, size: 7, complete: true, disbursed: false, meeples: [], on: [(25|11), (25|12), (25|13), (25|14), (26|14), (26|13), (24|12)] GridPattern[type: FIELDS, size: 1, complete: false, disbursed: false, meeples: [], on: [(26|11)] GridPattern[type: FIELDS, size: 4, complete: false, disbursed: false, meeples: [], on: [(26|11), (27|11), (27|12), (26|11)] GridPattern[type: CASTLE, size: 1, complete: false, disbursed: false, meeples: [], on: [(27|11)] GridPattern[type: CASTLE, size: 2, complete: true, disbursed: false, meeples: [], on: [(17|12), (17|13)] GridPattern[type: ROAD, size: 7, complete: true, disbursed: false, meeples: [], on: [(20|12), (21|12), (22|12), (23|12), (21|13), (20|13), (21|13)] GridPattern[type: FIELDS, size: 4, complete: false, disbursed: false, meeples: [], on: [(20|12), (21|12), (21|13), (20|13)] GridPattern[type: CASTLE, size: 4, complete: true, disbursed: false, meeples: [], on: [(22|12), (22|13), (23|13), (21|13)] GridPattern[type: ROAD, size: 2, complete: true, disbursed: false, meeples: [], on: [(23|12), (24|12)] GridPattern[type: CASTLE, size: 2, complete: true, disbursed: false, meeples: [], on: [(23|12), (23|13)] GridPattern[type: ROAD, size: 2, complete: true, disbursed: false, meeples: [], on: [(24|12), (24|13)] GridPattern[type: CASTLE, size: 2, complete: false, disbursed: false, meeples: [], on: [(26|12), (27|12)] GridPattern[type: ROAD, size: 3, complete: false, disbursed: false, meeples: [], on: [(27|12), (27|13), (28|13)] GridPattern[type: FIELDS, size: 3, complete: false, disbursed: false, meeples: [], on: [(27|12), (27|13), (28|13)] GridPattern[type: ROAD, size: 3, complete: true, disbursed: false, meeples: [], on: [(16|13), (17|13), (18|13)] GridPattern[type: ROAD, size: 5, complete: true, disbursed: false, meeples: [], on: [(16|13), (16|14), (17|14), (18|14), (18|13)] GridPattern[type: ROAD, size: 1, complete: false, disbursed: false, meeples: [], on: [(16|13)] GridPattern[type: FIELDS, size: 6, complete: false, disbursed: false, meeples: [], on: [(16|13), (17|13), (17|14), (18|14), (18|13), (16|14)] GridPattern[type: FIELDS, size: 86, complete: false, disbursed: false, meeples: [FieldsMeeple by Player 1 placed on (26|20) at CENTER , FieldsMeeple by Player 2 placed on (15|19) at SOUTH_WEST ], on: [(16|13), (16|14), (17|14), (17|15), (18|15), (18|14), (19|14), (19|15), (19|16), (20|16), (20|17), (21|16), (21|17), (22|16), (22|17), (23|16), (24|16), (24|17), (25|17), (25|18), (25|19), (26|19), (26|18), (25|20), (26|20), (26|21), (25|21), (25|22), (24|22), (23|22), (23|23), (22|22), (22|21), (23|21), (24|21), (21|21), (21|20), (21|19), (22|19), (22|20), (23|20), (23|19), (24|19), (24|20), (22|19), (22|18), (22|17), (21|18), (21|19), (20|19), (20|18), (19|18), (19|17), (19|19), (18|19), (18|18), (19|18), (19|17), (18|17), (18|16), (20|19), (20|20), (19|20), (18|20), (19|19), (18|19), (18|18), (17|18), (16|18), (16|19), (17|19), (15|19), (21|22), (20|22), (19|22), (19|23), (19|21), (19|20), (20|20), (20|21), (20|21), (27|21), (26|17), (26|18), (20|15), (18|13)] GridPattern[type: ROAD, size: 1, complete: false, disbursed: false, meeples: [], on: [(18|13)] GridPattern[type: ROAD, size: 2, complete: true, disbursed: false, meeples: [], on: [(21|13), (21|14)] GridPattern[type: ROAD, size: 2, complete: true, disbursed: false, meeples: [], on: [(22|13), (22|14)] GridPattern[type: CASTLE, size: 1, complete: true, disbursed: false, meeples: [], on: [(24|13)] GridPattern[type: CASTLE, size: 1, complete: true, disbursed: false, meeples: [], on: [(26|13)] GridPattern[type: CASTLE, size: 8, complete: false, disbursed: false, meeples: [CastleMeeple by Player 0 placed on (27|14) at EAST ], on: [(28|13), (29|13), (30|13), (30|14), (30|15), (29|14), (28|14), (27|14)] GridPattern[type: FIELDS, size: 1, complete: false, disbursed: false, meeples: [], on: [(29|13)] GridPattern[type: MONASTERY, size: 5, complete: false, disbursed: false, meeples: [], on: [(30|14), (30|13), (30|15), (29|14), (29|13)] GridPattern[type: ROAD, size: 1, complete: false, disbursed: false, meeples: [], on: [(30|13)] GridPattern[type: FIELDS, size: 1, complete: false, disbursed: false, meeples: [], on: [(30|13)] GridPattern[type: FIELDS, size: 1, complete: false, disbursed: false, meeples: [], on: [(30|13)] GridPattern[type: ROAD, size: 10, complete: false, disbursed: false, meeples: [RoadMeeple by Player 0 placed on (21|16) at CENTER ], on: [(19|14), (19|15), (20|15), (20|16), (21|16), (22|16), (23|16), (24|16), (24|17), (25|17)] GridPattern[type: CASTLE, size: 1, complete: false, disbursed: false, meeples: [], on: [(19|14)] GridPattern[type: MONASTERY, size: 8, complete: false, disbursed: false, meeples: [], on: [(21|15), (21|14), (22|15), (21|16), (20|15), (22|14), (22|16), (20|16)] GridPattern[type: CASTLE, size: 2, complete: true, disbursed: false, meeples: [], on: [(22|14), (22|15)] GridPattern[type: CASTLE, size: 3, complete: true, disbursed: false, meeples: [], on: [(23|14), (24|14), (23|15)] GridPattern[type: CASTLE, size: 2, complete: true, disbursed: false, meeples: [], on: [(26|14), (26|15)] GridPattern[type: FIELDS, size: 2, complete: false, disbursed: false, meeples: [], on: [(28|14), (28|15)] GridPattern[type: FIELDS, size: 1, complete: false, disbursed: false, meeples: [], on: [(29|14)] GridPattern[type: ROAD, size: 14, complete: false, disbursed: false, meeples: [RoadMeeple by Player 1 placed on (18|18) at CENTER , RoadMeeple by Player 2 placed on (20|19) at CENTER ], on: [(17|15), (18|15), (18|16), (18|17), (18|18), (18|19), (19|19), (20|19), (21|19), (22|19), (17|18), (16|18), (16|19), (15|19)] GridPattern[type: FIELDS, size: 14, complete: false, disbursed: false, meeples: [FieldsMeeple by Player 1 placed on (15|17) at WEST ], on: [(17|15), (17|16), (18|16), (18|17), (17|17), (16|17), (15|17), (18|18), (17|18), (16|18), (16|19), (15|19), (18|15), (16|16)] GridPattern[type: MONASTERY, size: 8, complete: false, disbursed: false, meeples: [MonasteryMeeple by Player 2 placed on (17|16) at CENTER ], on: [(17|16), (17|15), (18|16), (17|17), (16|16), (18|15), (18|17), (16|17)] GridPattern[type: MONASTERY, size: 9, complete: true, disbursed: false, meeples: [], on: [(19|16), (19|15), (20|16), (19|17), (18|16), (20|15), (20|17), (18|17), (18|15)] GridPattern[type: CASTLE, size: 2, complete: true, disbursed: false, meeples: [], on: [(22|15), (22|16)] GridPattern[type: CASTLE, size: 3, complete: false, disbursed: false, meeples: [CastleMeeple by Player 0 placed on (24|16) at NORTH ], on: [(24|15), (25|15), (24|16)] GridPattern[type: MONASTERY, size: 8, complete: false, disbursed: false, meeples: [MonasteryMeeple by Player 0 placed on (26|16) at CENTER ], on: [(26|16), (26|15), (27|16), (26|17), (27|15), (27|17), (25|17), (25|15)] GridPattern[type: CASTLE, size: 4, complete: true, disbursed: false, meeples: [], on: [(27|15), (28|15), (28|16), (27|16)] GridPattern[type: ROAD, size: 1, complete: false, disbursed: false, meeples: [], on: [(30|15)] GridPattern[type: FIELDS, size: 1, complete: false, disbursed: false, meeples: [], on: [(30|15)] GridPattern[type: FIELDS, size: 1, complete: false, disbursed: false, meeples: [], on: [(30|15)] GridPattern[type: CASTLE, size: 2, complete: true, disbursed: false, meeples: [], on: [(16|16), (16|17)] GridPattern[type: ROAD, size: 1, complete: false, disbursed: false, meeples: [], on: [(16|16)] GridPattern[type: FIELDS, size: 1, complete: false, disbursed: false, meeples: [], on: [(16|16)] GridPattern[type: MONASTERY, size: 4, complete: false, disbursed: false, meeples: [], on: [(15|17), (16|17), (16|16), (16|18)] GridPattern[type: ROAD, size: 3, complete: true, disbursed: false, meeples: [], on: [(19|16), (19|17), (19|18)] GridPattern[type: CASTLE, size: 8, complete: false, disbursed: false, meeples: [CastleMeeple by Player 1 placed on (23|17) at NORTH , CastleMeeple by Player 0 placed on (20|17) at SOUTH ], on: [(23|16), (23|17), (24|17), (22|17), (21|17), (20|17), (20|18), (19|17)] GridPattern[type: CASTLE, size: 1, complete: false, disbursed: false, meeples: [], on: [(24|16)] GridPattern[type: CASTLE, size: 2, complete: true, disbursed: false, meeples: [], on: [(27|16), (27|17)] GridPattern[type: CASTLE, size: 2, complete: false, disbursed: false, meeples: [], on: [(28|16), (28|17)] GridPattern[type: CASTLE, size: 2, complete: true, disbursed: false, meeples: [], on: [(16|17), (16|18)] GridPattern[type: CASTLE, size: 2, complete: true, disbursed: false, meeples: [], on: [(17|17), (17|18)] GridPattern[type: FIELDS, size: 5, complete: false, disbursed: false, meeples: [], on: [(21|17), (21|18), (22|18), (22|17), (20|18)] GridPattern[type: ROAD, size: 4, complete: true, disbursed: false, meeples: [], on: [(22|17), (22|18), (21|18), (20|18)] GridPattern[type: ROAD, size: 2, complete: false, disbursed: false, meeples: [RoadMeeple by Player 2 placed on (23|18) at CENTER ], on: [(23|17), (23|18)] GridPattern[type: FIELDS, size: 2, complete: false, disbursed: false, meeples: [], on: [(23|17), (23|18)] GridPattern[type: FIELDS, size: 2, complete: false, disbursed: false, meeples: [], on: [(23|17), (23|18)] GridPattern[type: ROAD, size: 1, complete: false, disbursed: false, meeples: [], on: [(25|17)] GridPattern[type: ROAD, size: 3, complete: true, disbursed: false, meeples: [], on: [(25|17), (26|17), (26|18)] GridPattern[type: ROAD, size: 2, complete: true, disbursed: false, meeples: [], on: [(27|17), (27|18)] GridPattern[type: FIELDS, size: 4, complete: false, disbursed: false, meeples: [], on: [(27|17), (28|17), (28|18), (27|18)] GridPattern[type: CASTLE, size: 2, complete: true, disbursed: false, meeples: [], on: [(17|18), (17|19)] GridPattern[type: CASTLE, size: 2, complete: true, disbursed: false, meeples: [], on: [(19|18), (19|19)] GridPattern[type: CASTLE, size: 3, complete: true, disbursed: false, meeples: [], on: [(22|18), (23|18), (23|19)] GridPattern[type: MONASTERY, size: 8, complete: false, disbursed: false, meeples: [MonasteryMeeple by Player 2 placed on (24|19) at CENTER ], on: [(24|19), (25|19), (24|20), (23|19), (25|18), (25|20), (23|20), (23|18)] GridPattern[type: CASTLE, size: 10, complete: true, disbursed: false, meeples: [], on: [(25|18), (26|18), (27|18), (28|18), (29|18), (29|19), (30|19), (28|19), (28|20), (27|19)] GridPattern[type: MONASTERY, size: 8, complete: false, disbursed: false, meeples: [], on: [(25|19), (25|18), (26|19), (25|20), (24|19), (26|18), (26|20), (24|20)] GridPattern[type: ROAD, size: 2, complete: true, disbursed: false, meeples: [], on: [(26|18), (26|19)] GridPattern[type: FIELDS, size: 3, complete: false, disbursed: false, meeples: [], on: [(26|18), (26|19), (27|19)] GridPattern[type: FIELDS, size: 2, complete: false, disbursed: false, meeples: [], on: [(28|18), (28|19)] GridPattern[type: ROAD, size: 1, complete: false, disbursed: false, meeples: [], on: [(29|18)] GridPattern[type: FIELDS, size: 1, complete: false, disbursed: false, meeples: [], on: [(29|18)] GridPattern[type: FIELDS, size: 1, complete: false, disbursed: false, meeples: [], on: [(29|18)] GridPattern[type: CASTLE, size: 1, complete: false, disbursed: false, meeples: [], on: [(16|19)] GridPattern[type: CASTLE, size: 3, complete: true, disbursed: false, meeples: [], on: [(17|19), (18|19), (18|20)] GridPattern[type: CASTLE, size: 2, complete: true, disbursed: false, meeples: [], on: [(19|19), (19|20)] GridPattern[type: ROAD, size: 5, complete: true, disbursed: false, meeples: [], on: [(22|19), (23|19), (23|20), (22|20), (22|19)] GridPattern[type: FIELDS, size: 4, complete: false, disbursed: false, meeples: [], on: [(22|19), (23|19), (23|20), (22|20)] GridPattern[type: CASTLE, size: 2, complete: true, disbursed: false, meeples: [], on: [(26|19), (26|20)] GridPattern[type: FIELDS, size: 1, complete: false, disbursed: false, meeples: [], on: [(29|19)] GridPattern[type: CASTLE, size: 1, complete: false, disbursed: false, meeples: [], on: [(30|19)] GridPattern[type: FIELDS, size: 1, complete: false, disbursed: false, meeples: [], on: [(30|19)] GridPattern[type: ROAD, size: 2, complete: true, disbursed: false, meeples: [], on: [(18|20), (19|20)] GridPattern[type: ROAD, size: 4, complete: false, disbursed: false, meeples: [], on: [(18|20), (18|21), (17|21), (17|22)] GridPattern[type: ROAD, size: 1, complete: false, disbursed: false, meeples: [], on: [(18|20)] GridPattern[type: FIELDS, size: 7, complete: false, disbursed: false, meeples: [], on: [(18|20), (19|20), (19|21), (18|21), (17|21), (17|22), (19|22)] GridPattern[type: FIELDS, size: 4, complete: false, disbursed: false, meeples: [], on: [(18|20), (18|21), (17|21), (17|22)] GridPattern[type: ROAD, size: 2, complete: true, disbursed: false, meeples: [], on: [(19|20), (20|20)] GridPattern[type: ROAD, size: 3, complete: false, disbursed: false, meeples: [], on: [(19|20), (19|21), (19|22)] GridPattern[type: ROAD, size: 8, complete: true, disbursed: false, meeples: [], on: [(20|20), (21|20), (21|21), (22|21), (22|22), (21|22), (20|22), (20|21)] GridPattern[type: ROAD, size: 2, complete: true, disbursed: false, meeples: [], on: [(20|20), (20|21)] GridPattern[type: FIELDS, size: 9, complete: false, disbursed: false, meeples: [], on: [(20|20), (21|20), (21|21), (22|21), (22|22), (21|22), (20|22), (20|21), (20|21)] GridPattern[type: CASTLE, size: 3, complete: true, disbursed: false, meeples: [], on: [(21|20), (22|20), (22|21)] GridPattern[type: CASTLE, size: 6, complete: true, disbursed: false, meeples: [], on: [(23|20), (24|20), (25|20), (25|21), (24|21), (23|21)] GridPattern[type: ROAD, size: 1, complete: false, disbursed: false, meeples: [], on: [(28|20)] GridPattern[type: FIELDS, size: 1, complete: false, disbursed: false, meeples: [], on: [(28|20)] GridPattern[type: FIELDS, size: 1, complete: false, disbursed: false, meeples: [], on: [(28|20)] GridPattern[type: CASTLE, size: 1, complete: false, disbursed: false, meeples: [], on: [(17|21)] GridPattern[type: CASTLE, size: 4, complete: true, disbursed: false, meeples: [], on: [(19|21), (20|21), (21|21), (21|22)] GridPattern[type: ROAD, size: 8, complete: true, disbursed: false, meeples: [], on: [(23|21), (24|21), (23|22), (24|22), (24|21), (25|22), (25|21), (24|21)] GridPattern[type: FIELDS, size: 4, complete: false, disbursed: false, meeples: [], on: [(23|21), (24|21), (24|22), (23|22)] GridPattern[type: FIELDS, size: 4, complete: false, disbursed: false, meeples: [], on: [(24|21), (25|21), (25|22), (24|22)] GridPattern[type: ROAD, size: 2, complete: false, disbursed: false, meeples: [], on: [(26|21), (27|21)] GridPattern[type: CASTLE, size: 1, complete: false, disbursed: false, meeples: [], on: [(26|21)] GridPattern[type: FIELDS, size: 2, complete: false, disbursed: false, meeples: [], on: [(26|21), (27|21)] GridPattern[type: CASTLE, size: 1, complete: false, disbursed: false, meeples: [], on: [(27|21)] GridPattern[type: CASTLE, size: 2, complete: true, disbursed: false, meeples: [], on: [(21|22), (21|23)] GridPattern[type: MONASTERY, size: 4, complete: false, disbursed: false, meeples: [], on: [(23|23), (23|22), (24|22), (22|22)] GridPattern[type: CASTLE, size: 1, complete: false, disbursed: false, meeples: [], on: [(25|22)] GridPattern[type: ROAD, size: 1, complete: false, disbursed: false, meeples: [], on: [(19|23)] GridPattern[type: FIELDS, size: 1, complete: false, disbursed: false, meeples: [], on: [(19|23)] GridPattern[type: CASTLE, size: 1, complete: false, disbursed: false, meeples: [], on: [(21|23)] GridPattern[type: FIELDS, size: 1, complete: false, disbursed: false, meeples: [], on: [(21|23)] GridPattern[type: ROAD, size: 1, complete: false, disbursed: false, meeples: [], on: [(23|23)] ```