From dc9b0632ad5cbf07303f7254d5b09bb3ecf7cdad Mon Sep 17 00:00:00 2001 From: Jeremy Thurgood Date: Sun, 11 May 2014 18:23:20 +0200 Subject: [PATCH] Game state management. --- naja/actions.py | 27 ++++++++++- naja/gameboard.py | 93 ++++++++++++++++++++---------------- naja/tests/test_gameboard.py | 20 +++++++- 3 files changed, 96 insertions(+), 44 deletions(-) diff --git a/naja/actions.py b/naja/actions.py index 333d174..c49f7c6 100644 --- a/naja/actions.py +++ b/naja/actions.py @@ -1,4 +1,29 @@ -from naja.gameboard import LocationAction +from naja.constants import BITS + + +class LocationAction(object): + """ + An action that may be performed on a location. + """ + + TEXT = None + + def __init__(self, required_bits, **data): + self.required_bits = frozenset(required_bits) + self.data = data + + def check_available(self, player): + return player.bits.check_bits(self.required_bits) + + def perform_action(self, player, board): + raise NotImplementedError("TODO") + + def check_and_clear_MSB(self, player): + if player.bits.check_bit(BITS.MSB): + player.bits.clear_bit(BITS.MSB) + return True + else: + return False class DoNothing(LocationAction): diff --git a/naja/gameboard.py b/naja/gameboard.py index 9c5af7b..fa768db 100644 --- a/naja/gameboard.py +++ b/naja/gameboard.py @@ -8,32 +8,52 @@ class GameBoard(object): A representation of the game board. """ - def __init__(self, player, health, wins, locations=None, state=None): + def __init__(self, player, health, wins, state=None): self.player = player - self.max_health = health - self.wins_required = wins - - if locations is None: - locations = self.generate_locations() - self.locations = locations if state is None: - state = self.generate_state() + state = self.generate_state(health, wins) self.update_state(state) + def export(self): + return { + 'max_health': self.max_health, + 'health': self.health, + 'wins_required': self.wins_required, + 'wins': self.wins, + 'locations': self.export_locations(), + } + + def export_locations(self): + return dict( + (position, location.export()) + for position, location in self.locations) + @classmethod def generate_locations(cls): - raise NotImplementedError("TODO") + # TODO: Generate some locations. + return {} - def generate_state(self): + def generate_state(self, max_health, wins_required): return { - 'health': self.max_health, + 'max_health': max_health, + 'health': max_health, + 'wins_required': wins_required, 'wins': 0, + 'locations': self.generate_locations(), } def update_state(self, state): + self.max_health = state['max_health'] + self.wins_required = state['wins_required'] self.health = state['health'] self.wins = state['wins'] + self.locations = self.import_locations(state['locations']) + + def import_locations(self, locations): + return dict( + (position, LocationCard.import_location(definition)) + for position, definition in locations.iteritems()) def lose_health(self): self.health -= 1 @@ -49,8 +69,26 @@ class LocationCard(object): self.bitwise_operand = bitwise_operand self.actions = actions - @staticmethod - def generate_location(): + @classmethod + def import_location(cls, state): + # TODO: Import real locations. + return cls(state['bitwise_operand'], []) + + @classmethod + def new_location(cls, definition): + return cls.import_location({ + 'bitwise_operand': cls.generate_bitwise_operand(), + 'actions': cls.build_actions(definition), + }) + + def export(self): + return { + 'bitwise_operand': self.bitwise_operand, + 'actions': [action.export() for action in self.actions], + } + + @classmethod + def build_actions(cls, definition): raise NotImplementedError("TODO") @staticmethod @@ -68,32 +106,3 @@ class LocationCard(object): if choice(range(3)) == 0: bits.add(choice(BITS.values())) return frozenset(bits) - - @staticmethod - def generate_location_actions(): - raise NotImplementedError("TODO") - - -class LocationAction(object): - """ - An action that may be performed on a location. - """ - - TEXT = None - - def __init__(self, required_bits, **data): - self.required_bits = required_bits - self.data = data - - def check_available(self, player): - return player.bits.check_bits(self.required_bits) - - def perform_action(self, player, board): - raise NotImplementedError("TODO") - - def check_and_clear_MSB(self, player): - if player.bits.check_bit(BITS.MSB): - player.bits.clear_bit(BITS.MSB) - return True - else: - return False diff --git a/naja/tests/test_gameboard.py b/naja/tests/test_gameboard.py index 0ad0d28..ca973a1 100644 --- a/naja/tests/test_gameboard.py +++ b/naja/tests/test_gameboard.py @@ -5,11 +5,29 @@ from naja.gameboard import GameBoard, LocationCard class TestGameBoard(TestCase): + def test_export_new_board(self): + board = GameBoard(None, 4, 4) + self.assertEqual(board.export(), { + 'max_health': 4, + 'health': 4, + 'wins_required': 4, + 'wins': 0, + 'locations': {}, + }) + def test_lose_health(self): - board = GameBoard(None, 4, 4, locations={}, state=None) + board = GameBoard(None, 4, 4) self.assertEqual(board.health, 4) + state_1 = board.export() + board.lose_health() self.assertEqual(board.health, 3) + state_2 = board.export() + + # Make sure nothing else has changed. + state_1.pop('health') + state_2.pop('health') + self.assertEqual(state_1, state_2) class TestLocationCard(TestCase): -- 2.34.1