Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- 뉴턴역학
- 역학
- Database
- Java
- 자바암호
- oracle
- 유닉스
- GIT
- 소프트웨어공학
- 웹 크롤링
- 고전역학
- JVM
- NIO
- flet
- 자바네트워크
- Spring boot
- 코틀린
- write by chatGPT
- write by GPT-4
- 파이썬
- GPT-4's answer
- python
- android
- 리눅스
- lombok
- kotlin
- chatGPT's answer
- 시스템
- 인프라
- 자바
Archives
- Today
- Total
Akashic Records
[파이썬 크래시 코스 예제] 외계인 침공 -1 본문
728x90
책 "파이썬 크래스 코드"의 실전 예제 코드
이 코드는 "외계인 침공"이라는 슈팅 게임의 주요 구조를 설명합니다. 코드는 게임의 초기화, 이벤트 처리, 업데이트, 그리고 화면 업데이트 등의 주요 기능을 포함하고 있습니다.
- 우주선 이동까지만 포함된 코드(탄환 발사 및 외계인 코드는 '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)
Ship 클래스:
- 우주선 객체를 관리합니다.
__init__
: 우주선을 초기화하고, 우주선의 이미지와 시작 위치를 설정합니다.update
: 우주선의 위치를 업데이트합니다. 이는moving_right
및moving_left
플래그를 확인하여 우주선이 화면 내에서만 움직이도록 합니다.blitme
: 우주선을 현재 위치에 그립니다.
게임의 실행 과정
- 게임 실행 시
AlienInvasion
인스턴스가 생성되고run_game
메소드가 호출됩니다. run_game
메소드 내에서 무한 루프를 돌면서 계속 게임 상태를 업데이트하고 화면을 새로 고칩니다.- 사용자 입력에 따라 우주선이 좌우로 이동할 수 있으며,
pygame.QUIT
이벤트(일반적으로 윈도우 닫기 버튼)가 발생하면 게임이 종료됩니다.
이 코드는 pygame
라이브러리를 기반으로 한 기본적인 게임 루프와 이벤트 처리, 그리고 객체 지향 방식으로 게임 요소를 관리하는 좋은 예시입니다.
728x90
'Python for Beginners' 카테고리의 다른 글
[파이썬 크래시 코스 예제] 외계인 침공 -최종 (1) | 2024.06.10 |
---|---|
[파이썬 크래시 코스 예제] 외계인 침공 -2 (0) | 2024.06.07 |
Code Test(Unit Test) with pytest (0) | 2024.06.03 |
파일 읽고 쓰기(pathlib) (0) | 2024.05.29 |
PEP(Python Enhancement Proposal) 8 (0) | 2024.05.28 |
Comments