본문 바로가기

Python/Others

chatGPT로 벽돌깨기 게임 만들기 (feat. 더블 버퍼링)

반응형

 

chatGPT로 벽돌 부수기 게임 만들기
이번에는 chatGPT에게 Python을 사용해서 게임을 만들어보도록 요청해 보았다.
pygame 라이브러리의 존재를 알곤 있었지만 한 번도 사용해 본 적은 없다.
pygame이 어떻게 사용되는 건지 알아볼 겸, GPT AI가 이런 것도 바로 구현을 잘 해줄까? 싶은 궁금증에 시도해 보았다.
(질문을 막 하다가 GPT-4 버전의 사용량을 다 써버려서 GPT-3.5 버전을 사용해서 진행했다...)
Question
Python으로 공으로 벽돌을 부수는 게임을 만들어줘
Answer
안녕하세요! 공으로 벽돌을 부수는 게임을 만드는 것은 쉬운 것은 아니지만 Python으로 구현하는 것은 가능합니다.
여기 몇 가지 구현 단계입니다:

1. pygame 라이브러리를 설치합니다. 이를 통해 게임 창과 그래픽을 만들 수 있습니다.
2. 게임 창을 만듭니다. 이를 위해 pygame.init() 함수를 호출하고 창 크기를 지정합니다.
3. 벽돌을 만듭니다. 이를 위해 블록의 색상, 위치 및 크기를 정의해야합니다. 이후에는 pygame.draw.rect() 함수를 사용하여 벽돌을 그릴 수 있습니다.
4. 공을 만듭니다. 이를 위해 공의 색상, 위치 및 속도를 정의해야합니다.
5. 게임 루프를 만듭니다. 이를 통해 게임 상태를 유지하고 사용자 입력을 처리합니다.
6. 공을 이동시키고 벽돌과 충돌 감지를 구현합니다. 이를 위해 pygame.Rect 객체를 사용하여 공과 벽돌을 나타내고, colliderect() 함수를 사용하여 충돌을 감지합니다.
7. 게임 오버 및 승리 조건을 구현합니다. 이를 위해 공이 바닥에 닿을 때 게임 오버 상태를 설정하고, 모든 벽돌을 부술 때 승리 상태를 설정합니다.
8. 게임 오버 및 승리 상태에 따라 적절한 화면을 표시합니다.

이러한 구현 단계를 참조하여 Python으로 공으로 벽돌을 부수는 게임을 만들 수 있습니다. 물론 구현 방법은 여러 가지가 있을 수 있으므로 이 단계들이 완벽한 해답은 아닙니다.
사실 질문을 했을 때 바로 Code로 작성할 줄 알았는데... 설명을 먼저 해줬다.
바로 Code로 작성해달라고 요청해 보았다.
Question
Python code로 작성해줘
Answer
물론이죠! 여기는 간단한 Python 코드 예제입니다. 이 코드는 pygame 라이브러리를 사용하여 공으로 벽돌을 부수는 게임을 만듭니다.

import pygame
import random
import sys

# 창 크기 설정
SCREEN_WIDTH = 800
SCREEN_HEIGHT = 600

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

# 게임 초기화
pygame.init()
screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))
pygame.display.set_caption("벽돌 부수기")

