데이터 분석가

우주 외계인 침공 게임(Udemy Project 12) 본문

유데미 부트캠프 프로젝트(Final)

우주 외계인 침공 게임(Udemy Project 12)

PlintAn 2023. 7. 1. 14:00

안녕하세요 !

 

이번 시간에는 space invader이라는 게임을 파이썬으로 구현해보겠습니다 !

 

 

space invader game

https://elgoog.im/space-invaders/

 

Play Space Invaders Online - elgooG

Defend Google from an alien invasion with Google Space Invaders, a classic arcade game you can play online for free and unblocked.

elgoog.im

사실 게임은 단순합니다

 

 

이전에 작성하였던 turtle race 게임 등등 제가 만들었던 게임과 유사하게 pygame

 

이용해서 만들게 됩니다 !

 

일단 코드는 다음과 같습니다.

 

저는 player, alien 이미지를 지정 폴더에 업로드 후 이를 이용해

 

웹을 불러와 게임을 실행합니다.

 

일단 게임 코드는 이렇습니다

 

import pygame
import random

# 게임 화면 크기
SCREEN_WIDTH = 800
SCREEN_HEIGHT = 600

# 색상 정의
WHITE = (255, 255, 255)
BLUE = (0, 0, 255)
YELLOW = (255, 255, 0)

# 플레이어 설정
PLAYER_WIDTH = 64
PLAYER_HEIGHT = 64
PLAYER_SPEED = 5

# 외계인 설정
ALIEN_WIDTH = 64
ALIEN_HEIGHT = 64
ALIEN_SPEED = 2
ALIEN_ROWS = 5
ALIEN_COLS = 8

# 레이저 설정
LASER_WIDTH = 10
LASER_HEIGHT = 30
LASER_SPEED = 8

# 초기화
pygame.init()
screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))
pygame.display.set_caption("Space Invaders")
clock = pygame.time.Clock()

# 이미지 로드
player_img = pygame.image.load("Rokect.png").convert_alpha()
alien_img = pygame.image.load("alien.png").convert_alpha()

# 플레이어 클래스
class Player(pygame.sprite.Sprite):
    def __init__(self):
        super().__init__()
        self.image = pygame.transform.scale(player_img, (PLAYER_WIDTH, PLAYER_HEIGHT))
        self.rect = self.image.get_rect()
        self.rect.x = SCREEN_WIDTH // 2 - PLAYER_WIDTH // 2
        self.rect.y = SCREEN_HEIGHT - PLAYER_HEIGHT - 10
        self.speed = PLAYER_SPEED

    def update(self):
        keys = pygame.key.get_pressed()
        if keys[pygame.K_LEFT] and self.rect.x > 0:
            self.rect.x -= self.speed
        if keys[pygame.K_RIGHT] and self.rect.x < SCREEN_WIDTH - PLAYER_WIDTH:
            self.rect.x += self.speed

# 외계인 클래스
class Alien(pygame.sprite.Sprite):
    def __init__(self, x, y):
        super().__init__()
        self.image = pygame.transform.scale(alien_img, (ALIEN_WIDTH, ALIEN_HEIGHT))
        self.rect = self.image.get_rect()
        self.rect.x = x
        self.rect.y = y
        self.speed = ALIEN_SPEED

    def update(self):
        self.rect.x += self.speed
        if self.rect.x <= 0 or self.rect.x >= SCREEN_WIDTH - ALIEN_WIDTH:
            self.speed *= -1
            self.rect.y += ALIEN_HEIGHT

# 레이저 클래스
class Laser(pygame.sprite.Sprite):
    def __init__(self, x, y):
        super().__init__()
        self.image = pygame.Surface((LASER_WIDTH, LASER_HEIGHT))
        self.image.fill(YELLOW)
        self.rect = self.image.get_rect()
        self.rect.x = x
        self.rect.y = y
        self.speed = LASER_SPEED

    def update(self):
        self.rect.y -= self.speed
        if self.rect.y < 0:
            self.kill()

# 게임 시작
def game():
    all_sprites = pygame.sprite.Group()
    aliens = pygame.sprite.Group()
    lasers = pygame.sprite.Group()

    player = Player()
    all_sprites.add(player)

    for row in range(ALIEN_ROWS):
        for col in range(ALIEN_COLS):
            alien = Alien(100 + col * (ALIEN_WIDTH + 10), 100 + row * (ALIEN_HEIGHT + 10))
            all_sprites.add(alien)
            aliens.add(alien)

    running = True
    while running:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                running = False
            elif event.type == pygame.KEYDOWN:
                if event.key == pygame.K_SPACE:
                    laser = Laser(player.rect.centerx - LASER_WIDTH // 2, player.rect.y)
                    all_sprites.add(laser)
                    lasers.add(laser)

        all_sprites.update()

        # 외계인과 레이저 충돌 체크
        hits = pygame.sprite.groupcollide(aliens, lasers, True, True)
        for hit_aliens in hits.values():
            for _ in hit_aliens:
                new_alien = Alien(random.randint(0, SCREEN_WIDTH - ALIEN_WIDTH), random.randint(-500, -ALIEN_HEIGHT))
                all_sprites.add(new_alien)
                aliens.add(new_alien)

        # 외계인이 플레이어에 도달하면 게임 종료
        if pygame.sprite.spritecollide(player, aliens, True):
            running = False

        screen.fill(BLUE)
        all_sprites.draw(screen) 
        pygame.display.flip()
        clock.tick(60)

    pygame.quit()

if __name__ == '__main__':
    game()

플레이어는 방향키를 이용해 움직일 수 있고 스페이스 바를 이용해 공격을 합니다

 

그리고 외계인들이 플레이어에 닿기 전에 모두 제거를 해야합니다 !

 

구현

다음과 같이 게임을 할 수 있습니다 !

 

조금 간단하게 구현을 하였는데, 설정을 조금 더 복잡하고 어렵게 할 수 있습니다 !

 

 

Comments