| 235 | |
| 236 | |
| 237 | class PongGame: |
| 238 | def __init__(self, game_field: GameField, |
| 239 | ball: Ball, |
| 240 | player: Gamer, |
| 241 | computer: Gamer, |
| 242 | max_score: int = 100, |
| 243 | fps: int = 120) -> None: |
| 244 | self._period = 1 / fps |
| 245 | self._max_ball_time_4_travel = 3 |
| 246 | self._max_gamer_time_4_travel = 2 |
| 247 | self._pong_pygame = pygame |
| 248 | self._game_field = game_field |
| 249 | self._ball = ball |
| 250 | self._player = player |
| 251 | self._computer = computer |
| 252 | self._pong_pygame.init() |
| 253 | self._clock = self._pong_pygame.time.Clock() |
| 254 | self._stat = {"player_score": 0, "cpu_score": 0, |
| 255 | "last_diff": 0, "level": 1, "max_score": max_score} |
| 256 | self._fps = fps |
| 257 | self._BALL_SPEED_X_DFLT = (self._game_field.disp_w) / (self._max_ball_time_4_travel * self._fps) |
| 258 | self._BALL_SPEED_Y_DFLT = (self._game_field.disp_h) / (self._max_ball_time_4_travel * self._fps) |
| 259 | self._CPU_SPEED_DFLT = (self._game_field.disp_h) / (self._max_gamer_time_4_travel * self._fps) |
| 260 | self._cpu_speed_increment = 1 |
| 261 | self._ball_speed_increment = 0.5 |
| 262 | self._player_speed = (self._game_field.disp_h) / (self._max_gamer_time_4_travel * self._fps) |
| 263 | self._cpu_speed = self._CPU_SPEED_DFLT |
| 264 | |
| 265 | def _reset_game(self): |
| 266 | self._update_game_speed() |
| 267 | self._ball.reset() |
| 268 | self._player.reset() |
| 269 | self._computer.reset() |
| 270 | |
| 271 | def _check_collision(self): |
| 272 | ball_coord = self._ball.get_borders() |
| 273 | if ball_coord['left'] <= self._computer.get_borders()['left']: |
| 274 | pong_log.debug("Player score +1") |
| 275 | self._stat['player_score'] += 1 |
| 276 | self._reset_game() |
| 277 | |
| 278 | if ball_coord['right'] >= self._player.get_borders()['right']: |
| 279 | pong_log.debug("CPU score +1") |
| 280 | self._stat['cpu_score'] += 1 |
| 281 | self._reset_game() |
| 282 | |
| 283 | if ball_coord['right'] > self._game_field.disp_w / 2 and ball_coord['right'] >= self._player.get_borders()['left']: |
| 284 | if ball_coord['top'] <= self._player.get_borders()['bott'] and ball_coord['bott'] >= self._player.get_borders()['top']: |
| 285 | self._ball.invert_move(invert_x=True) |
| 286 | |
| 287 | if ball_coord['left'] < self._game_field.disp_w / 2 and ball_coord['left'] <= self._computer.get_borders()['right']: |
| 288 | if ball_coord['top'] <= self._computer.get_borders()['bott'] and ball_coord['bott'] >= self._computer.get_borders()['top']: |
| 289 | self._ball.invert_move(invert_x=True) |
| 290 | |
| 291 | # Update game speed after a reset due to cpu error |
| 292 | def _update_game_speed(self): |
| 293 | score_diff = self._stat['player_score'] - self._stat['cpu_score'] |
| 294 | if score_diff > 0 and score_diff > self._stat['last_diff']: |