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_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 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_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)
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 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 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 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)
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 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_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 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(player, amount, state): transfer_money = GameStateChange.transfer_money( state.bank, player, amount) return GroupOfChanges([transfer_money])