2025년 3월 4일 화요일

python으로 간단한 미니 게임을 만들기

python

import pygame

import random

import sys

# 초기화

pygame.init()

# 색상 정의

WHITE = (255, 255, 255)

BLACK = (0, 0, 0)

RED = (255, 0, 0)

GREEN = (0, 255, 0)

# 화면 설정

WIDTH, HEIGHT = 640, 480

SCREEN = pygame.display.set_mode((WIDTH, HEIGHT))

pygame.display.set_caption("숫자 맞추기 게임")

# 폰트 설정

FONT = pygame.font.SysFont(None, 36)

# 이미지 로드

try:

    background = pygame.image.load('images/background.png')

    logo = pygame.image.load('images/logo.png')

    submit_button = pygame.image.load('images/submit.png')

    reset_button = pygame.image.load('images/reset.png')

except pygame.error as e:

    print(f"이미지 로드 실패: {e}")

    pygame.quit()

    sys.exit()

# 게임 변수

MAX_ATTEMPTS = 5

NUMBER_RANGE = (1, 100)

secret_number = random.randint(*NUMBER_RANGE)

attempts = 0

guess = ""

feedback = ""

# 버튼 직사각형 설정

submit_rect = submit_button.get_rect(topleft=(WIDTH//2 - 100, HEIGHT//2 + 50))

reset_rect = reset_button.get_rect(topleft=(WIDTH//2 + 50, HEIGHT//2 + 50))

# 입력 박스 설정

input_box = pygame.Rect(WIDTH//2 - 50, HEIGHT//2, 100, 40)

def draw_text(text, color, rect):

    """텍스트를 화면에 그리는 함수"""

    img = FONT.render(text, True, color)

    SCREEN.blit(img, rect)

def reset_game():

    """게임 상태를 초기화하는 함수"""

    global secret_number, attempts, guess, feedback

    secret_number = random.randint(*NUMBER_RANGE)

    attempts = 0

    guess = ""

    feedback = ""

def main():

    global guess, attempts, feedback

    clock = pygame.time.Clock()

    active = False

    while True:

        for event in pygame.event.get():

            if event.type == pygame.QUIT:

                pygame.quit()

                sys.exit()

            # 마우스 클릭 처리

            if event.type == pygame.MOUSEBUTTONDOWN:

                if input_box.collidepoint(event.pos):

                    active = True

                else:

                    active = False

                if submit_rect.collidepoint(event.pos):

                    if guess.isdigit():

                        guess_num = int(guess)

                        attempts += 1

                        if guess_num < secret_number:

                            feedback = "너무 낮아요!"

                        elif guess_num > secret_number:

                            feedback = "너무 높아요!"

                        else:

                            feedback = "정답입니다!"

                    else:

                        feedback = "유효한 숫자를 입력하세요."

                if reset_rect.collidepoint(event.pos):

                    reset_game()

            # 키보드 입력 처리

            if event.type == pygame.KEYDOWN and active:

                if event.key == pygame.K_RETURN:

                    if guess.isdigit():

                        guess_num = int(guess)

                        attempts += 1

                        if guess_num < secret_number:

                            feedback = "너무 낮아요!"

                        elif guess_num > secret_number:

                            feedback = "너무 높아요!"

                        else:

                            feedback = "정답입니다!"

                    else:

                        feedback = "유효한 숫자를 입력하세요."

                elif event.key == pygame.K_BACKSPACE:

                    guess = guess[:-1]

                elif event.unicode.isdigit():

                    if len(guess) < 3:

                        guess += event.unicode

        # 배경 그리기

        SCREEN.blit(background, (0, 0))

        SCREEN.blit(logo, (WIDTH//2 - logo.get_width()//2, 50))

        # 입력 박스 그리기

        pygame.draw.rect(SCREEN, WHITE, input_box, 2)

        draw_text(guess, WHITE, (input_box.x + 10, input_box.y + 5))

        # 버튼 그리기

        SCREEN.blit(submit_button, submit_rect)

        SCREEN.blit(reset_button, reset_rect)

        # 피드백 표시

        feedback_rect = pygame.Rect(WIDTH//2 - 100, HEIGHT//2 + 100, 200, 50)

        draw_text(feedback, RED if feedback != "정답입니다!" else GREEN, feedback_rect)

        # 시도 횟수 표시

        attempts_text = f"시도: {attempts}/{MAX_ATTEMPTS}"

        draw_text(attempts_text, WHITE, (10, 10))

        # 게임 승리 조건

        if feedback == "정답입니다!" or attempts >= MAX_ATTEMPTS:

            pygame.time.delay(2000)

            reset_game()

        pygame.display.flip()

        clock.tick(30)

if __name__ == "__main__":

    main()


프로그램 설명

이 파이썬 프로그램은 Pygame 라이브러리를 사용하여 간단한 숫자 맞추기 미니게임을 구현합니다. 게임의 목표는 1부터 100 사이의 임의의 숫자를 제한된 시도 내에 맞추는 것입니다.

  1. 초기 설정:
  • Pygame을 초기화하고, 기본 색상과 화면 크기를 설정합니다.
  • 게임에 사용할 이미지들(배경, 로고, 제출 버튼, 리셋 버튼)을 로드합니다. 이미지 로딩에 실패하면 프로그램을 종료합니다.
  1. 게임 변수:
  • 최대 시도 횟수, 숫자 범위, 비밀 숫자, 현재 시도 횟수, 플레이어의 추측, 피드백 메시지를 설정합니다.
  1. 버튼 및 입력 박스 설정:
  • 제출 버튼과 리셋 버튼의 위치를 설정하고, 사용자가 숫자를 입력할 수 있는 입력 박스를 정의합니다.
  1. 유틸리티 함수:
  • draw_text: 지정된 위치에 텍스트를 그리는 함수입니다.
  • reset_game: 게임 상태를 초기화하여 새로운 게임을 시작하는 함수입니다.
  1. 메인 루프:
  • 이벤트를 처리하여 사용자의 입력과 버튼 클릭을 감지합니다.
  • 사용자가 숫자를 입력하고 제출하면, 입력한 숫자가 비밀 숫자보다 높은지 낮은지 또는 맞는지를 평가하여 피드백을 제공합니다.
  • 리셋 버튼을 클릭하면 게임이 초기화됩니다.
  • 배경과 로고, 버튼, 입력 박스, 피드백 메시지를 화면에 렌더링합니다.
  • 게임이 종료 조건(정답을 맞추거나 시도 횟수가 초과)에 도달하면 잠시 후 게임을 재설정합니다.
  1. 프로그램 시작:
  • main 함수를 실행하여 게임을 시작합니다.

이 게임은 사용자가 간단하게 숫자를 추측하며, Pygame을 통해 시각적으로 상호작용할 수 있도록 설계되었습니다. 필요한 이미지는 Stable Diffusion과 같은 도구를 사용하여 생성한 후 images 폴더에 저장해야 합니다.

댓글 없음:

댓글 쓰기

Recommended Posts

Love is taking responsibility till the end

  I created a campaign called "Don't Abandon Your Beloved Dog" with Stable Diffusion. I tried creating it several times, but i...