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)
示例#2
0
    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)
示例#3
0
    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)
                    ]))
示例#4
0
    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)
示例#5
0
    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)])
示例#7
0
    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')
示例#13
0
 def _collect(player, amount, state):
     transfer_money = GameStateChange.transfer_money(
         state.bank, player, amount)
     return GroupOfChanges([transfer_money])