기억력 테스트 게임

호호빵·2022년 4월 11일
0

시작

import pygame

# 초기화
pygame.init()
screen_width = 1280
screen_height = 720
screen = pygame.display.set_mode((screen_width, screen_height))
pygame.display.set_caption("Memory Game")

# 게임 루프
running = True  # 게임이 실행중인가?
while running:
    # 이벤트 루프
    for event in pygame.event.get():    # 어떤 이벤트가 발생하였는가?
        if event.type == pygame.QUIT:   # 창이 닫히는 이벤트가 발생한다면
            running = False             # 게임 실행 중 아님  -> 반복문 탈출



# 게임 종료
pygame.quit()

주요 함수

def shuffle_grid(number_count):
    rows = 5
    columns = 9
    
    grid = [[0 for col in range(columns)] for row in range(rows)]
     # [[0, 0, 0, 0, 0, 0, 0, 0, 0],
     #  [0, 0, 0, 0, 0, 0, 0, 0, 0],
     #  [0, 0, 0, 0, 0, 0, 0, 0, 0],
     #  [0, 0, 0, 0, 0, 0, 0, 0, 0],
     #  [0, 0, 0, 0, 0, 0, 0, 0, 0]]

    number = 1 # 시작 숫자 1부터 number_count까지
    while number <= number_count:
        row_idx = randrange(0, rows) # 0,1,2,3,4 중에서 랜덤
        col_idx = randrange(0, columns) # 0 - 8 중에서 랜덤

        if grid[row_idx][col_idx] == 0:
            grid[row_idx][col_idx] = number # 숫자 지정
            number += 1

        # number = 1 일 때, number_count = 5		
        #  무작위 grid[3][5]가 0이면 (3,5) 에 1 적용
        # number = 2, grid[0][7] 에 2 적용
        # .
        # .
        # number = 5, grid[2][0] 에 5 적용

    print(grid)
     # [[0, 0, 0, 0, 0, 0, 0, 2, 0],     0번째 행, 7번째 열 -> 2
     #  [0, 0, 0, 0, 4, 0, 0, 0, 0],
     #  [5, 0, 0, 0, 0, 0, 0, 0, 0],
     #  [0, 0, 0, 0, 0, 1, 0, 0, 0],
     #  [0, 0, 0, 0, 0, 0, 0, 3, 0]]

실제 코드


from tkinter import HIDDEN
import pygame
from random import *

