Я учу себя python и работаю над клоном космических захватчиков. Практически все работает так, как я хочу. Но я также пытаюсь научить себя хорошим принципам объектно-ориентированного проектирования.
У меня есть один класс AlienInvasion, который инициализирует кучу игровых объектов и запускает l oop для игры (в настоящее время он также делает некоторые другие вещи, которые, вероятно, должны быть в их собственных классах). Когда я создаю каждый объект, я передаю ему объект AlienInvasion, чтобы каждый класс мог получить доступ к объектам, с которыми ему нужно взаимодействовать. Например, вот класс, который проверяет события и отвечает на них:
import sys
import pygame
class EventHandler:
def __init__(self, ai_game):
"""Initialize attributes."""
self.ai_game = ai_game
self.settings = ai_game.settings
self.display = ai_game.display
self.stats = ai_game.stats
self.sb = ai_game.sb
self.ship = ai_game.ship
def check_events(self):
"""Respond to keypresses and mouse events."""
for event in pygame.event.get():
if event.type == pygame.QUIT:
self.sb.record_high_score()
sys.exit()
elif event.type == pygame.KEYDOWN:
self._check_keydown_events(event)
elif event.type == pygame.KEYUP:
self._check_keyup_events(event)
elif event.type == pygame.MOUSEBUTTONDOWN:
mouse_pos = pygame.mouse.get_pos()
self._check_button(mouse_pos)
def _check_keydown_events(self, event):
"""Respond to keypresses."""
if event.key == pygame.K_RIGHT:
self.ship.moving_right = True
elif event.key == pygame.K_LEFT:
self.ship.moving_left = True
elif event.key == pygame.K_q:
self.ai_game.quit()
elif event.key == pygame.K_SPACE:
self.ship.fire_bullet()
elif event.key == pygame.K_e and not self.stats.game_active:
self.settings.set_difficulty(self.settings.easy)
self.ai_game.start_game()
elif event.key == pygame.K_n and not self.stats.game_active:
self.settings.set_difficulty(self.settings.normal)
self.ai_game.start_game()
elif event.key == pygame.K_h and not self.stats.game_active:
self.settings.set_difficulty(self.settings.hard)
self.ai_game.start_game()
def _check_keyup_events(self, event):
"""Respond to key releases."""
if event.key == pygame.K_RIGHT:
self.ship.moving_right = False
elif event.key == pygame.K_LEFT:
self.ship.moving_left = False
def _check_button(self, mouse_pos):
"""Set the difficulty setting."""
if self.display.easy_button.rect.collidepoint(mouse_pos):
self.settings.set_difficulty(self.settings.easy)
self.ai_game.start_game()
elif self.display.normal_button.rect.collidepoint(mouse_pos):
self.settings.set_difficulty(self.settings.normal)
self.ai_game.start_game()
elif self.display.hard_button.rect.collidepoint(mouse_pos):
self.settings.set_difficulty(self.settings.hard)
self.ai_game.start_game()
elif self.display.quit_button.rect.collidepoint(mouse_pos):
self.ai_game.quit()
Метод инициализации полностью состоит из настройки атрибутов, ссылающихся на объекты из ai_game (класс AlienInvasion), чтобы EventHandler мог сообщать каждому объекту, когда он необходимо сделать в ответ на событие. Вот как я обрабатывал все взаимодействия объектов. Класс AlienInvasion «знает» обо всех различных объектах и позволяет каждому объекту взаимодействовать с другими объектами с помощью атрибутов, которые вы видите выше в EventHandler.
Мне интересно узнать, как сделать мой код более ремонтопригодны. Я провел последние несколько дней в поисках ответа. Я не видел ничего, что объясняло бы, как я должен обрабатывать взаимодействия объектов (или, точнее, я не видел ничего, что я мог бы распознать как нечто, что я мог бы / должен применить здесь, чтобы минимизировать, сколько каждый объект «знает» о другом объекты).
Полный код можно посмотреть по адресу https://github.com/nmoore32/Space-Invaders-Clone