-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathpython_memory
201 lines (151 loc) · 6.17 KB
/
python_memory
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
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
number_count = min(number_count, 20) # 만약 20을 초과하면 20으로 처리
# 실제 화면에 grid 형태로 숫자를 랜덤으로 배치
shuffle_grid(number_count)
# 숫자 섞기 (이 프로젝트에서 가장 중요)
def shuffle_grid(number_count):
rows = 5
columns = 9
cell_size = 130 # 각 Grid cell 별 가로, 세로 크기
button_size = 110 # Grid cell 내에 실제로 그려질 버튼 크기
screen_left_margin = 55 # 전체 스크린 왼쪽 여백
screen_top_margin = 20 # 전체 스크린 위쪽 여백
# [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]
grid = [[0 for col in range(columns)] for row in range(rows)] # 5 x 9
number = 1 # 시작 숫자 1부터 number_count 까지, 만약 5라면 5까지 숫자를 랜덤으로 배치하기
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 # ms -> sec
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
if start: # 게임이 시작했으면?
check_number_buttons(pos)
elif start_button.collidepoint(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)
start_button.center = (120, screen_height - 120)
# 색깔
BLACK = (0, 0, 0) # RGB black
WHITE = (255, 255, 255) # RGB white
GRAY = (50, 50, 50)
number_buttons = [] # 플레이어가 눌러야 하는 버튼들
curr_level = 1 # 현재 레벨
display_time = None # 숫자를 보여주는 시간
start_ticks = None # 시간 계산 (현재 시간 정보를 저장)
# 게임 시작 여부
start = False
# 숫자 숨김 여부 (사용자가 1을 클릭했거나, 보여주는 시간 초과했을 때)
hidden = False
# 게임 시작 전에 게임 설정 함수 수행
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()
# 5초 정도 보여줌
pygame.time.delay(5000)
# 게임 종료
pygame.quit()