지뢰찾기 깃헙주소
전체 클래스 설명
import random
import os
class Colors:
# 문자의 색을 입히기 위한 클래스
class zrae():
def __init__(self,n) -> None:
# 변수및 한번만 사용할 함수를 위한 초기화함수
def init_bomb(self):
# 폭탄 위치 만들기
def init_mark(self,a,b):
# 폭탄 주위에 숫자 만들기
def strength_land(self,a,b):
# 폭탄이 아닌 좌표를 찍었을때 좌표 나타내기
def get_board(self):
# 실제 폭탄의 위치및 숫자의 위치 즉 답이 저장되어있는 보드를 출력하기
def get_board2(self):
# 현재 게임 하고있는 즉 답이 가려져있는 보드를 출력하기
def click(self):
# 클릭 했을때 함수
def flagfunc(self):
# 플래그 를 설정할때의 함수
def GameWin(self):
# 게임이 이기기 위한 로직과 그때의 동작함수
def get_ui(self):
# ui (사용한 flag 갯수, 진행된 시간 등등) 나타내기
def main():
init 함수
def __init__(self,n) -> None:
# 몇x몇 의 몇 = n
self.n = n
# nxn 보드를 문자 'O'로 초기화한다.
self.board = [['O' for i in range(self.n)] for i in range(self.n)]
# 폭탄 위치 지정 함수 초기화
self.init_bomb()
# 실제 방문했던 좌표
self.visited = [[ False for i in range(self.n)] for i in range(self.n)]
# flag 를 지정한 좌표
self.flag = [[ False for i in range(self.n)] for i in range(self.n)]
# 전체 폭탄 개수 저장
self.cnt = n
# flag를 사용한 갯수 저장
self.cntflag = 0
init_bomb 함수
def init_bomb(self):
# 받은 self.n 의 값만큼 (x,y)좌표를 각각 랜덤으로 저장
for i in range(self.n):
a = random.randrange(0,self.n,1)
b = random.randrange(0,self.n,1)
# self.board[x][y] 에 폭탄 'X'를 저장
self.board[a][b] = 'X'
# self.init_mark 를 이용하여 해당 좌표 주위에 숫자 마크 표시
self.init_mark(a,b)
폭탄을 임의의 좌표에 심습니다.
init_mark 함수
# a,b 즉 폭탄의 좌표값을 받는다.
def init_mark(self,a,b):
# 2중 루프로 x y 를 각각 -1,0,1 로 둔 모든 경우의 수를 돈다
for i in range(-1,2):
for j in range(-1,2):
# 폭탄의 좌표값 + -1,0,1 을 해준다.
a2 = (a+i)
b2 = (b+j)
# 해당 보드를 나가면 안돼기때문에 0보다 작거나 보드의 크기 보다 크면 continue
if (a2 < 0 or a2 >= self.n) or (b2 < 0 or b2 >= self.n):
continue
# self.board가 초기화된 'O'문자이면 처음이므로 1을 c != 'X'즉 폭탄 이아니면서 'O'이아니면 이미 숫자이므로 숫자를 1더해준다.
c = self.board[a2][b2]
if c == 'O':
c = 1
elif c != 'X':
c += 1
# self.board 에 업데이트 시킨다.
self.board[a2][b2] = c
폭탄 주위 8개의 좌표에 숫자를 심습니다.
strength_land 함수
# 플레이어가 찍은 좌표 a,b를 받는다.
def strength_land(self,a,b):
# 현재 좌표의 보드값이 숫자와 폭탄이 아니라면
if self.board[a][b] == 'O':
# 현재 좌표가 보드를 벗어나지 않는다면 현재 좌표값을 방문했다는 것으로 변경
if not ((a < 0 or a >= self.n) or (b < 0 or b >= self.n)):
self.visited[a][b] = True
else:
return False
# 해당좌표 주위를 모드 탐색
for i in range(-1,2):
for j in range(-1,2):
a2 = a+i
b2 = b+j
# 해당 좌표가 보드를 벗어난다면 continue
if (a2 < 0 or a2 >= self.n) or (b2 < 0 or b2 >= self.n):
continue
# 해당좌표가 방문했던 좌표라면 continue
if self.visited[a2][b2]:
continue
# 모두아니라면 재귀하면서 모든 숫자와 폭탄이 아닌 값을 탐색한다.
else:
self.strength_land(a2,b2)
# 현재 좌표의 보드값이 숫자라면 해당값은 방문했다고 저장.
elif self.board[a][b] != 'X':
self.visited[a][b] = True
폭탄과 숫자가아닌 그냥 땅인 좌표를 택했을 경우 그와 이어진 땅의 모든 좌표를 탐색합니다. (나중에 visited 즉 해당 좌표를 탐색했냐 여부 를 활용하여 보드를 출력합니다.) 재귀함수를 이용합니다.
'게임' 카테고리의 다른 글
[개인정보처리방침] (0) | 2022.09.26 |
---|