AI

파이썬 벽돌깨기 게임 만들기

헬로우제이제이 2024. 4. 9. 14:41
728x90
반응형

 

전자오락실이라는 곳이 있었다. 어릴 적 나는 전자오락에 미쳐있었고 돈만 생기면 가곤 했었다. 그때에도 합법적 전자오락실이 있었고 불법 전자오락실이 있었다. 불법 전자오락실이라고 해서 나쁜 곳은 아니었고 새로운, 더 재미난 게임이 많았던 걸로 기억된다. 그 당시 주로 했었던 것 중의 하나가 벽돌깨기 였다.

챗GPT도 혹시 만들어 줄까 해서 시도해보았고 결과는 대성공, 자 한번 재미삼아 만들어보자, 아니 챗GPT에게 요구사항을 전달해보자.

 

- 소스

import pygame
import random

# 초기화
pygame.init()

# 화면 설정
WIDTH, HEIGHT = 800, 600
WIN = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("벽돌깨기")

# 색깔
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
RED = (255, 0, 0)
BLUE = (0, 0, 255)

# 게임 설정
PADDLE_WIDTH, PADDLE_HEIGHT = 200, 20
PADDLE_SPEED = 10
BALL_RADIUS = 10
BALL_SPEED_X = 7
BALL_SPEED_Y = -7
BRICK_WIDTH, BRICK_HEIGHT = 100, 40
BRICK_ROWS = 5
BRICK_COLS = 8

# 게임 요소
paddle = pygame.Rect((WIDTH - PADDLE_WIDTH) // 2, HEIGHT - PADDLE_HEIGHT - 10, PADDLE_WIDTH, PADDLE_HEIGHT)
ball = pygame.Rect(WIDTH // 2 - BALL_RADIUS, HEIGHT // 2 - BALL_RADIUS, BALL_RADIUS * 2, BALL_RADIUS * 2)
bricks = []
for row in range(BRICK_ROWS):
    for col in range(BRICK_COLS):
        brick = pygame.Rect(col * (BRICK_WIDTH + 5) + 30, row * (BRICK_HEIGHT + 5) + 50, BRICK_WIDTH, BRICK_HEIGHT)
        bricks.append(brick)

# 공 이동
def move_ball():
    global BALL_SPEED_X, BALL_SPEED_Y
    ball.x += BALL_SPEED_X
    ball.y += BALL_SPEED_Y

    # 벽과 충돌 체크
    if ball.left <= 0 or ball.right >= WIDTH:
        BALL_SPEED_X *= -1
    if ball.top <= 0:
        BALL_SPEED_Y *= -1

    # 패들과 충돌 체크
    if ball.colliderect(paddle):
        BALL_SPEED_Y *= -1

    # 벽돌과 충돌 체크
    for brick in bricks:
        if ball.colliderect(brick):
            bricks.remove(brick)
            BALL_SPEED_Y *= -1

# 패들 이동
def move_paddle(keys):
    if keys[pygame.K_LEFT] and paddle.left > 0:
        paddle.x -= PADDLE_SPEED
    if keys[pygame.K_RIGHT] and paddle.right < WIDTH:
        paddle.x += PADDLE_SPEED

# 게임 루프
def main():
    clock = pygame.time.Clock()
    run = True
    while run:
        clock.tick(60)
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                run = False

        keys = pygame.key.get_pressed()
        move_paddle(keys)
        move_ball()

        # 게임화면 그리기
        WIN.fill(BLACK)
        pygame.draw.rect(WIN, WHITE, paddle)
        pygame.draw.circle(WIN, RED, ball.center, BALL_RADIUS)

        for brick in bricks:
            pygame.draw.rect(WIN, BLUE, brick)

        pygame.display.update()

        # 게임 종료 조건
        if len(bricks) == 0:
            print("게임 클리어!")
            run = False

    pygame.quit()

if __name__ == "__main__":
    main()

 

실행) pygame을 설치해보자.

 

실행) 그리고 소스를 작성해보자. 우선 새파일을 연 후, 프로그램 이름을 "BlockBreak.py"로 정해보자. 그리고 위의 소스를 넣어보자.

 

