송아영
송아영
🐶 AI 찐친
🎖️ 마스터 파트너
🧭 경험 찐친

글쓰기 싫을 땐 AI와 게임을 만들어요~ ㅎㅎ

🎁배경 및 목적

시험 기간에는 책상 정리도 재밌죠? 저두요~

글쓰기 해야 하는데..... AI와 게임을 만들었어요. ㅎㅎ~

이전에 챗 GPT와 클로드를 이용해 포켓몬 카드 게임 게시글을 따라해 본 적이 있었어요. 그때 완벽한 구현까지 성공하지 못해서 다시 게임 만들기에 도전해 보았어요.

첫 시도는 테트리스 만들기~!! 이 게임은 유명해서 그런지 "테트리스 게임 만들어줘" 한 줄 프롬프트로 완성도 있는 코드를 생성했어요.

한국어 텍스트가 포함된 페이지의 스크린샷

코드를 꾸준히 안 만지니 기초부터 몽땅 까먹는 걸 계속 반복하고 있습니다.

뭐 그래도 괜찮아유~ 한땀 한땀 물어보면서 복습하면 되죠 뭐~

한국어로 된 메시지 스크린샷
한국어 텍스트가 포함된 페이지의 스크린샷
테트리스 게임 완성본

🎁수정 과정

  1. 코드 실행해 보니 완성되지 않은 줄이 삭제 되서 다시 수정

  2. 스코어와 레벨 추가

  3. 레벨 올라갈 때마다 블록 속도 빠르게 코딩 시켰는데 구현되지 않아 디버깅

  4. 게임 종료 후 'Game Over' 표시 후 '고양이가 메롱'하는 픽셀 아트 그려 달라고 요청

  5. 이때부터 지옥의 디버깅이 시작 됨~

  6. 픽셀아트가 아니라 아스키 아트?로 그려줌. 백슬래시를 코드로 읽어서 계속 오류 ㅠ.ㅠ

scss라는 단어가 적힌 흑백 아이콘
  1. 결국 고양이 빼고 급완성 ^^

import pygame
import random

# 초기화
pygame.init()

# 게임 화면 크기 설정
SCREEN_WIDTH = 300
SCREEN_HEIGHT = 600
BLOCK_SIZE = 30

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

# 블록 모양 정의
SHAPES = [
    [[1, 1, 1, 1]],
    [[1, 1],
     [1, 1]],
    [[0, 1, 0],
     [1, 1, 1]],
    [[1, 0, 0],
     [1, 1, 1]],
    [[0, 0, 1],
     [1, 1, 1]],
    [[1, 1, 0],
     [0, 1, 1]],
    [[0, 1, 1],
     [1, 1, 0]]
]

# 화면 설정
screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))
pygame.display.set_caption("Tetris")

