Пример #1
0
class Pong:
    def __init__(self, player_names):
        self._screen_dims = [ 500, 500 ]
        self.ball = Ball(1, self.screen_dims)
        self.player1 = Player(True, player_names[0], self.screen_dims)
        self.player2 = Player(False, player_names[1], self.screen_dims)
        self.score_card= ScoreCard()
    
    @property
    def screen_dims(self):
        return self._screen_dims

    def update_ball_coords(self):
        paddles = [self.player1.paddle, self.player2.paddle]
        paddle_gutters = sorted([paddles[0].gutter_boundary, paddles[1].gutter_boundary])
        paddle_offsets = [-1 * paddles[0].height // 2, paddles[0].height // 2]
        paddle_hitboxes = [ [ paddle.y_pos + offset for offset in paddle_offsets ] for paddle in paddles ]

        x, y = [ coord + vel for coord, vel in zip(self.ball.coords, self.ball.velocity) ]

        if x - self.ball.radius <= paddle_gutters[0] or x + self.ball.radius >= paddle_gutters[1]:
            if (paddle_hitboxes[0][0] <= y <= paddle_hitboxes[0][1]
                or paddle_hitboxes[1][0] <= y <= paddle_hitboxes[1][1]):
                self.ball.velocity = [ vel * self.ball.speed_boost for vel in self.ball.velocity ]
                self.ball.velocity[0] *= -1
            else:
                if x - self.ball.radius <= paddle_gutters[0]:
                    self.score_card.scores[1] += 1
                else:
                    self.score_card.scores[0] += 1

                self.ball.reset(self.screen_dims)

        elif y + self.ball.radius >= self.screen_dims[1] or y - self.ball.radius <= 0:
            self.ball.velocity[1]  *= -1

        self.ball.coords = [ coord + vel for coord, vel in zip(self.ball.coords, self.ball.velocity)]
    
    def update_player_coords(self, player, direction):
        player.update_paddle_coords(self.screen_dims[1], direction)
    
    def draw(self, window):
        self.ball.draw(window)
        self.player1.paddle.draw(window)
        self.player2.paddle.draw(window)
        self.score_card.draw(window)