실행) 아래와 같이 "Python파일 실행"을 클릭해보자.

 

실행) 아래와 같이 잘 동작하는 것을 확인할 수 있다.

 

단점이 있다. 공이 한번만 나온다... 공을 놓치면 또 나오게 요청해보자.

 

- 소스

import pygame
import random

# 초기화
pygame.init()

# 화면 설정
WIDTH, HEIGHT = 800, 600
WIN = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("벽돌깨기")

# 색깔
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
RED = (255, 0, 0)
BLUE = (0, 0, 255)

# 게임 설정
PADDLE_WIDTH, PADDLE_HEIGHT = 200, 20
PADDLE_SPEED = 10
BALL_RADIUS = 10
BALL_SPEED_X = 7
BALL_SPEED_Y = -7
BRICK_WIDTH, BRICK_HEIGHT = 100, 40
BRICK_ROWS = 5
BRICK_COLS = 8

# 게임 요소
paddle = pygame.Rect((WIDTH - PADDLE_WIDTH) // 2, HEIGHT - PADDLE_HEIGHT - 10, PADDLE_WIDTH, PADDLE_HEIGHT)
ball = pygame.Rect(WIDTH // 2 - BALL_RADIUS, HEIGHT // 2 - BALL_RADIUS, BALL_RADIUS * 2, BALL_RADIUS * 2)
bricks = []
for row in range(BRICK_ROWS):
    for col in range(BRICK_COLS):
        brick = pygame.Rect(col * (BRICK_WIDTH + 5) + 30, row * (BRICK_HEIGHT + 5) + 50, BRICK_WIDTH, BRICK_HEIGHT)
        bricks.append(brick)

# 공 이동
def move_ball():
    global BALL_SPEED_X, BALL_SPEED_Y
    ball.x += BALL_SPEED_X
    ball.y += BALL_SPEED_Y

    # 벽과 충돌 체크
    if ball.left <= 0 or ball.right >= WIDTH:
        BALL_SPEED_X *= -1
    if ball.top <= 0:
        BALL_SPEED_Y *= -1

    # 패들과 충돌 체크
    if ball.colliderect(paddle):
        BALL_SPEED_Y *= -1

    # 벽돌과 충돌 체크
    for brick in bricks:
        if ball.colliderect(brick):
            bricks.remove(brick)
            BALL_SPEED_Y *= -1

    # 공이 화면 아래로 떨어졌을 때 초기 위치로 되돌리기
    if ball.top >= HEIGHT:
        reset_ball()

# 패들 이동
def move_paddle(keys):
    if keys[pygame.K_LEFT] and paddle.left > 0:
        paddle.x -= PADDLE_SPEED
    if keys[pygame.K_RIGHT] and paddle.right < WIDTH:
        paddle.x += PADDLE_SPEED

# 공 초기 위치로 되돌리기
def reset_ball():
    global BALL_SPEED_X, BALL_SPEED_Y
    ball.center = (WIDTH // 2, HEIGHT // 2)
    # 속도도 재설정
    BALL_SPEED_X = 7
    BALL_SPEED_Y = -7

# 게임 루프
def main():
    clock = pygame.time.Clock()
    run = True
    while run:
        clock.tick(60)
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                run = False
            elif event.type == pygame.KEYDOWN and event.key == pygame.K_RETURN:
                reset_ball()

        keys = pygame.key.get_pressed()
        move_paddle(keys)
        move_ball()

        # 게임화면 그리기
        WIN.fill(BLACK)
        pygame.draw.rect(WIN, WHITE, paddle)
        pygame.draw.circle(WIN, RED, ball.center, BALL_RADIUS)

        for brick in bricks:
            pygame.draw.rect(WIN, BLUE, brick)

        pygame.display.update()

        # 게임 종료 조건
        if len(bricks) == 0:
            print("게임 클리어!")
            run = False

    pygame.quit()

if __name__ == "__main__":
    main()

 

어떤가? 재미있지 않은가? 챗GPT를 이용하여 더 많은 아이디어를 통해 게임 개발자가 되어보자!!!

728x90
반응형