Skip to content

Commit

Permalink
Introduced supplementary rules.
Browse files Browse the repository at this point in the history
  • Loading branch information
vincentbons committed May 19, 2020
1 parent 1ca893e commit baa3c69
Show file tree
Hide file tree
Showing 6 changed files with 38 additions and 8 deletions.
4 changes: 3 additions & 1 deletion examples/four_player_game_random_moves.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
from main.carcassonne_game_state import CarcassonneGameState
from main.objects.actions.action import Action
from main.objects.meeple_type import MeepleType
from main.tile_sets.supplementary_rules import SupplementaryRule
from main.tile_sets.tile_sets import TileSet


Expand Down Expand Up @@ -45,7 +46,8 @@ def print_state(carcassonne_game_state: CarcassonneGameState):

game = CarcassonneGame(
players=4,
tile_sets=[TileSet.BASE, TileSet.THE_RIVER, TileSet.INNS_AND_CATHEDRALS]
tile_sets=[TileSet.BASE, TileSet.THE_RIVER, TileSet.INNS_AND_CATHEDRALS],
supplementary_rules=[SupplementaryRule.ABBOTS]
)

while not game.is_finished():
Expand Down
4 changes: 3 additions & 1 deletion examples/two_player_game_random_moves.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
from main.carcassonne_game_state import CarcassonneGameState
from main.objects.actions.action import Action
from main.objects.meeple_type import MeepleType
from main.tile_sets.supplementary_rules import SupplementaryRule
from main.tile_sets.tile_sets import TileSet


Expand Down Expand Up @@ -33,7 +34,8 @@ def print_state(carcassonne_game_state: CarcassonneGameState):

game = CarcassonneGame(
players=2,
tile_sets=[TileSet.BASE, TileSet.THE_RIVER, TileSet.INNS_AND_CATHEDRALS]
tile_sets=[TileSet.BASE, TileSet.THE_RIVER, TileSet.INNS_AND_CATHEDRALS],
supplementary_rules=[SupplementaryRule.ABBOTS]
)

while not game.is_finished():
Expand Down
13 changes: 10 additions & 3 deletions main/carcassonne_game.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
from main.carcassonne_game_state import CarcassonneGameState
from main.carcassonne_visualiser import CarcassonneVisualiser
from main.objects.actions.action import Action
from main.tile_sets.supplementary_rules import SupplementaryRule
from main.tile_sets.tile_sets import TileSet
from main.utils.action_util import ActionUtil
from main.utils.state_updater import StateUpdater
Expand All @@ -10,14 +11,20 @@ class CarcassonneGame:

def __init__(self,
players: int = 2,
tile_sets: [TileSet] = (TileSet.BASE, TileSet.THE_RIVER, TileSet.INNS_AND_CATHEDRALS)):
tile_sets: [TileSet] = (TileSet.BASE, TileSet.THE_RIVER, TileSet.INNS_AND_CATHEDRALS),
supplementary_rules: [SupplementaryRule] = (SupplementaryRule.FARMERS, SupplementaryRule.ABBOTS)):
self.players = players
self.tile_sets = tile_sets
self.state: CarcassonneGameState = CarcassonneGameState(tile_sets=tile_sets, players=players)
self.supplementary_rules = supplementary_rules
self.state: CarcassonneGameState = CarcassonneGameState(
tile_sets=tile_sets,
players=players,
supplementary_rules=supplementary_rules
)
self.visualiser = CarcassonneVisualiser()

def reset(self):
self.state = CarcassonneGameState(tile_sets=self.tile_sets)
self.state = CarcassonneGameState(tile_sets=self.tile_sets, supplementary_rules=self.supplementary_rules)

def step(self, player: int, action: Action):
self.state = StateUpdater.apply_action(game_state=self.state, action=action)
Expand Down
6 changes: 4 additions & 2 deletions main/carcassonne_game_state.py
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
import random
from enum import Enum
from typing import Optional

from main.objects.actions.tile_action import TileAction
from main.objects.coordinate import Coordinate
from main.objects.game_phase import GamePhase
from main.tile_sets.base_deck import base_tile_counts, base_tiles
from main.tile_sets.inns_and_cathedrals_deck import inns_and_cathedrals_tile_counts, inns_and_cathedrals_tiles
from main.tile_sets.supplementary_rules import SupplementaryRule
from main.tile_sets.the_river_deck import the_river_tiles, the_river_tile_counts
from main.objects.rotation import Rotation
from main.objects.tile import Tile
Expand All @@ -18,17 +18,19 @@ class CarcassonneGameState:
def __init__(
self,
tile_sets: [TileSet] = (TileSet.BASE, TileSet.THE_RIVER, TileSet.INNS_AND_CATHEDRALS),
supplementary_rules: [SupplementaryRule] = (SupplementaryRule.FARMERS, SupplementaryRule.ABBOTS),
players: int = 2,
board_size: (int, int) = (35, 35),
starting_position: Coordinate = Coordinate(6, 15)
):
self.deck = self.initialize_deck(tile_sets=tile_sets)
self.supplementary_rules: [SupplementaryRule] = supplementary_rules
self.board: [[Tile]] = [[None for column in range(board_size[1])] for row in range(board_size[0])]
self.starting_position: Coordinate = starting_position
self.next_tile = self.deck.pop(0)
self.players = players
self.meeples = [7 for _ in range(players + 1)]
self.abbots = [1 for _ in range(players + 1)]
self.abbots = [1 if SupplementaryRule.ABBOTS in supplementary_rules else 0 for _ in range(players + 1)]
self.big_meeples = [1 if TileSet.INNS_AND_CATHEDRALS in tile_sets else 0 for _ in range(players + 1)]
self.placed_meeples = [[] for _ in range(players + 1)]
self.scores: [int] = [0 for _ in range(players + 1)]
Expand Down
12 changes: 12 additions & 0 deletions main/tile_sets/supplementary_rules.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
from enum import Enum


class SupplementaryRule(Enum):
FARMERS = "farmers"
ABBOTS = "abbots"

def to_json(self):
return self.value

def __str__(self):
return self.value
7 changes: 6 additions & 1 deletion main/utils/possible_move_finder.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
from main.objects.side import Side
from main.objects.terrain_type import TerrainType
from main.objects.tile import Tile
from main.tile_sets.supplementary_rules import SupplementaryRule
from main.utils.city_util import CityUtil
from main.utils.farm_util import FarmUtil
from main.utils.road_util import RoadUtil
Expand All @@ -28,7 +29,11 @@ def possible_meeple_actions(cls, game_state: CarcassonneGameState) -> [MeepleAct
possible_actions: [MeepleAction] = []

meeple_positions = cls.__possible_meeple_positions(game_state=game_state)
farmer_positions = cls.__possible_farmer_position(game_state=game_state)

if SupplementaryRule.FARMERS in game_state.supplementary_rules:
farmer_positions = cls.__possible_farmer_position(game_state=game_state)
else:
farmer_positions = ()

if game_state.meeples[current_player] > 0:
possible_actions.extend(list(
Expand Down

0 comments on commit baa3c69

Please sign in to comment.