def __init__(self): super(CountersState, self).__init__() self.state = { CounterGroup(1): -1, CounterGroup(2): -1, CounterGroup(3): -1, CounterGroup(4): -1 }
def test_update_board(self): moves = [Move(CounterGroup(1), 'forward', 3)] player_structs = {0: CountersState(), 1: CountersState()} self.assertFalse(update_board(moves, 0, player_structs)) self.assertEqual(player_structs[0].state[CounterGroup(1)], 3) self.assertEqual(player_structs[0].state[CounterGroup(2)], -1) self.assertEqual(player_structs[0].state[CounterGroup(3)], -1) self.assertEqual(player_structs[0].state[CounterGroup(4)], -1)
def test_knocked_opponent_counter(self): moves = [Move(CounterGroup(2), 'forward', 3)] player1_state = CountersState() player1_state.state[CounterGroup(1)] = 3 player_structs = {0: CountersState(), 1: player1_state} self.assertTrue(update_board(moves, 0, player_structs)) self.assertEqual(player_structs[0].state[CounterGroup(2)], 3) self.assertEqual(player_structs[1].state[CounterGroup(1)], -1)
def test_merge_two_counters(self): moves = [Move(CounterGroup(2), 'forward', 3), Merge(CounterGroup(1), CounterGroup(2))] player0_state = CountersState() player0_state.state[CounterGroup(1)] = 3 player_structs = {0: player0_state, 1: CountersState()} self.assertFalse(update_board(moves, 0, player_structs)) self.assertTrue(CounterGroup(1, 2) in player_structs[0].state) self.assertFalse(CounterGroup(1) in player_structs[0].state) self.assertFalse(CounterGroup(2) in player_structs[0].state) self.assertEqual(player_structs[0].state[CounterGroup(1, 2)], 3) self.assertEqual(player_structs[0].state[CounterGroup(3)], -1) self.assertEqual(player_structs[0].state[CounterGroup(4)], -1)
def test_knocked_opponent_group_of_counter(self): moves = [Move(CounterGroup(2), 'forward', 3)] player1_state = CountersState() player1_state.remove_group(CounterGroup(1)) player1_state.remove_group(CounterGroup(2)) player1_state.add_group(CounterGroup(1, 2), 3) player_structs = {0: CountersState(), 1: player1_state} self.assertTrue(update_board(moves, 0, player_structs)) self.assertEqual(player_structs[0].state[CounterGroup(2)], 3) self.assertEqual(player_structs[1].state[CounterGroup(1)], -1) self.assertEqual(player_structs[1].state[CounterGroup(2)], -1) self.assertFalse(CounterGroup(1, 2) in player_structs[1].state)
def test_more_moves(self): moves = [Move(CounterGroup(1), 'forward', 3), Move(CounterGroup(2), 'forward', 4), Move(CounterGroup(3), 'turn_left', 4)] player0_state = CountersState() player0_state.state[CounterGroup(3)] = 5 player_structs = {0: player0_state, 1: CountersState()} self.assertFalse(update_board(moves, 0, player_structs)) self.assertEqual(player_structs[0].state[CounterGroup(1)], 3) self.assertEqual(player_structs[0].state[CounterGroup(2)], 4) self.assertEqual(player_structs[0].state[CounterGroup(3)], 29) self.assertEqual(player_structs[0].state[CounterGroup(4)], -1)
def update_board(moves, actual_player, player_structs): only_moves = filter(lambda x: isinstance(x, Move), moves) for move in only_moves: if move.command == "forward": player_structs[actual_player].state[ move.counter_group_id] = forward( player_structs[actual_player].state[move.counter_group_id], move.of) else: # turn_left player_structs[actual_player].state[ move.counter_group_id] = turn_left( player_structs[actual_player].state[move.counter_group_id], move.of) only_merges = filter(lambda x: isinstance(x, Merge), moves) for merge in only_merges: places = [] counter_ids = [] for group in merge.groups: counter_ids.extend(group.counter_set) places.append(player_structs[actual_player].remove_group(group)) new_counter_group = CounterGroup(*counter_ids) player_structs[actual_player].add_group(new_counter_group, max(places)) extra_round_for_knocked = False for counter_group, place in list( player_structs[actual_player].state.iteritems()): for other_counter_group, other_place in list( player_structs[other_player(actual_player)].state.iteritems()): if same_place(place, other_place): _knock_counter_group(other_counter_group, other_player(actual_player), player_structs) extra_round_for_knocked = True return extra_round_for_knocked
def _knock_counter_group(other_counter_group, player, player_structs): # * set to -1 # * split groups player_structs[player].remove_group(other_counter_group) for counter in other_counter_group.counter_set: player_structs[player].add_group(CounterGroup(counter), -1)