Akashic Records

[파이썬 크래시 코스 예제] 외계인 침공 -1 본문

Python for Beginners

[파이썬 크래시 코스 예제] 외계인 침공 -1

Andrew's Akashic Records 2024. 6. 4. 17:33
728x90

 

AlienInvasion

 
책 "파이썬 크래스 코드"의 실전 예제 코드
이 코드는 "외계인 침공"이라는 슈팅 게임의 주요 구조를 설명합니다. 코드는 게임의 초기화, 이벤트 처리, 업데이트, 그리고 화면 업데이트 등의 주요 기능을 포함하고 있습니다.

  • 우주선 이동까지만 포함된 코드(탄환 발사 및 외계인 코드는 '2'에 추가)

"""설정 클래스 settings.py"""
class Settings:
    """외계인 침공의 설정을 저장하는 클래스"""

    def __init__(self):
        """게임 설정 초기화"""
        self.screen_width = 1200
        self.screen_height = 800
        self.bg_color = (230,230,230)

        """우주선 설정"""
        self.ship_speed = 1.5

 
Settings 클래스:

  • 게임의 설정을 저장합니다. 예를 들어, 화면 크기, 배경색, 우주선의 이동 속도 등을 설정합니다.
"""alien_invasion.py"""
import  sys
import pygame

from settings import Settings
from ship import Ship
class AlienInvasion:
    """게임 자원과 동작을 전체적으로 관리하는 클래스"""

    def __init__(self):
        """게임을 초기화 하고 자원을 만듭니다."""
        pygame.init()

        self.clock = pygame.time.Clock()
        self.settings = Settings()

        # 전체화면으로 실행하기
        # self.screen = pygame.display.set_mode((0,0), pygame.FULLSCREEN)
        # self.settings.screen_width = self.screen.get_rect().width
        # self.settings.screen_height = self.screen.get_rect().height

        self.screen = pygame.display.set_mode((self.settings.screen_width, self.settings.screen_height))
        pygame.display.set_caption("Alien Invasion")
        self.ship = Ship(self)

    def run_game(self):
        """게임의 메인 루프를 시작합니다."""

        while True:
            self._check_events()
            self.ship.update()
            self._update_screen()

            # 게임 프레임 속도를 인수로 받는다. 60은 초다 60회 실행되도록 조정한다.
            self.clock.tick(60)

    def _check_events(self):
        """키입력과 마우스 이벤트에 응답합니다."""
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                sys.exit()
            elif event.type == pygame.KEYDOWN:
                self._check_keydown_events(event)
            elif event.type == pygame.KEYUP:
                self._check_keyup_events(event)
    def _check_keydown_events(self, event) -> None:
        """키를 누를때 실행됩니다."""
        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:
            sys.exit()

    def _check_keyup_events(self, event) -> None:
        """키에서 손을 뗄 때 응답힙니다."""
        if event.key == pygame.K_RIGHT:
            # 우주선을 오른쪽으로 이동중지합니다.
            self.ship.moving_right = False
        elif event.key == pygame.K_LEFT:
            # 우주선을 왼쪽으로 이동중지합니다.
            self.ship.moving_left = False

    def _update_screen(self):
        """화면의 이미지를 업데이트 하고 화면을 새로 그립니다."""
        # 루프를 반복할 때마다 화면을 다시 그린다.
        self.screen.fill(self.settings.bg_color)
        self.ship.blitme()

        # 가장 최근 그린 화면을 표시합니다.
        pygame.display.flip()


if __name__ == '__main__':
    # 게임 인스턴스를 만들고 게임을 실행합니다.
    ai = AlienInvasion()
    ai.run_game()

 
AlienInvasion 클래스:

  • 게임의 메인 클래스로, 게임을 초기화하고 주요 게임 루프를 실행합니다.
  • __init__: 게임 초기화 메소드. pygame을 초기화하고 게임의 설정을 불러옵니다. 또한 화면 설정과 우주선 객체를 생성합니다.
  • run_game: 게임의 메인 루프. 이벤트를 체크하고, 우주선의 상태를 업데이트하며, 화면을 갱신합니다.
  • _check_events: 사용자의 키보드 입력을 감지하고 그에 맞는 처리를 합니다. 게임 종료, 우주선의 이동 시작 및 중지 등을 처리합니다.
  • _update_screen: 게임 화면을 업데이트합니다. 배경색을 채우고, 우주선을 그린 후 화면을 새로 고칩니다
"""ship.py"""
import pygame

class Ship:
    """ 우주선을 관리하는 클래스"""

    def __init__(self, ai_game):
        """우주선을 초기화하고 시작 위치를 설정합니다."""
        self.screen = ai_game.screen
        self.settings = ai_game.settings
        self.screen_rect = ai_game.screen.get_rect()

        # 우주선 이미지를 불러오고 사각형을 가져옵니다.
        self.image = pygame.image.load('images/ship.png')
        self.rect = self.image.get_rect()

        # 우주선의 초기 위치는 화면 하단 중앙입니다.
        self.rect.midbottom = self.screen_rect.midbottom

        # 우주선의 정확한 가로 위치 설정을 위해 부동 소수점 숫자를 저장합니다.
        self.x = float(self.rect.x)

        # 움직임 플래그는 정지 상태로 시작합니다.
        self.moving_right = False
        self.moving_left = False

    def update(self):
        """움직임 플래그를 바탕으로 우주선 위치를 업데이트 합니다."""
        if self.moving_right and self.rect.right < self.screen_rect.right:
            self.x += self.settings.ship_speed

        if self.moving_left and self.rect.left > 0:
            self.x -= self.settings.ship_speed

        # self.x 를 통해 rect 객체를 업테이트 합니다.
        self.rect.x = self.x
    def blitme(self):
        """우주선을 현재 위치에 그립니다."""
        self.screen.blit(self.image, self.rect)
images/ship.png

Ship 클래스:

  • 우주선 객체를 관리합니다.
  • __init__: 우주선을 초기화하고, 우주선의 이미지와 시작 위치를 설정합니다.
  • update: 우주선의 위치를 업데이트합니다. 이는 moving_rightmoving_left 플래그를 확인하여 우주선이 화면 내에서만 움직이도록 합니다.
  • blitme: 우주선을 현재 위치에 그립니다.

게임의 실행 과정

  • 게임 실행 시 AlienInvasion 인스턴스가 생성되고 run_game 메소드가 호출됩니다.
  • run_game 메소드 내에서 무한 루프를 돌면서 계속 게임 상태를 업데이트하고 화면을 새로 고칩니다.
  • 사용자 입력에 따라 우주선이 좌우로 이동할 수 있으며, pygame.QUIT 이벤트(일반적으로 윈도우 닫기 버튼)가 발생하면 게임이 종료됩니다.

이 코드는 pygame 라이브러리를 기반으로 한 기본적인 게임 루프와 이벤트 처리, 그리고 객체 지향 방식으로 게임 요소를 관리하는 좋은 예시입니다.

728x90
Comments