def test_mortgage(self): state = GameState(1) player = state.players[0] # Set up player to own a railroad state.apply( GroupOfChanges([ GameStateChange.buy_property( state.squares[INDEX[PENNSYLVANIA_RAILROAD]], player, state.bank) ])) # Test mortgage str_before = str(state) state.apply( GroupOfChanges([ GameStateChange.mortgage( state.squares[INDEX[PENNSYLVANIA_RAILROAD]], state) ])) str_after = str(state) expected_diff = [ # Player cash ('Cash: 1300', 'Cash: 1400'), # Bank cash ('Cash: 200', 'Cash: 100'), # Pennsylvania Railroad stats ('Mortgaged: False', 'Mortgaged: True') ] self.assertDiffGameStates( str_before, str_after, expected_diff, msg='Pennsylvania Railroad was not mortgaged properly')
def test_build_house(self): state = GameState(1) # Set up a player to own oranges with no houses player = state.players[0] oranges = [ST_JAMES_PLACE, TENNESSEE_AVENUE, NEW_YORK_AVENUE] changes = [] for prop_name in oranges: changes.append( GameStateChange.buy_property(state.squares[INDEX[prop_name]], player, state.bank)) state.apply(GroupOfChanges(changes)) # Test house build str_before = str(state) state.apply( GroupOfChanges([ GameStateChange.build(state.squares[INDEX[NEW_YORK_AVENUE]], state) ])) str_after = str(state) expected_diff = [ ('Cash: 940', 'Cash: 840'), # player cash ('Cash: 560', 'Cash: 660'), # bank cash ('Num houses: 0', 'Num houses: 1'), # new york avenue ('Houses remaining: 32', 'Houses remaining: 31') ] self.assertDiffGameStates(str_before, str_after, expected_diff, msg='House build was not applied properly')
def test_change_position_from_middle(self): state = GameState(1) player = state.players[0] # Set up player's initial position at Community Chest 2 state.apply( GroupOfChanges([ GameStateChange.change_position(player, INDEX[COMMUNITY_CHEST_2], state.bank, state.squares) ])) # Test player changing position to Water Works str_before = str(state) state.apply( GroupOfChanges([ GameStateChange.change_position(player, INDEX[WATER_WORKS], state.bank, state.squares) ])) str_after = str(state) expected_diff = [('Position: %d' % INDEX[COMMUNITY_CHEST_2], 'Position: %d' % INDEX[WATER_WORKS])] self.assertDiffGameStates( str_before, str_after, expected_diff, msg= 'Player was not moved from Community Chest 2 to Water Works properly' )
def test_change_position_landing_on_go(self): state = GameState(1) player = state.players[0] # Set up player's initial position at Short Line Railroad state.apply( GroupOfChanges([ GameStateChange.change_position(player, INDEX[SHORT_LINE_RAILROAD], state.bank, state.squares) ])) # Test player changing position to Go str_before = str(state) state.apply( GroupOfChanges([ GameStateChange.change_position(player, INDEX[GO], state.bank, state.squares) ])) str_after = str(state) expected_diff = [ # Player stats ('Position: %d' % INDEX[SHORT_LINE_RAILROAD], 'Position: %d' % INDEX[GO]), ('Cash: 1500', 'Cash: 1700'), # Bank stats ('Cash: 0', 'Cash: -200') ] self.assertDiffGameStates(str_before, str_after, expected_diff, msg='Player did not pass Go properly')
def test_leave_jail(self): state = GameState(1) player = state.players[0] # Test that leaving jail works no matter how many jail moves are left for num_turns in range(0, 3): # Set up player in jail state.apply(GroupOfChanges([GameStateChange.send_to_jail(player)])) # Decrement player's jail moves num_turns (0, 1, or 2) times for i in range(0, num_turns): state.apply( GroupOfChanges( [GameStateChange.decrement_jail_moves(player)])) # Test leaving jail, and ensure that player's jail moves are changed # correctly and that no other changes were made to the state. str_before = str(state) state.apply(GroupOfChanges([GameStateChange.leave_jail(player)])) str_after = str(state) expected_diff = [('Jail moves: %d' % (3 - num_turns), 'Jail moves: 0')] self.assertDiffGameStates(str_before, str_after, expected_diff, msg='Player did not leave jail properly')
def buy_or_deny(self, player, prop, state): if player.cash >= prop.price: return GroupOfChanges(changes=[ GameStateChange.buy_property(prop, player, state.bank) ]) else: return GroupOfChanges()
def setup_eliminator_player(self, state): player = state.players[1] yellows = [ATLANTIC_AVENUE, VENTNOR_AVENUE, MARVIN_GARDENS] railroads = [READING_RAILROAD, PENNSYLVANIA_RAILROAD, B_AND_O_RAILROAD] changes = [] # Add to player's initial $1500 to bring him to $3000 cash changes.append(GameStateChange.transfer_money(state.bank, player, 1500)) # Give player properties for prop_name in yellows + railroads: changes.append( GameStateChange.buy_property(state.squares[INDEX[prop_name]], player, state.bank)) state.apply(GroupOfChanges(changes)) # Build to 3 house level on yellows for count in range(0, 3): for prop_name in yellows: state.apply( GroupOfChanges([ GameStateChange.build(state.squares[INDEX[prop_name]], state) ]))
def test_demolish_house(self): state = GameState(1) # Set up a player to own a property with 1 house player = state.players[0] park_place = state.squares[INDEX[PARK_PLACE]] boardwalk = state.squares[INDEX[BOARDWALK]] state.apply( GroupOfChanges( [GameStateChange.buy_property(park_place, player, state.bank)])) state.apply( GroupOfChanges( [GameStateChange.buy_property(boardwalk, player, state.bank)])) state.apply(GroupOfChanges([GameStateChange.build(boardwalk, state)])) # Test applying the changes by comparing differences in their string # encodings. Ensure that no additional changes were made to the state. str_before = str(state) state.apply( GroupOfChanges([GameStateChange.demolish(boardwalk, state)])) str_after = str(state) expected_diff = [ ('Cash: 550', 'Cash: 650'), # player cash ('Cash: 950', 'Cash: 850'), # bank cash ('Num houses: 1', 'Num houses: 0'), ('Houses remaining: 31', 'Houses remaining: 32') ] self.assertDiffGameStates( str_before, str_after, expected_diff, msg='House demolition was not applied correctly')
def test_decrement_jail_card_count(self): state = GameState(1) player = state.players[0] # Test both decks dict_card_types = { CHANCE_CARD: 'Chance', COMMUNITY_CHEST_CARD: 'Community Chest' } for card_type, card_str in dict_card_types.iteritems(): deck = state.decks[card_type] # Set up a player to have a 'Get out of jail free' card while deck.peek() != LMBDA_GET_OUT_OF_JAIL_FREE: state.apply( GroupOfChanges([GameStateChange.draw_card(deck, player)])) state.apply( GroupOfChanges([GameStateChange.draw_card(deck, player) ])) # draw Jail Free card # Test difference in jail card count by looking at the difference in # GameStates' string encodings. Ensure that only the jail card count was # changed. str_before = str(state) state.apply( GroupOfChanges( [GameStateChange.decrement_jail_card_count(player, deck)])) str_after = str(state) expected_diff = [('Jail free count: 1', 'Jail free count: 0')] self.assertDiffGameStates( str_before, str_after, expected_diff, msg='Jail free count was not decremented correctly') # Test that the Jail Free card was placed back on the bottom of the deck, # and that no additional copies of the Jail Free card are in the deck count = 0 for i in range(0, deck.size() - 1): card = deck.draw() # draw all cards except last one if card == LMBDA_GET_OUT_OF_JAIL_FREE: count += 1 self.assertEqual( count, 0, msg= 'Another Get out of jail free card is in the middle of the %s deck' % card_str) self.assertEqual( deck.peek(), LMBDA_GET_OUT_OF_JAIL_FREE, msg='Get out of jail free card was not replaced into %s deck' % card_str)
def landed(self, player, roll, state): deck = state.decks[self._card_type] draw_card = GameStateChange.draw_card(deck, player) card_lmbda = draw_card.card_drawn[deck] result_of_card = None if card_lmbda == LMBDA_GET_OUT_OF_JAIL_FREE: result_of_card = GroupOfChanges() else: result_of_card = card_lmbda(player, state) return GroupOfChanges.combine( [GroupOfChanges([draw_card]), result_of_card])
def test_transfer_property(self): state = GameState(2) player1 = state.players[0] player2 = state.players[1] # Set up player1 to have the purples, player2 to have the railroads purples = [MEDITERRANEAN_AVENUE, BALTIC_AVENUE] changes = [] for prop_name in purples: changes.append( GameStateChange.buy_property(state.squares[INDEX[prop_name]], player1, state.bank)) state.apply(GroupOfChanges(changes)) railroads = [ READING_RAILROAD, PENNSYLVANIA_RAILROAD, B_AND_O_RAILROAD, SHORT_LINE_RAILROAD ] changes = [] for prop_name in railroads: changes.append( GameStateChange.buy_property(state.squares[INDEX[prop_name]], player2, state.bank)) state.apply(GroupOfChanges(changes)) # Transfer property str_before = str(state) state.apply( GroupOfChanges([ GameStateChange.transfer_property( player1, player2, state.squares[INDEX[BALTIC_AVENUE]]) ])) str_after = str(state) expected_diff = [ # Player 1 stats ('Mediterranean Avenue, Baltic Avenue, ', 'Mediterranean Avenue, ' ), ('0: 2', '0: 1'), # Player 2 properties ('Reading Railroad, Pennsylvania Railroad, B. & O. Railroad, Short Line Railroad, ', 'Reading Railroad, Pennsylvania Railroad, B. & O. Railroad, Short Line Railroad, Baltic Avenue, ' ), ('0: 0', '0: 1') ] self.assertDiffGameStates( str_before, str_after, expected_diff, msg='Baltic Avenue was not transferred properly')
def __init__(self, house_builds=GroupOfChanges(), hotel_builds=GroupOfChanges(), house_demolitions=GroupOfChanges(), hotel_demolitions=GroupOfChanges()): self._house_builds = house_builds self._hotel_builds = hotel_builds self._house_demolitions = house_demolitions self._hotel_demolitions = hotel_demolitions # Calculate integer quantities of houses/hotels built and demolished self._houses_built = self._house_builds.houses_built self._hotels_built = self._hotel_builds.hotels_built self._houses_demolished = self._house_demolitions.houses_demolished self._hotels_demolished = self._hotel_demolitions.hotels_demolished
def test_transfer_money_bank_to_player(self): import random state = GameState(1) player = state.players[0] # Transfer random amounts of money, and test that GameState is correct for trial in range(0, 100): player_cash_before = player.cash bank_cash_before = state.bank.cash amount = random.randint(1, player_cash_before) str_before = str(state) state.apply( GroupOfChanges([ GameStateChange.transfer_money(state.bank, player, amount) ])) str_after = str(state) expected_diff = [ # Player cash ('Cash: %d' % player_cash_before, 'Cash: %d' % (player_cash_before + amount)), # Bank cash ('Cash: %d' % bank_cash_before, 'Cash: %d' % (bank_cash_before - amount)) ] self.assertDiffGameStates( str_before, str_after, expected_diff, msg='$%d was not transferred to player correctly. Here is diff:' % amount)
def test_buy_property_from_nothing(self): state = GameState(1) player = state.players[0] # Test buying Pacific Avenue str_before = str(state) state.apply( GroupOfChanges([ GameStateChange.buy_property( state.squares[INDEX[PACIFIC_AVENUE]], player, state.bank) ])) str_after = str(state) expected_diff = [ # Player 1 stats ('Cash: 1500', 'Cash: 1200'), ('', 'Pacific Avenue, '), ('6: 0', '6: 1'), # Bank stats ('Cash: 0', 'Cash: 300'), ('Mediterranean Avenue, Baltic Avenue, Reading Railroad, Oriental Avenue, Vermont Avenue, Connecticut Avenue, St. Charles Place, Electric Company, States Avenue, Virginia Avenue, Pennsylvania Railroad, St. James Place, Tennessee Avenue, New York Avenue, Kentucky Avenue, Indiana Avenue, Illinois Avenue, B. & O. Railroad, Atlantic Avenue, Ventnor Avenue, Water Works, Marvin Gardens, Pacific Avenue, North Carolina Avenue, Pennsylvania Avenue, Short Line Railroad, Park Place, Boardwalk, ', 'Mediterranean Avenue, Baltic Avenue, Reading Railroad, Oriental Avenue, Vermont Avenue, Connecticut Avenue, St. Charles Place, Electric Company, States Avenue, Virginia Avenue, Pennsylvania Railroad, St. James Place, Tennessee Avenue, New York Avenue, Kentucky Avenue, Indiana Avenue, Illinois Avenue, B. & O. Railroad, Atlantic Avenue, Ventnor Avenue, Water Works, Marvin Gardens, North Carolina Avenue, Pennsylvania Avenue, Short Line Railroad, Park Place, Boardwalk, ' ), ('6: 3', '6: 2') ] self.assertDiffGameStates( str_before, str_after, expected_diff, msg='Pacific Avenue was not purchased properly')
def run(self): num_players = len(self._state.players) idx = random.randint(0,num_players-1) while not self._completed(): # cash = [player.cash for player in self._state.players] # print cash player = self._state.players[idx] idx = (idx + 1) % len(self._state.players) roll = Roll() print '%s rolled a %d%s' % (player.name, roll.value, ' (doubles)' if roll.is_doubles else '') if player.jail_moves > 0 and roll.is_doubles: self._state.apply(GroupOfChanges(changes=[GameStateChange.leave_jail(player)])) elif player.jail_moves >= 2: self._state.apply(GroupOfChanges(changes=[GameStateChange.decrement_jail_moves(player)])) self._wait() continue elif player.jail_moves == 1: # TODO: Allow player to choose to use a "Get out of jail free" card pay_changes = player.pay(self._state.bank, 50, self._state) leave_changes = GroupOfChanges(changes=[GameStateChange.leave_jail(player)]) self._state.apply(GroupOfChanges.combine([pay_changes, leave_changes])) self._take_turn(player, roll.value) num_rolls = 0 max_rolls = 2 while roll.is_doubles: roll = Roll() print '%s rolled a %d%s' % (player.name, roll.value, ' (doubles)' if roll.is_doubles else '') num_rolls += 1 if num_rolls > max_rolls: self._state.apply(GroupOfChanges(changes=[GameStateChange.send_to_jail(player)])) break self._take_turn(player, roll.value)
def _auction(num_houses, players, lambda_bid, lambda_extract_bid): players_in_auction = dict(zip(players, [True] * len(players))) properties_to_build_houses_on = self._properties_to_build_houses_on() all_changes = [] for i in range(num_houses): highest_bid = 0 highest_changes = None while True: highest_bid_for_round = highest_bid highest_changes_for_round = dict() for player in players: if not players_in_auction[player]: continue goc = lambda_bid(player, highest_bid, properties_to_build_houses_on[player], self._state) bid = 0 for change in goc: if len(change.change_in_houses) > 0: bid = lambda_extract_bid(change, state) if bid < highest_bid: players_in_auction[player] = False elif bid > highest_bid_for_round: highest_bid_for_round = bid highest_changes_for_round = {player: goc} elif bid == highest_bid_for_round: highest_changes_for_round[player] = goc if len(highest_changes_for_round) > 1: fastest_time = 10000 fastest_player = None fastest_goc = None for player, goc in highest_changes_for_round.iteritems(): # TODO: Don't use datetime, better timing solution (timeit doesn't work bc lambda params are out of scope) times = [] for i in range(3): start = datetime.datetime.now() lambda_bid(player, highest_changes_for_round, properties_to_build_houses_on[player], self._state) end = datetime.datetime.now() times.append((end - start).total_seconds()) avg_time = sum(times)/len(times) if avg_time < fastest_time: fastest_time = avg_time fastest_player = player fastest_goc = goc highest_changes_for_round = {fastest_player: fastest_goc} if highest_bid_for_round > highest_bid: highest_bid = highest_bid_for_round highest_changes = highest_changes_for_round[highest_changes_for_round.keys()[0]] if len(highest_changes_for_round) == 0 or players_in_auction.values().count(True) <= 1: break all_changes.append(highest_changes) return GroupOfChanges.combine(all_changes)
def test_build_hotel(self): state = GameState(1) # Set up a player to own reds with 4 houses each player = state.players[0] reds = [KENTUCKY_AVENUE, INDIANA_AVENUE, ILLINOIS_AVENUE] state.apply( GroupOfChanges([ GameStateChange.transfer_money( state.bank, player, 1130) # needs $1130 more to buy everything ])) changes = [] for prop_name in reds: changes.append( GameStateChange.buy_property(state.squares[INDEX[prop_name]], player, state.bank)) state.apply(GroupOfChanges(changes)) for count in range(0, 4): for prop_name in reds: state.apply( GroupOfChanges([ GameStateChange.build(state.squares[INDEX[prop_name]], state) ])) # Test hotel build str_before = str(state) state.apply( GroupOfChanges([ GameStateChange.build(state.squares[INDEX[INDIANA_AVENUE]], state) ])) str_after = str(state) expected_diff = [('Cash: 150', 'Cash: 0'), ('Cash: 1350', 'Cash: 1500'), ('Num houses: 4', 'Num houses: 5'), ('Houses remaining: 20', 'Houses remaining: 24'), ('Hotels remaining: 12', 'Hotels remaining: 11')] self.assertDiffGameStates(str_before, str_after, expected_diff, msg='Hotel build was not applied properly')
def run(self): num_players = len(self._state.players) idx = random.randint(0, num_players - 1) while not self._completed(): # cash = [player.cash for player in self._state.players] # print cash player = self._state.players[idx] idx = (idx + 1) % len(self._state.players) roll = Roll() print '%s rolled a %d%s' % (player.name, roll.value, ' (doubles)' if roll.is_doubles else '') if player.jail_moves > 0 and roll.is_doubles: self._state.apply( GroupOfChanges( changes=[GameStateChange.leave_jail(player)])) elif player.jail_moves >= 2: self._state.apply( GroupOfChanges( changes=[GameStateChange.decrement_jail_moves(player) ])) self._wait() continue elif player.jail_moves == 1: # TODO: Allow player to choose to use a "Get out of jail free" card pay_changes = player.pay(self._state.bank, 50, self._state) leave_changes = GroupOfChanges( changes=[GameStateChange.leave_jail(player)]) self._state.apply( GroupOfChanges.combine([pay_changes, leave_changes])) self._take_turn(player, roll.value) num_rolls = 0 max_rolls = 2 while roll.is_doubles: roll = Roll() print '%s rolled a %d%s' % (player.name, roll.value, ' (doubles)' if roll.is_doubles else '') num_rolls += 1 if num_rolls > max_rolls: self._state.apply( GroupOfChanges( changes=[GameStateChange.send_to_jail(player)])) break self._take_turn(player, roll.value)
def _pay_each_player_50(player, state): changes_paying_players = [] for other_player in state.players: if other_player != player: changes_paying_players.append( player.pay(other_player, 50, state)) all_payments = GroupOfChanges.combine(changes_paying_players) return all_payments
def test_demolish_hotel(self): state = GameState(1) # Set up a player to own a property group with hotels on all properties player = state.players[0] state.apply( GroupOfChanges([ GameStateChange.transfer_money(state.bank, player, 440) ])) # Needs 440 more to buy everything pinks = [ST_CHARLES_PLACE, STATES_AVENUE, VIRGINIA_AVENUE] changes = [] for prop_name in pinks: changes.append( GameStateChange.buy_property(state.squares[INDEX[prop_name]], player, state.bank)) state.apply(GroupOfChanges(changes)) for i in range(0, 5): for prop_name in pinks: state.apply( GroupOfChanges([ GameStateChange.build(state.squares[INDEX[prop_name]], state) ])) # Test demolition str_before = str(state) state.apply( GroupOfChanges([ GameStateChange.demolish( state.squares[INDEX[ST_CHARLES_PLACE]], state) ])) str_after = str(state) expected_diff = [ ('Cash: 0', 'Cash: 50'), # player cash ('Cash: 1500', 'Cash: 1450'), # bank cash ('Num houses: 5', 'Num houses: 4'), # st charles place ('Houses remaining: 32', 'Houses remaining: 28'), ('Hotels remaining: 9', 'Hotels remaining: 10') ] self.assertDiffGameStates( str_before, str_after, expected_diff, msg='Hotel demolition was not applied correctly')
def _collect_50_from_every_player(player, state): changes_from_other_players = [] for other_player in state.players: if other_player != player: changes_from_other_players.append( other_player.pay(player, 50, state)) all_payments = GroupOfChanges.combine(changes_from_other_players) return all_payments
def pay(self, player_from, player_to, amount, state): transfer_money = GameStateChange.transfer_money( player_from, player_to, amount) changes = [] # Try paying all cash first if player_from.cash >= amount: changes.append(transfer_money) return GroupOfChanges(changes=changes) # Mortgage properties until the difference is paid off difference = amount - player_from.cash i = 0 while difference > 0 and i < len(player_from.props): prop = player_from.props[i] i += 1 if not prop.mortgaged and DefaultDecisionMaker._can_mortgage_property( prop, state): mortgage = GameStateChange.mortgage(prop, player_from, state.bank) changes.append(mortgage) difference -= mortgage.change_in_cash[player_from] if difference <= 0: changes.append(transfer_money) return GroupOfChanges(changes=changes) # Mortgaging was not enough. Demolish until the difference is paid off i = 0 while difference > 0 and i < len(player_from.props): prop = player_from.props[i] i += 1 if prop.num_houses > 0: demolition = DefaultDecisionMaker._demolish_from_property_group( prop, state) if demolition != None: changes.append(demolition) difference -= demolition.change_in_cash[player_from] if difference <= 0: changes.append(transfer_money) return GroupOfChanges(changes=changes) # Player cannot pay it off, so he loses return GroupOfChanges( changes=[GameStateChange.eliminate(player_from, player_to, state)])
def bid_hotel_demolitions(self, player, highest_bid, props_to_demolish_on, state): bid = player.cash / 2 prop_to_demolish_on = props_to_demolish_on[0] hotel_demolition = GameStateChange.demolish(prop, state) house_builds = [GameStateChange.build(prop, state) ] * NUM_HOUSES_BEFORE_HOTEL return GroupOfChanges([hotel_demolition] + house_builds)
def landed(self, player, roll, state): owner = state.get_owner(self) if owner == player: return GroupOfChanges() elif owner == state.bank: return player.buy_or_deny(self, state) else: rent = self.get_rent_with(self.num_houses, state) return player.pay(owner, rent, state)
def test_draw_card(self): state = GameState(1) player = state.players[0] # Test every card in both decks dict_card_types = { CHANCE_CARD: 'Chance', COMMUNITY_CHEST_CARD: 'Community Chest' } for card_type, card_str in dict_card_types.iteritems(): deck = state.decks[card_type] # Draw every card in the deck, check that cards are handled correctly # and that nothing else in the state is changed card = None for i in range(0, deck.size()): card = deck.peek() jail_free_count_before = player.jail_free_count str_before = str(state) expected_diff = None # initialized in the following if-block state.apply( GroupOfChanges([GameStateChange.draw_card(deck, player)])) if card == LMBDA_GET_OUT_OF_JAIL_FREE: # Check that the card is not replaced on the deck, and that the # player's Jail Free card count is incremented. self.assertEqual(player.jail_free_count, jail_free_count_before + 1) for j in range(0, deck.size()): self.assertNotEqual(deck.draw(), LMBDA_GET_OUT_OF_JAIL_FREE) # Initialize. Used after this if-block to ensure that nothing else # in the state was changed. expected_diff = [ ('Jail free count: %d' % jail_free_count_before, 'Jail free count: %d' % player.jail_free_count) ] else: # Check that the card is replaced on the bottom if it is not the # Jail Free card. for j in range(0, deck.size() - 1): deck.draw() self.assertEqual(deck.draw(), card) # compare with last card # Initialize expected_diff = [] # Check that the rest of the state is unchanged by comparing the # string encodings of the GameStates str_after = str(state) self.assertDiffGameStates( str_before, str_after, expected_diff, msg='The GameState was not modified correctly')
def setup_eliminated_player(self, state): player = state.players[0] light_blues = [ORIENTAL_AVENUE, VERMONT_AVENUE, CONNECTICUT_AVENUE] # Give player properties changes = [] for prop_name in light_blues: changes.append( GameStateChange.buy_property(state.squares[INDEX[prop_name]], player, state.bank)) state.apply(GroupOfChanges(changes)) # Build to 3 house level on light blues for count in range(0, 3): for prop_name in light_blues: state.apply( GroupOfChanges([ GameStateChange.build(state.squares[INDEX[prop_name]], state) ])) # Give player some other properties mortgaged changes = [] other_props = [STATES_AVENUE, SHORT_LINE_RAILROAD] for prop_name in other_props: changes.append( GameStateChange.buy_property(state.squares[INDEX[prop_name]], player, state.bank, mortgaged=True)) state.apply(GroupOfChanges(changes)) # Give player a Jail Free card changes = [] deck = state.decks[CHANCE_CARD] while deck.peek() != LMBDA_GET_OUT_OF_JAIL_FREE: deck.draw() changes.append(GameStateChange.draw_card( deck, player)) # draw Jail Free card state.apply(GroupOfChanges(changes))
def test_decrement_jail_moves(self): state = GameState(1) player = state.players[0] # Set up player in jail state.apply(GroupOfChanges([GameStateChange.send_to_jail(player)])) # Decrement jail moves, and test that the player's jail moves were changed # correctly and that no other changes were made to the state. str_before = str(state) state.apply( GroupOfChanges([GameStateChange.decrement_jail_moves(player)])) str_after = str(state) expected_diff = [('Jail moves: 3', 'Jail moves: 2')] self.assertDiffGameStates( str_before, str_after, expected_diff, msg='Player jail moves were not decremented properly')
def landed(self, player, roll, state, from_card=False): owner = state.get_owner(self) if owner == player: return GroupOfChanges() elif owner == state.bank: return player.buy_or_deny(self, state) else: num_owned = owner.property_group_counts[self.property_group] rent = self.get_rent(num_owned, roll, state, from_card) return player.pay(owner, rent, state)
def test_buy_property_from_something(self): state = GameState(1) player = state.players[0] # Set up player with some properties (two of the three greens) changes = [] for prop_name in [PACIFIC_AVENUE, PENNSYLVANIA_AVENUE]: changes.append( GameStateChange.buy_property(state.squares[INDEX[prop_name]], player, state.bank)) state.apply(GroupOfChanges(changes)) # Test buying North Carolina Avenue str_before = str(state) state.apply( GroupOfChanges([ GameStateChange.buy_property( state.squares[INDEX[NORTH_CAROLINA_AVENUE]], player, state.bank) ])) str_after = str(state) expected_diff = [ # Player 1 stats ('Cash: 880', 'Cash: 580'), ('Pacific Avenue, Pennsylvania Avenue, ', 'Pacific Avenue, Pennsylvania Avenue, North Carolina Avenue, '), ('6: 2', '6: 3'), # Bank stats ('Cash: 620', 'Cash: 920'), ('Mediterranean Avenue, Baltic Avenue, Reading Railroad, Oriental Avenue, Vermont Avenue, Connecticut Avenue, St. Charles Place, Electric Company, States Avenue, Virginia Avenue, Pennsylvania Railroad, St. James Place, Tennessee Avenue, New York Avenue, Kentucky Avenue, Indiana Avenue, Illinois Avenue, B. & O. Railroad, Atlantic Avenue, Ventnor Avenue, Water Works, Marvin Gardens, North Carolina Avenue, Short Line Railroad, Park Place, Boardwalk, ', 'Mediterranean Avenue, Baltic Avenue, Reading Railroad, Oriental Avenue, Vermont Avenue, Connecticut Avenue, St. Charles Place, Electric Company, States Avenue, Virginia Avenue, Pennsylvania Railroad, St. James Place, Tennessee Avenue, New York Avenue, Kentucky Avenue, Indiana Avenue, Illinois Avenue, B. & O. Railroad, Atlantic Avenue, Ventnor Avenue, Water Works, Marvin Gardens, Short Line Railroad, Park Place, Boardwalk, ' ), ('6: 1', '6: 0') ] self.assertDiffGameStates( str_before, str_after, expected_diff, msg='North Carolina Avenue was not purchased properly')
def _take_turn(self, player, roll): position = (player.position + roll) % NUM_SQUARES self._state.apply( GroupOfChanges([ GameStateChange.change_position(player, position, self._state.bank, self._state.squares) ])) self._state.apply(self._state.squares[position].landed( player, roll, self._state)) self._notify_all() self._wait()
def test_transfer_money_player_to_player(self): import random state = GameState(2) # Transfer money, and test that GameState is correct for trial in range(0, 100): # Restock players if they run out of cash during trials for i in range(0, 2): if state.players[i].cash == 0: state.players[i].cash = 1500 # Test transfer cash_before = [0] * 2 for i in range(0, 2): cash_before[i] = state.players[i].cash pfrom = random.randint(0, 1) pto = 1 - pfrom amount = random.randint(1, cash_before[pfrom]) str_before = str(state) state.apply( GroupOfChanges([ GameStateChange.transfer_money(state.players[pfrom], state.players[pto], amount) ])) str_after = str(state) expected_diff = [ # pfrom cash ('Cash: %d' % cash_before[pfrom], 'Cash: %d' % (cash_before[pfrom] - amount)), # pto cash ('Cash: %d' % cash_before[pto], 'Cash: %d' % (cash_before[pto] + amount)) ] # Player stats must be listed in numerical order, so swap the order # if pfrom is not the 0'th player if pfrom == 1: expected_diff.reverse() self.assertDiffGameStates( str_before, str_after, expected_diff, msg= '$%d was not transferred between players correctly. Here is diff:' % amount)