# 공 초기 설정
ball = pygame.Rect(SCREEN_WIDTH//2-15, SCREEN_HEIGHT//2-15, 30, 30)
ball_speed_x = 5 * random.choice((1, -1))
ball_speed_y = 5 * random.choice((1, -1))

# 패들 초기 설정
paddle = pygame.Rect(SCREEN_WIDTH//2-70, SCREEN_HEIGHT-50, 140, 20)

# 벽돌 초기 설정
bricks = []
brick_width = 75
brick_height = 30
for i in range(8):
    for j in range(5):
        brick = pygame.Rect(100+i*(brick_width+5), 60+j*(brick_height+5), brick_width, brick_height)
        bricks.append(brick)

# 점수 초기화
score = 0

# 게임 루프
while True:
    # 이벤트 처리
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()

    # 패들 이동
    keys = pygame.key.get_pressed()
    if keys[pygame.K_LEFT]:
        paddle.x -= 5
    if keys[pygame.K_RIGHT]:
        paddle.x += 5

    # 공 이동
    ball.x += ball_speed_x
    ball.y += ball_speed_y

    # 벽 충돌 처리
    if ball.left <= 0 or ball.right >= SCREEN_WIDTH:
        ball_speed_x *= -1
    if ball.top <= 0:
        ball_speed_y *= -1
    if ball.bottom >= SCREEN_HEIGHT:
        pygame.quit()
        sys.exit()

    # 패들과 충돌 처리
    if ball.colliderect(paddle):
        ball_speed_y *= -1

    # 벽돌과 충돌 처리
    for brick in bricks:
        if ball.colliderect(brick):
            score += 10
            ball_speed_y *= -1
            bricks.remove(brick)
            break

    # 화면에 그리기
    screen.fill(WHITE)
    pygame.draw.rect(screen, BLUE, paddle)
    pygame.draw.ellipse(screen, RED, ball)
    for brick in bricks:
        pygame.draw.rect(screen, BLUE, brick)
    pygame.display.update()

    # 게임 오버 처리
    if len(bricks) == 0:
        pygame.quit()
        sys.exit()

    # 점수 출력
    font = pygame.font.Font(None, 36)
    score_text = font.render("Score: " + str(score), 1, (0, 0, 0))
    screen.blit(score_text, (20, 20))

    # 화면 업데이트
    pygame.display.flip()
	
해당 코드는 내가 조금 수정한 코드이다.
처음 작성해 준 코드를 실행하려 했더니 sys가 import 되어 있지 않아서 에러가 발생하고 있었다.
import sys를 작성해 주고 실행을 해봤는데, 실행은 잘 되었으나 공의 속도가 너무 빠르고 벽돌 수가 너무 적어서 직접 수정했다. (물론 수정하고 나서 GPT에게 수정해달라고 해봤더니 역시 잘 해주더라는...)
기본적인 기능은 모두 정상적으로 작동하고 있으나, 점수 부분은 왜 깜박거리는진 모르겠다... 🤣
pygame 라이브러리를 잘 몰라서 출력된 code에 있는 내용들만 한 번 간략하게 알아보았다.

1. pygame.display게임 창을 생성하고 그래픽을 표시하는 데 사용 (창 크기 및 타이틀)
- ball의 위치나 paddle의 위치를 조절 후에 pygame.display.update()를 통해 화면을 업데이트해 준다.
- pygame.display.flip() 함수는 더블 버퍼링(Double buffering)을 사용해서 화면을 업데이트해 준다.

2. pygame.Rect사각형을 나타내는 클래스. 크기를 조정하거나 위치를 이동시키는 등의 작업을 수행할 수 있다.
- colliderect()는 Rect 클래스의 메서드 중 하나로, Rect 객체를 비교해서 충돌하는지를 반환 (겹치는 영역이 있는지를 검사).

3. pygame.event 모듈은 이벤트 처리에 관련된 함수와 상수를 제공.

4. pygame.key 모듈은 키보드 관련 이벤트 처리를 위한 모듈.
- K_LEFT = 왼쪽 방향키
- K_RIGHT = 오른쪽 방향키
- K_a = a 키
- pygame.key.get_pressed()현재 눌러진 모든 키보드 버튼의 상태를 반환.
- 현재 벽돌깨기에서는 K_LEFT, K_RIGHT만을 사용해서 paddle의 위치를 이동시켜준다.

5. pygame.font폰트 관련 모듈. 텍스트를 렌더링 하고 게임 인터페이스를 디자인할 수 있다.

6. pygame.draw그리기 도구 모음이며, 다양한 도형, 라인, 텍스트 및 이미지를 그릴 수 있다.
- pygame.draw.rect(): 사각형
- pygame.draw.circle(): 원
- pygame.draw.line(): 선
- pygame.draw.polygon(): 다각형
- pygame.draw.ellipse(): 타원
- pygame.draw.text(): 텍스트


알아보던 중 pygame.dispaly.filp()더블 버퍼링을 사용한다고 하는데 해당 내용에 대해서도 알아보고자 한다.
더블 버퍼링 (Double buffering)
더블 버퍼링은 화면에 그려지는 이미지와 실제 렌더링 결과를 분리하여, 미리 준비된 버퍼에 렌더링 결과를 저장하고, 이후에 미리 준비된 버퍼를 실제 화면에 표시하는 방식이다.

이 방식은 화면을 업데이트할 때 발생할 수 있는 깜빡임 현상을 방지하는 데 사용된다.
일반적으로 화면에 그려지는 이미지를 업데이트하면, 이전 이미지가 화면에서 사라지고, 새로운 이미지가 그려지는 과정에서 깜빡임이 발생할 수 있다. 더블 버퍼링은 이러한 깜빡임을 방지하기 위해, 화면에 미리 준비된 버퍼를 사용하여 렌더링 결과를 저장하고, 이후에 버퍼를 실제 화면에 표시함으로써 깜빡임을 방지하는 역할을 한다.
chatGPT가 작성해 준 코드로 pygame에 대해 간단하게 알아보는 시간을 가졌다.
pygame 라이브러리를 개인적으로 더 공부해서 게임을 만들어볼 것 같지는 않지만 이렇게 알아두면 굳이 게임을 만드는 것이 아니더라도 다른 것에 활용해 볼 수도 있을 것 같다.
반응형

loading