# 레벨에 맞게 설정
def setup(level):
    
    # 얼마동안 숫자를 보여줄까?
    global display_time
    display_time = 5 - (level // 3)
    display_time = max(display_time, 1)

    # 얼마나 많은 숫자를 보여줄까?
    number_count = (level // 3) + 5  # level 1,2 일때는 0 + 5 = 5
    number_count = min(number_count, 20)

    # 실제 화면에  grid 형태로 숫자 랜덤 배치
    shuffle_grid(number_count)

# 숫자 섞기
def shuffle_grid(number_count):
    rows = 5
    columns = 9

    cell_size = 130
    button_size = 110 
    screen_left_margin = 55
    screen_top_margin = 20

    # [0, 0, 0, 0, 0, 0, 0, 0, 0], 5 x 9 grid
    grid = [[0 for col in range(columns)] for row in range(rows)]

    number = 1 # 시작 숫자 1부터 number_count까지
    while number <= number_count:
        row_idx = randrange(0, rows) # 0,1,2,3,4 중에서 랜덤
        col_idx = randrange(0, columns) # 0 - 8 중에서 랜덤

        if grid[row_idx][col_idx] == 0:
            grid[row_idx][col_idx] = number # 숫자 지정
            number += 1

            # 현재 grid cell 위치 기준으로 x, y 위치를 구함
            center_x = screen_left_margin + (col_idx * cell_size) + (cell_size / 2)
            center_y = screen_top_margin + (row_idx * cell_size) + (cell_size / 2)

            # 숫자 버튼 만들기
            button = pygame.Rect(0, 0, button_size, button_size)
            button.center = (center_x, center_y)

            number_buttons.append(button)

    # print(grid)


# 시작화면 보여주기
def display_start_screen():
    pygame.draw.circle(screen, WHITE, start_button.center, 60, 5)
    # 동그라미 그리기, 흰색, 중심좌표는 start_button의 중심좌표, 반지름 60, 선 두께 5

    msg = game_font.render(f"{curr_level}", True, WHITE)
    msg_rect = msg.get_rect(center=(start_button.center))
    screen.blit(msg, msg_rect)    

# 게임 화면 보여주기
def display_game_screen():
    global hidden

    if not hidden:
        elapsed_time = (pygame.time.get_ticks() - start_ticks) / 1000
        if elapsed_time > display_time:
            hidden = True

    for idx, rect in enumerate(number_buttons, start=1):
        if hidden: 
            # 버튼 사각형 그리기
            pygame.draw.rect(screen, WHITE, rect)
        else:
            # 실제 숫자 텍스트
            cell_text = game_font.render(str(idx), True, WHITE)
            text_rect = cell_text.get_rect(center = rect.center)
            screen.blit(cell_text, text_rect)

# pos에 해당하는 버튼 확인
def check_buttons(pos):
    global start, start_ticks   # start 변수를 어디에서든 사용하기 위해

    if start: 
        check_number_buttons(pos)
    elif start_button.collidepoint(pos): # start_button 내에 클릭한 pos가 들어있다면
        start = True
        start_ticks = pygame.time.get_ticks() # 타이머 시작 (현재 시간을 저장)

def check_number_buttons(pos):
    global start, hidden, curr_level

    for button in number_buttons:
        if button.collidepoint(pos):
            if button == number_buttons[0]:   # 올바른 숫자 클릭
                # print("Correct")
                del number_buttons[0]         # 첫번째 숫자 삭제
                if not hidden:
                    hidden = True             # 숫자 숨김 처리
            else:               # 잘못된 숫자 클릭 
                game_over()
            break

    # 모든 숫자를 다 맞춘 후 -> 레벨업, 다시 시작화면
    if len(number_buttons) == 0:
        start = False
        hidden = False
        curr_level += 1
        setup(curr_level)


# 게임 종료 처리
def game_over():
    global running

    running = False

    msg = game_font.render(f"Your level is {curr_level}", True, WHITE)
    msg_rect = msg.get_rect(center=(screen_width / 2, screen_height / 2))

    screen.fill(BLACK)
    screen.blit(msg, msg_rect)


# 초기화
pygame.init()
screen_width = 1280
screen_height = 720
screen = pygame.display.set_mode((screen_width, screen_height))
pygame.display.set_caption("Memory Game")
game_font = pygame.font.Font(None, 120)

# 시작 버튼
start_button = pygame.Rect(0, 0, 120, 120)   # left, top, width, height
start_button.center = (120, screen_height - 120)

# 색깔
BLACK = (0, 0, 0)  # RGB
WHITE = (255, 255, 255)
GRAY = (50, 50, 50)

number_buttons = [] # 플레이어가 눌러야 하는 버튼
curr_level = 1 # 현재 레벨
display_time = None  # 시간을 보여주는 숫자
start_ticks = None   # 시간 계산 (현재 시간 정보를 저장)


start = False       # 게임 시작 여부
hidden = False      # 숫자 숨김 여부 (사용자가 1을 클릭 or, 시간 초과했을 때)
setup(curr_level)   # 게임 시작 전에 게임 설정 함수 실행


# 게임 루프
running = True  # 게임이 실행중인가?
while running:
    click_pos = None

    # 이벤트 루프
    for event in pygame.event.get():   # 어떤 이벤트가 발생하였는가?
        if event.type == pygame.QUIT:   # 창이 닫히는 이벤트가 발생한다면
            running = False             # 게임 실행 중 아님  -> 반복문 탈출
        elif event.type == pygame.MOUSEBUTTONUP: # 마우스를 클릭했을 때
            click_pos = pygame.mouse.get_pos() 
            # print(click_pos)



    # 화면 전체를 까맣게 
    screen.fill(BLACK)


    if start: 
        display_game_screen()   # 게임 화면 표시
    else:
        display_start_screen()  # 시작 화면 표시

    if click_pos:
        check_buttons(click_pos)


    # 화면 업데이트
    pygame.display.update()


pygame.time.delay(5000) # 5초 정도 대기

pygame.quit()  # 게임 종료

profile
하루에 한 개념씩

0개의 댓글