コード例 #1
0
class Game:
	# Height and width
	grid_size = (5, 7)

	def __init__(self, player1, player2):
		self._players = (player1, player2)
		self._curr_player = None
		self._next_player = None
		self._grid = Grid(self.grid_size)
		self.draw_buffer = []
		self.activated_organisms = set()
		self._actions_buffer = []
		self.shuffle_water = False
		self._start()

	def draw(self):
		self.draw_buffer.append(
			f'{self._players[0].draw()} \n\n'
			f'{self._players[1].draw()} \n\n'
			f'{self._grid.draw()}')

	def _start(self):
		self._add_game_reference_to_objects()
		self._randomise_arena()
		self._select_first_player()

	def _add_game_reference_to_objects(self):
		for player in self._players:
			player.add_game_reference_to_objects(self)
		self._grid.add_game_reference_to_objects(self)

	def _randomise_arena(self):
		arenas = {'tranquil falls': "Tranquil Falls: Water tiles will be shuffled at the start of a player's turn",
		  'stadium': "Stadium: No stage modifiers are present",
			'forest valley': "Forest Valley: 1 less Berry to evolve",
			'abandoned town': "Abandoned Town: Evolving restores 10 HP"}
		arena = random.choice(list(arenas.keys()))

		if arena == 'stadium':

		elif arena == 'forest valley':
			Player.berries_to_evolve -= 1

		elif arena == 'abandoned town':
			Player.HP_restored_on_evolution = 10
			
		elif arena == 'tranquil falls':
			# Currently does nothing
			self.shuffle_water = True

		self.draw_buffer.append(arenas[arena])
			
	def _select_first_player(self):
		players = list(self._players)
		random.shuffle(players)
		self._curr_player, self._next_player = players
		# Giving the first player the default number of moves
		self._curr_player.reset_moves()
		# Giving the second player extra HP
		self._next_player.curr_HP += 5
		self.draw_buffer.append(f'The first player is {self._curr_player}. \n'
			f'{self._next_player} gets + 5 HP.')

	def add_mana(self, matches_per_type):
		self._curr_player.add_mana(matches_per_type)

	def request_move(self):
		# Add the always available swap action
		actions_str = ["Swap 2 tiles: (x1 y1 x2 y2)"]
		self._actions_buffer = [self._swap_tiles_in_grid]

		# Getting and adding actions from the player
		player_actions_str, player_actions = self._curr_player.get_actions()
		actions_str.extend(player_actions_str)

		# Storing these actions temporarily
		self._actions_buffer.extend(player_actions)

		# Draw game and send available actions to server
		self.draw()
		return str(self._curr_player), actions_str

	def process_move(self, index, player_inputs):
		# Parsing the selected action
		action = self._actions_buffer[index]
		if action.__name__ == "_swap_tiles_in_grid":
			action(*player_inputs)
		else:
			action()
		# Deleting the actions buffer
		self._actions_buffer = []

		# Activating abilities
		for organism in self.activated_organisms:
			self.activated_organisms.remove(organism)
			self._process_ability(organism)

		# Moving to the next player if necessary
		self._curr_player.moves -= 1
		if self._curr_player.moves == 0:
			self._next_player.reset_moves()
			self._curr_player, self._next_player = self._next_player, self._curr_player

	def _shuffle_water_tiles():
		# Placeholder function
		pass
		
	def _swap_tiles_in_grid(self, x1, y1, x2, y2):
		self._grid.swap(x1, y1, x2, y2)
		
	def _process_ability(self, organism):
		organism.num_mana = 0

		# Changing HP
		if organism.ability.HP_delta:
			# Checking for delayed HP Delta
			if organism.ability.HP_delta_duration:
				self._curr_player.add_delayed_HP_delta(organism, organism.ability.HP_delta[0], organism.ability.HP_delta_duration)
				self._next_player.add_delayed_HP_delta(organism, organism.ability.HP_delta[1], organism.ability.HP_delta_duration)
			else:
				self._curr_player.change_HP(organism.ability.HP_delta[0])
				self._next_player.change_HP(organism.ability.HP_delta[1])
			
		# Matching tiles in a specific shape
		if organism.ability.tile_match_shape:
			self._grid.force_grid_match(organism.ability.tile_match_shape)

		# Changing Mana
		if organism.ability.mana_delta:
			# Changing the order of the delta to align it with the intended recipients
			mana_delta = organism.ability.HP_delta
			if not self._curr_player.is_first_organism(organism):
				mana_delta = [mana_delta[1], mana_delta[0], mana_delta[3], mana_delta[2]]

			self._curr_player.change_mana(mana_delta[:int(len(mana_delta)/2)])
			self._next_player.change_mana(mana_delta[int(len(mana_delta)/2):])

		# Converting tiles
		if organism.ability.num_tiles_to_convert:
			self._grid.convert_tiles(organism.mana_type_index, organism.ability.num_tiles_to_convert)
		
		# Changing Berries
		if organism.ability.berries_to_steal:
			berries_to_steal = min(organism.ability.berries_to_steal, self._next_player.num_berries)
			# Steal the berries from the intended target
			self._curr_player.change_num_berries(berries_to_steal)
			self._next_player.change_num_berries(-berries_to_steal)

		# Stealing mana
		if organism.ability.mana_to_steal:
			# Steal mana from the intended target
			mana_stolen = self._next_player.steal_mana(organism.ability.mana_to_steal)
			organism.change_num_mana(mana_stolen)

		# Increasing move count on next turn
		if organism.ability.move_bonus_delta:
			self._curr_player.change_num_moves(organism, organism.ability.move_bonus_delta, organism.ability.move_bonus_duration)

		self.draw()
