Esempio n. 1
0
class Player:

    def __init__(self, id, route):
        self.field_font = font.Font('freesansbold.ttf', 16)
        self.text = self.field_font.render("Player #{}".format(id), False, (255, 255, 255))
        self.id = id
        self.route = route
        self.roll_attempts = 0
        if id == 0:
            self.base = Base(100, 100, (0, 255, 0), id)
            self.dice = Dice(175, 25)
        if id == 1:
            self.base = Base(600, 100, (0, 0, 255), id)
            self.dice = Dice(675, 25)
        if id == 2:
            self.base = Base(600, 600, (255, 255, 0), id)
            self.dice = Dice(675, 525)
        if id == 3:
            self.base = Base(100, 600, (255, 0, 0), id)
            self.dice = Dice(175, 525)

        self.__pawns = self.base.get_pawns()
        self.assign_route_to_pawns()

    def set_route(self, route):
        self.route = route

    def tick(self):
        if self.has_all_pawns_in_base() and self.dice.check_if_hovered() and Handler.mouse_clicked \
                and Handler.dice_value != 6 and self.roll_attempts < 3:
            self.dice.roll()
            self.roll_attempts += 1
            self.dice.y_pos += 50
            if self.roll_attempts == 3:
                Handler.player_moved = True
                self.dice.y_pos -= 150
                self.roll_attempts = 0
        self.base.tick()
        for pawn in self.__pawns:
            if pawn.check_if_hovered() and Handler.mouse_clicked and self.can_move_pawn(pawn):
                if pawn.is_in_base() and Handler.dice_value == 6:
                    Handler.dice_value = 1
                    self.handle_movement_and_killing(pawn)
                    self.dice.roll()
                    self.roll_attempts += 1
                    self.dice.y_pos += 50
                elif not pawn.is_in_base() and Handler.dice_value != 6:
                    self.handle_movement_and_killing(pawn)
                    Handler.player_moved = True
                    self.roll_attempts = 0
                    self.dice.set_default_position()
                elif not pawn.is_in_base() and Handler.dice_value == 6:
                    self.handle_movement_and_killing(pawn)
                    self.dice.roll()
                    self.roll_attempts += 1
                    self.dice.y_pos += 50
                if self.roll_attempts == 3:
                    Handler.player_moved = True
                    self.dice.set_default_position()
                    self.roll_attempts = 0
        if self.cant_perform_an_action() and self.dice.check_if_hovered() and Handler.mouse_clicked:
            Handler.player_moved = True

    def cant_perform_an_action(self):
        for pawn in self.__pawns:
            if self.can_move_pawn(pawn):
                return False
            if pawn.is_in_base() and Handler.dice_value == 6:
                return False
        return True

    @staticmethod
    def check_for_kills(field):
        if field.pawn_on_this_field is not None:
            field.pawn_on_this_field.kill()

    def can_move_pawn(self, pawn):
        if pawn.is_in_base() and Handler.dice_value != 6:
            return False
        if pawn.position + Handler.dice_value > len(self.route) - 1:  # jesli wyjdzie poza plansze
            return False
        if self.route[
            pawn.position + Handler.dice_value].pawn_on_this_field is not None:  # jesli pole, na ktore idzie jest zajete
            if self.route[pawn.position + Handler.dice_value].pawn_on_this_field.base_id == pawn.base_id:
                return False
        return True

    def handle_movement_and_killing(self, pawn):
        self.route[pawn.position].pawn_on_this_field = None
        pawn.move()
        self.check_for_kills(self.route[pawn.position])
        self.route[pawn.position].pawn_on_this_field = pawn

    def render(self):
        self.base.render()
        Handler.display.blit(self.text, (self.base.get_coords()[0] - 40, self.base.get_coords()[1] + 85))

    def assign_route_to_pawns(self):
        for pawn in self.__pawns:
            pawn.set_route(self.route)

    def has_all_pawns_in_base(self):
        for pawn in self.__pawns:
            if not pawn.is_in_base():
                return False
        return True