본문 바로가기

게임

지뢰찾기 게임 만들기 (python3) (1)

지뢰찾기 깃헙주소

https://github.com/ineiw/zrae

전체 클래스 설명

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