Code of AI

[ChatGPT] 벽돌깨기 게임 만들기 파이썬 코드

별별AI 2023. 9. 24. 14:07
728x90

윈도우용 벽돌깨기 프로그램을 만들도록 ChatGPT에게 요청.

 

 

 

import pygame
import sys
import random

# 초기화
pygame.init()

# 화면 크기
WIDTH, HEIGHT = 400, 800

# 색상
BLACK = (0, 0, 0)
GRAY = (169, 169, 169)

# 게임 화면 설정
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("Break Brick")

# 공 초기 설정
ball_size = 5
ball_x = (WIDTH - ball_size) // 2
ball_y = HEIGHT - 50
ball_speed = 0.1  # 초당 1픽셀 속도
ball_speed_x = ball_speed  # 공의 초기 속도
ball_speed_y = -ball_speed

# 패들 초기 설정
paddle_width = 50
paddle_height = 5
paddle_x = (WIDTH - paddle_width) // 2
paddle_y = HEIGHT - 20
paddle_speed = 0.5  # 초당 1픽셀 속도
paddle_speed_x = 0  # 패들의 초기 가로 속도는 0

# 벽돌 초기 설정
brick_width = 30
brick_height = 10
brick_color = GRAY
bricks = []

for _ in range(100):
    brick_x = random.randint(0, WIDTH - brick_width)
    brick_y = random.randint(50, HEIGHT // 2)
    bricks.append(pygame.Rect(brick_x, brick_y, brick_width, brick_height))

# 게임 루프
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_speed_x = -paddle_speed
    elif keys[pygame.K_RIGHT]:
        paddle_speed_x = paddle_speed
    else:
        paddle_speed_x = 0

    # 패들 이동
    paddle_x += paddle_speed_x

    # 공 이동
    ball_x += ball_speed_x
    ball_y += ball_speed_y

    # 벽과의 충돌 처리
    if ball_x <= 0 or ball_x >= WIDTH:
        ball_speed_x *= -1
    if ball_y <= 0:
        ball_speed_y *= -1

    # 패들과의 충돌 처리
    if paddle_x < ball_x < paddle_x + paddle_width and paddle_y < ball_y < paddle_y + paddle_height:
        ball_speed_y *= -1

    # 벽돌과의 충돌 처리
    for brick in bricks[:]:
        if brick.colliderect((ball_x, ball_y, ball_size, ball_size)):
            bricks.remove(brick)
            ball_speed_y *= -1

    # 화면 그리기
    screen.fill(BLACK)

    pygame.draw.rect(screen, GRAY, (paddle_x, paddle_y, paddle_width, paddle_height))
    pygame.draw.rect(screen, GRAY, (ball_x, ball_y, ball_size, ball_size))

    for brick in bricks:
        pygame.draw.rect(screen, brick_color, brick)

    pygame.display.update()

 

 


 

 

윈도우 크기를 가로 400픽셀, 세로 800픽셀로 하고,

벽돌을 랜덤하게 나타나도록 해서 파이썬 코드 요청. 

 

 


 

 


 

 

더 구체화 해야 할 곳들...

 

공이 떨어져도 끝났다는 표시가 없음. 

공을 튀기는 패드가 윈도우 밖으로도 나감. 

벽돌이 랜덤하게 나오긴 하지만 서로 겹쳐 있는 경우도 있음. 

 

이에 대한 개선도 ChatGPT에게 요청. 

 

실패하면 FAIL, 성공하면 SUCCESS 버튼이 생기도록 수정. 

막대가 윈도우 밖으로 나가지 않도록 수정

 

 


 

import pygame
import sys
import random

# 초기화
pygame.init()

# 화면 크기
WIDTH, HEIGHT = 400, 800

# 색상
BLACK = (0, 0, 0)
GRAY = (169, 169, 169)
WHITE = (255, 255, 255)

# 게임 화면 설정
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("Break Brick")

# 공 초기 설정
ball_size = 5
ball_x = (WIDTH - ball_size) // 2
ball_y = HEIGHT - 50
ball_speed = 0.1  # 초당 1픽셀 속도
ball_speed_x = ball_speed  # 공의 초기 속도
ball_speed_y = -ball_speed

# 패들 초기 설정
paddle_width = 50
paddle_height = 5
paddle_x = (WIDTH - paddle_width) // 2
paddle_y = HEIGHT - 20
paddle_speed = 0.5  # 초당 1픽셀 속도
paddle_speed_x = 0  # 패들의 초기 가로 속도는 0

# 벽돌 초기 설정
brick_width = 30
brick_height = 10
brick_color = GRAY
bricks = []

for _ in range(100):
    brick_x = random.randint(0, WIDTH - brick_width)
    brick_y = random.randint(50, HEIGHT // 2)
    bricks.append(pygame.Rect(brick_x, brick_y, brick_width, brick_height))

# 버튼 초기 설정
success_button_rect = pygame.Rect(WIDTH // 4, HEIGHT // 2, WIDTH // 2, 50)
fail_button_rect = pygame.Rect(WIDTH // 4, HEIGHT // 2, WIDTH // 2, 50)
show_success_button = False
show_fail_button = False

# 새 게임 시작 함수 정의
def start_new_game():
    global bricks, ball_x, ball_y, ball_speed_x, ball_speed_y, show_success_button, show_fail_button
    ball_x = (WIDTH - ball_size) // 2
    ball_y = HEIGHT - 50
    ball_speed_x = ball_speed
    ball_speed_y = -ball_speed
    bricks = []
    for _ in range(100):
        brick_x = random.randint(0, WIDTH - brick_width)
        brick_y = random.randint(50, HEIGHT // 2)
        bricks.append(pygame.Rect(brick_x, brick_y, brick_width, brick_height))
    show_success_button = False
    show_fail_button = False

# 게임 루프
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_speed_x = -paddle_speed
    elif keys[pygame.K_RIGHT]:
        paddle_speed_x = paddle_speed
    else:
        paddle_speed_x = 0

    # 패들 이동
    paddle_x += paddle_speed_x

    # 패들이 화면 밖으로 나가지 않도록 제한
    if paddle_x < 0:
        paddle_x = 0
    elif paddle_x > WIDTH - paddle_width:
        paddle_x = WIDTH - paddle_width

    # 공 이동
    ball_x += ball_speed_x
    ball_y += ball_speed_y

    # 벽과의 충돌 처리
    if ball_x <= 0 or ball_x >= WIDTH:
        ball_speed_x *= -1
    if ball_y <= 0:
        ball_speed_y *= -1

    # 패들과의 충돌 처리
    if paddle_x < ball_x < paddle_x + paddle_width and paddle_y < ball_y < paddle_y + paddle_height:
        ball_speed_y *= -1

    # 벽돌과의 충돌 처리
    for brick in bricks[:]:
        if brick.colliderect((ball_x, ball_y, ball_size, ball_size)):
            bricks.remove(brick)
            ball_speed_y *= -1

    # 게임 성공 또는 실패 상태에 따라 버튼을 활성화합니다.
    if not bricks and not show_success_button:
        show_success_button = True
    elif ball_y >= HEIGHT and not show_fail_button:
        show_fail_button = True

    # 화면 그리기
    screen.fill(BLACK)

    pygame.draw.rect(screen, GRAY, (paddle_x, paddle_y, paddle_width, paddle_height))
    pygame.draw.rect(screen, GRAY, (ball_x, ball_y, ball_size, ball_size))

    for brick in bricks:
        pygame.draw.rect(screen, brick_color, brick)

    # "SUCCESS" 버튼 그리기
    if show_success_button:
        pygame.draw.rect(screen, WHITE, success_button_rect)
        font = pygame.font.Font(None, 36)
        text_surface = font.render("SUCCESS", True, BLACK)
        text_rect = text_surface.get_rect(center=success_button_rect.center)
        screen.blit(text_surface, text_rect)

    # "FAIL" 버튼 그리기
    if show_fail_button:
        pygame.draw.rect(screen, WHITE, fail_button_rect)
        font = pygame.font.Font(None, 36)
        text_surface = font.render("FAIL", True, BLACK)
        text_rect = text_surface.get_rect(center=fail_button_rect.center)
        screen.blit(text_surface, text_rect)

    pygame.display.update()

    # "SUCCESS" 버튼 또는 "FAIL" 버튼을 클릭했을 때 새 게임을 시작하도록 처리
    if show_success_button and pygame.mouse.get_pressed()[0] and success_button_rect.collidepoint(pygame.mouse.get_pos()):
        start_new_game()
    elif show_fail_button and pygame.mouse.get_pressed()[0] and fail_button_rect.collidepoint(pygame.mouse.get_pos()):
        start_new_game()

 

 


 

 

 

 


 

 

더 구체화 해야 할 곳들...

 

벽돌이 랜덤하게 나오긴 하지만 서로 겹쳐 있는 경우도 있고, 
벽돌들의 색이 단색이어서 다채롭게 하고 싶음

 

이에 대한 개선도 ChatGPT에게 요청. 

 


 

 

import pygame
import sys
import random

# 초기화
pygame.init()

# 화면 크기
WIDTH, HEIGHT = 400, 800

# 색상
BLACK = (0, 0, 0)
GRAY = (169, 169, 169)
WHITE = (255, 255, 255)

# 게임 화면 설정
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("Break Brick")

# 공 초기 설정
ball_size = 6
ball_x = (WIDTH - ball_size) // 2
ball_y = HEIGHT - 50
ball_speed = 0.1  # 초당 1픽셀 속도
ball_speed_x = ball_speed  # 공의 초기 속도
ball_speed_y = -ball_speed

# 패들 초기 설정
paddle_width = 70
paddle_height = 10
paddle_x = (WIDTH - paddle_width) // 2
paddle_y = HEIGHT - 30
paddle_speed = 0.2  # 초당 1픽셀 속도
paddle_speed_x = 0  # 패들의 초기 가로 속도는 0

# 벽돌 초기 설정
brick_width = 30
brick_height = 10
bricks = []

# 겹치지 않는 좌표를 생성하는 함수
def generate_collision_free_coordinates():
    while True:
        brick_x = random.randint(0, WIDTH - brick_width)
        brick_y = random.randint(50, HEIGHT // 2)
        brick_rect = pygame.Rect(brick_x, brick_y, brick_width, brick_height)
        # 벽돌이 다른 벽돌과 겹치지 않는 경우에만 추가
        if all(not brick_rect.colliderect(existing_brick[0]) for existing_brick in bricks):
            return brick_x, brick_y

for _ in range(100):
    brick_x, brick_y = generate_collision_free_coordinates()
    brick_color = (random.randint(0, 255), random.randint(0, 255), random.randint(0, 255))
    bricks.append((pygame.Rect(brick_x, brick_y, brick_width, brick_height), brick_color))


# 버튼 초기 설정
success_button_rect = pygame.Rect(WIDTH // 4, HEIGHT // 2, WIDTH // 2, 50)
fail_button_rect = pygame.Rect(WIDTH // 4, HEIGHT // 2, WIDTH // 2, 50)
show_success_button = False
show_fail_button = False

# 새 게임 시작 함수 정의
def start_new_game():
    global bricks, ball_x, ball_y, ball_speed_x, ball_speed_y, show_success_button, show_fail_button
    ball_x = (WIDTH - ball_size) // 2
    ball_y = HEIGHT - 50
    ball_speed_x = ball_speed
    ball_speed_y = -ball_speed
    bricks = []
    for _ in range(100):
        brick_x = random.randint(0, WIDTH - brick_width)
        brick_y = random.randint(50, HEIGHT // 2)
        brick_color = (random.randint(0, 255), random.randint(0, 255), random.randint(0, 255))
        bricks.append((pygame.Rect(brick_x, brick_y, brick_width, brick_height), brick_color))
    show_success_button = False
    show_fail_button = False

# 게임 루프
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_speed_x = -paddle_speed
    elif keys[pygame.K_RIGHT]:
        paddle_speed_x = paddle_speed
    else:
        paddle_speed_x = 0

    # 패들 이동
    paddle_x += paddle_speed_x

    # 패들이 화면 밖으로 나가지 않도록 제한
    if paddle_x < 0:
        paddle_x = 0
    elif paddle_x > WIDTH - paddle_width:
        paddle_x = WIDTH - paddle_width

    # 공 이동
    ball_x += ball_speed_x
    ball_y += ball_speed_y

    # 벽과의 충돌 처리
    if ball_x <= 0 or ball_x >= WIDTH:
        ball_speed_x *= -1
    if ball_y <= 0:
        ball_speed_y *= -1

    # 패들과의 충돌 처리
    if paddle_x < ball_x < paddle_x + paddle_width and paddle_y < ball_y < paddle_y + paddle_height:
        ball_speed_y *= -1

    # 벽돌과의 충돌 처리
    for brick, brick_color in bricks[:]:
        if brick.colliderect((ball_x, ball_y, ball_size, ball_size)):
            bricks.remove((brick, brick_color))
            ball_speed_y *= -1

    # 게임 성공 또는 실패 상태에 따라 버튼을 활성화합니다.
    if not bricks and not show_success_button:
        show_success_button = True
    elif ball_y >= HEIGHT and not show_fail_button:
        show_fail_button = True

    # 화면 그리기
    screen.fill(BLACK)

    pygame.draw.rect(screen, GRAY, (paddle_x, paddle_y, paddle_width, paddle_height))
    pygame.draw.rect(screen, GRAY, (ball_x, ball_y, ball_size, ball_size))

    for brick, brick_color in bricks:
        pygame.draw.rect(screen, brick_color, brick)

    # "SUCCESS" 버튼 그리기
    if show_success_button:
        pygame.draw.rect(screen, WHITE, success_button_rect)
        font = pygame.font.Font(None, 36)
        text_surface = font.render("SUCCESS", True, BLACK)
        text_rect = text_surface.get_rect(center=success_button_rect.center)
        screen.blit(text_surface, text_rect)

    # "FAIL" 버튼 그리기
    if show_fail_button:
        pygame.draw.rect(screen, WHITE, fail_button_rect)
        font = pygame.font.Font(None, 36)
        text_surface = font.render("FAIL", True, BLACK)
        text_rect = text_surface.get_rect(center=fail_button_rect.center)
        screen.blit(text_surface, text_rect)

    pygame.display.update()

    # "SUCCESS" 버튼 또는 "FAIL" 버튼을 클릭했을 때 새 게임을 시작하도록 처리
    if show_success_button and pygame.mouse.get_pressed()[0] and success_button_rect.collidepoint(pygame.mouse.get_pos()):
        start_new_game()
    elif show_fail_button and pygame.mouse.get_pressed()[0] and fail_button_rect.collidepoint(pygame.mouse.get_pos()):
        start_new_game()

 

 


 

 

 

 


 

 

 

한 번 만든 코드에 대해서도 수정 요청을 할 수 있고 

원하는 방향대로 코드 생성이 가능하도록 ChatGPT에게 도움을 받을 수 있음. 

 

 

728x90