# 현재 블록 초기화
def new_block():
    return {'shape': random.choice(SHAPES), 'x': SCREEN_WIDTH // BLOCK_SIZE // 2 - 2, 'y': 0}

current_block = new_block()
blocks = []
score = 0
level = 1
fall_speed = 500

clock = pygame.time.Clock()

# 폰트 설정
font = pygame.font.SysFont('comicsans', 30)

# 고양이 메롱 픽셀아트 설정


# 블록 이동 함수
def move_block(dx, dy):
    current_block['x'] += dx
    current_block['y'] += dy
    if check_collision():
        current_block['x'] -= dx
        current_block['y'] -= dy
        return False
    return True

# 충돌 체크 함수
def check_collision():
    shape = current_block['shape']
    for y, row in enumerate(shape):
        for x, cell in enumerate(row):
            if cell:
                if (
                    current_block['x'] + x < 0 or
                    current_block['x'] + x >= SCREEN_WIDTH // BLOCK_SIZE or
                    current_block['y'] + y >= SCREEN_HEIGHT // BLOCK_SIZE or
                    (current_block['x'] + x, current_block['y'] + y) in blocks
                ):
                    return True
    return False

# 블록 회전 함수
def rotate_block():
    shape = current_block['shape']
    rotated_shape = [list(row) for row in zip(*shape[::-1])]
    old_x = current_block['x']
    current_block['shape'] = rotated_shape
    if check_collision():
        current_block['shape'] = shape
        current_block['x'] = old_x

# 블록 고정 함수
def freeze_block():
    shape = current_block['shape']
    for y, row in enumerate(shape):
        for x, cell in enumerate(row):
            if cell:
                blocks.append((current_block['x'] + x, current_block['y'] + y))
    return new_block()

# 줄 제거 함수
def remove_lines():
    global score, level, fall_speed
    full_lines = []
    for y in range(SCREEN_HEIGHT // BLOCK_SIZE):
        if all((x, y) in blocks for x in range(SCREEN_WIDTH // BLOCK_SIZE)):
            full_lines.append(y)
    for y in full_lines:
        for x in range(SCREEN_WIDTH // BLOCK_SIZE):
            blocks.remove((x, y))
    for y in sorted(full_lines):
        for i, (x, by) in enumerate(sorted(blocks, key=lambda b: -b[1])):
            if by < y:
                blocks[i] = (x, by + 1)
    score += len(full_lines) * 10

    # 레벨 업 처리
    if score >= level * 100:
        level += 1
        fall_speed = max(50, fall_speed - 75)
        success_text = font.render('Level Up!', True, GREEN)
        screen.blit(success_text, (SCREEN_WIDTH // 2 - success_text.get_width() // 2, SCREEN_HEIGHT // 2 - success_text.get_height() // 2))
        pygame.display.flip()
        pygame.time.delay(1000)

# 게임 오버 함수
def game_over():
    screen.fill(BLACK)
    game_over_text = font.render('Game Over', True, RED)
    screen.blit(game_over_text, (SCREEN_WIDTH // 2 - game_over_text.get_width() // 2, SCREEN_HEIGHT // 2 - game_over_text.get_height() // 2))
    pygame.display.flip()
    pygame.time.delay(3000)

# 게임 루프
running = True
fall_time = 0
while running:
    screen.fill(BLACK)
    fall_time += clock.get_rawtime()
    clock.tick()

    # 블록 자동 낙하
    if fall_time > fall_speed:
        if not move_block(0, 1):
            current_block = freeze_block()
            if check_collision():
                game_over()
                running = False
            remove_lines()
        fall_time = 0

    # 이벤트 처리
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        elif event.type == pygame.KEYDOWN:
            if event.key == pygame.K_LEFT:
                move_block(-1, 0)
            elif event.key == pygame.K_RIGHT:
                move_block(1, 0)
            elif event.key == pygame.K_DOWN:
                move_block(0, 1)
            elif event.key == pygame.K_UP:
                rotate_block()

    # 현재 블록 그리기
    shape = current_block['shape']
    for y, row in enumerate(shape):
        for x, cell in enumerate(row):
            if cell:
                pygame.draw.rect(screen, RED, pygame.Rect((current_block['x'] + x) * BLOCK_SIZE, (current_block['y'] + y) * BLOCK_SIZE, BLOCK_SIZE, BLOCK_SIZE))

    # 고정된 블록 그리기
    for x, y in blocks:
        pygame.draw.rect(screen, BLUE, pygame.Rect(x * BLOCK_SIZE, y * BLOCK_SIZE, BLOCK_SIZE, BLOCK_SIZE))

    # 점수 및 레벨 표시
    score_text = font.render(f'Score: {score}', True, WHITE)
    level_text = font.render(f'Level: {level}', True, WHITE)
    screen.blit(score_text, (10, 10))
    screen.blit(level_text, (10, 40))

    pygame.display.flip()

pygame.quit()

여기서 멈춰야 했지만 바쁠 땐 벽만 보고 있어도 재밌기 때문에 너구리 만들기 도전까지~ ^^

Coming Soon~!!

👍참고자료

https://www.gpters.org/member/Q0bxO3XTdS

https://chatgpt.com/share/6702ac8b-eac8-800a-b294-663b4e5b04e2

✅️ 활용 툴

챗 GPT 캔버스와 클로드 프로젝트

🔆 결과 및 인사이트

AI와 게임 만들기 성공~!!

웹앱은 아니지만 로컬에서 돌릴 수 있는 게임을 완성형으로 만들어 본 것이 만족스러웠습니다.

이전에는 게임 전체를 설명하고 만들었지만 이번엔 기본적인 게임을 만들고 거기에 하나씩 기능을 추가하는 식으로 만들었던 것이 성공 킥인 것 같아요~ ^^

정말 바쁠 땐 벽지 무늬만 세도 재밌는 것 같아요. 게임 완성해서 뿌듯~

글쓰기 마무리 하러 가야되는데~ 🤣

하지만 너구리 게임까지 도전했다는 사실~ 스포하자면 너구리는 미완성입니다 ^^

2

뉴스레터 무료 구독

👉 이 게시글도 읽어보세요