コード例 #2
0
class Game(Drawable):
    # Height and width
    grid_size = (5, 7)

    def __init__(self, player1, player2):
        self._players = (player1, player2)
        self.curr_player = None
        self.next_player = None
        self.grid = Grid(self.grid_size)
        self.draw_buffer = []
        self._actions_buffer = []
        self._shuffle_water = False
        self._start()
        self.turn_end_events = []

    def draw(self):
        self.draw_buffer.append(f'{self._players[0].draw()} \n\n'
                                f'{self._players[1].draw()} \n\n'
                                f'{self.grid.draw()}')

    def _start(self):
        self._add_game_reference_to_objects()
        self._randomise_arena()
        self._select_first_player()

    def _add_game_reference_to_objects(self):
        for player in self._players:
            player.add_game_reference_to_objects(self)
        self.grid.add_game_reference_to_objects(self)

    def _randomise_arena(self):
        arenas = {
            'tranquil falls':
            "Tranquil Falls: Water tiles will be shuffled at the start of a player's turn",
            'stadium': "Stadium: No stage modifiers are present",
            'forest valley': "Forest Valley: 1 less Berry to evolve",
            'abandoned town': "Abandoned Town: Evolving restores 10 HP"
        }
        arena = random.choice(list(arenas.keys()))

        if arena == 'stadium':
            pass

        elif arena == 'forest valley':
            Player.berries_to_evolve -= 1

        elif arena == 'abandoned town':
            Player.HP_restored_on_evolution = 10

        elif arena == 'tranquil falls':
            self._shuffle_water = True

        self.draw_buffer.append(arenas[arena])

    def _select_first_player(self):
        players = list(self._players)
        random.shuffle(players)
        self.curr_player, self.next_player = players
        # Giving the first player the default number of moves
        self.curr_player.reset_moves()
        # Giving the second player extra HP
        self.next_player.curr_HP += 5
        self.draw_buffer.append(f'The first player is {self.curr_player}. \n'
                                f'{self.next_player} gets + 5 HP.')

    def add_mana(self, matches_per_type):
        print(f"Giving {matches_per_type} to {self.curr_player._name}")
        self.curr_player.add_mana(matches_per_type)

    def request_move(self):
        # Add the always available swap action
        actions_str = ["Swap 2 tiles: (x1 y1 x2 y2)"]
        self._actions_buffer = [self._swap_tiles_in_grid]

        # Debug options
        debug = False
        if debug:
            for index, organism in enumerate(self.curr_player.organisms):
                actions_str.append(f"Give {organism} x mana")
                self._actions_buffer.append(organism.change_num_mana)
                if organism.evolution:
                    actions_str.append(f"Evolve {organism}")
                    self._actions_buffer.append(
                        lambda index=index: self.curr_player.evolve_organism(
                            index))
            actions_str.append(f"Give {self.curr_player} x berries")
            self._actions_buffer.append(self.curr_player.change_num_berries)
            actions_str.append("Do nothing")
            self._actions_buffer.append(lambda: None)

        # Getting and adding actions from the player
        player_actions_str, player_actions = self.curr_player.get_actions()
        actions_str.extend(player_actions_str)

        # Storing these actions temporarily
        self._actions_buffer.extend(player_actions)

        # Draw game and send available actions to server
        self.draw()
        return str(self.curr_player), actions_str

    def process_move(self, index, player_inputs):
        # Parsing the selected action
        try:
            action = self._actions_buffer[index]
        except:
            print("Index out of bound")
            return 0

        return_value = True
        if player_inputs:
            try:
                return_value = action(*player_inputs)
            except:
                return 0
        else:
            action()

        # Checking for a non adjacent swap
        if action.__name__ == "_swap_tiles_in_grid" and return_value == False:
            print("Incorrect parameters for swap")
            return 0

        # Deleting the actions buffer
        self._actions_buffer = []

        # Activating abilities
        ability_activated = True
        while ability_activated:
            ability_activated = False
            for player in self._players:
                for organism in player.organisms:
                    if organism.num_mana >= organism.mana_to_activate_ability:
                        organism.num_mana = 0
                        organism.ability()
                        ability_activated = True

        # Moving to the next player if necessary
        self.curr_player.moves -= 1
        if self.curr_player.moves == 0:
            self.next_player.reset_moves()
            self.curr_player, self.next_player = self.next_player, self.curr_player

            # Running turn end events
            print(self.turn_end_events)
            for event in self.turn_end_events:
                event.act()

            # Removing unsubscribed turn end events
            self.turn_end_events = [
                event for event in self.turn_end_events if event.subscribed
            ]

            # Shuffling water tiles at start of turn
            if self._shuffle_water:
                self._shuffle_water_tiles()
        return 1

    def _shuffle_water_tiles(self):
        self.grid.shuffle_water_tiles()

    def _swap_tiles_in_grid(self, x1, y1, x2, y2):
        if abs(x1 - x2) + abs(y1 - y2) != 1:
            return False
        self.grid.swap(x1, y1, x2, y2)
        return True