내배캠 (22.04~22.08)

Pygame - 순발력 테스트 1 to 50 (1)

yubi5050 2022. 4. 25. 18:01

1. 게임 이름 : 순발력 테스트 1 to 50

http://zzzscore.com/1to50/?from=kt 

 

순발력 테스트! 추억의 1부터50까지

손은 눈보다 빠르다! 추억의 1부터50까지

zzzscore.com

 

2. 게임 설명

  • 1부터 50까지의 숫자가 랜덤으로 등장한다.
  • 숫자 순서대로 마우스로 1부터 50까지 빠르게 클릭하면 성공

 

3. 개발 일정 계획

  • 1일차 : 게임 주제 선정, 전체 틀 작성, 기능 개발
  • 2일차 : 기능 Develop, UI 구현, 스토리 화면 등 구현
  • 3일차 : Refactoring 코드 개선 객체화, 함수 지향형

4. 목표 개발 사항

  1. 이미지 리소스 삽입
  2. (중요) 게임의 이기고 지는 규칙 설계/구현 => 기획간 고려 완료
  3. Stage별로 난이도 설정(1,2,3 / Easy, Normal, Hard)
  4. (선택) 시간 기능 => 구현 완료
  5. 마우스, 키보드 이벤트 처리(사용자 입력, 멈춤 기능 등) => Develop 이벤트 필요
  6. 메뉴 연동(Start/Pause/Resume)
  7. (선택) 게임 결과 저장/로드 기능(파일 또는 데이터베이스 활용)
  8. (선택) 몰입감을 높이기 위한 화면 모드 전환 기능(풀스크린/일반스크린)
  9. (선택) 멀티 플레이, 컴퓨터와 대전하는 기능 

 

5. 1일차 코드

from random import random
import pygame
import random

# 초기 Setting
pygame.init()
pygame.font.init()
window_width, window_height = 720, 720 # 가로, 세로 크기
pandel_width, panel_height = 500, 500 # 숫자 Grid
grid_size, pading_size = 100, 50
window = pygame.display.set_mode((window_width, window_height))
pygame.display.set_caption("1 to 50 Game")
clock = pygame.time.Clock()

# COLOR , FONT
game_font = pygame.font.SysFont("arialrounded", 20) # 폰트 정의 (Pyinstaller 패키징을 위해 폰트 명시)
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
GRAY = (255, 0, 0)

# random 난수 생성
def get_random(min_num, max_num):
    num_list = list(range(min_num, max_num+1))
    random.shuffle(num_list)
    return num_list

# TIME 형식 바꾸기
def convert_time(ticks):
    minutes, sec, ms = 0, 0, 0
    ms = ticks % 1000
    sec = ticks // 1000
    minutes = sec // 60

    return str(minutes) + ":" + str(sec) + ":" + str(ms)


# 초기 Draw
def init_setting():
    for i in range(5):
        for j in range(5):
            # Get Rect Object
            x, y = i*grid_size, j*grid_size            
            rect = pygame.Rect(x, y, grid_size, grid_size)
            # Get Rect Num 
            rect_num = random_list[i*5+j]

            # Rect Info Save
            rects.append({'rect':rect, 'rect_num':rect_num})
            addon_rects.append({'rect':rect, 'rect_num':rect_num+25})

random_list = get_random(1, 25) # 초기 random number
num_list = list(range(0,51)) # 1 ~ 50

# game내 rects 관리
rects, addon_rects = [], []
cur_num = 1 

# Rect / Text 그리기 (RECTS에 맞춰서 순서대로 그림)
def grid_draw(rects): # rects = [{'rect':rect, 'rect_num':rect_num}, {'rect':rect, 'rect_num':rect_num}, {'rect':rect, 'rect_num':rect_num}]
    for r in rects:
        rect = r['rect'] 
        pygame.draw.rect(surface = window, color = WHITE, rect = rect, width = 1)

        # Get Rect Num 
        rect_num = r['rect_num']
        if rect_num == None:
            cell_text = game_font.render(' ', True, WHITE) # text render
        else:
            cell_text = game_font.render(str(rect_num), True, WHITE) # text render
        text_rect = cell_text.get_rect(center=rect.center) # rect의 중심점을 가진 text rect 좌표
        window.blit(cell_text, text_rect)

#### 1. Init Rect 배열 생성
init_setting()

# 게임 루프
running = True # 게임 실행 Flag
while running:
    clock.tick(20) # 초당 프레임 수

    # if play == True :
    # image = pygame.image.load('space.jpg')
    window.fill(BLACK)
    # image = pygame.transform.scale(image, (window_width, window_height))
    # window.blit(image, (0, 0))

    ## Timer ==============================
    now_ticks = pygame.time.get_ticks() # 현재 tick 을 받아옴
    now_time = convert_time(now_ticks)

    cell_text = game_font.render(now_time, True, WHITE) # text render
    window.blit(cell_text, (window_width/2, window_height-60))
    # =====================================

    ## Grid ===============================
    grid_draw(rects)
    # =====================================


    ## 이벤트 루프 =========================
    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()

    # 클릭시
    if click_pos:
        for i, r in enumerate(rects):
            # 마우스 클릭시 클릭한 사각형 찾기 
            if r['rect'].collidepoint(click_pos):
                # 눌러야 되는 숫자가 맞다면 ==> Rects 배열 수정
                rect_num = r['rect_num'] 
                if rect_num == num_list[cur_num]:
                    # 숫자가 50을 넘었으면 None으로 넣어놓기.
                    draw_num = int(rect_num)+25
                    if draw_num > 50:
                        rects[i]['rect_num'] = None
                    else: # Rect 배열 Rect_num 수정
                        rects[i]['rect_num'] = draw_num

                    # 현재 숫자 관리
                    cur_num+=1

                # 잘못 누른거라면
                else:
                    pass
    # =====================================

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

# 게임 종료
pygame.quit()