지뢰찾기 게임

지뢰찾기 게임 제작기 1

잡코신 2024. 3. 5. 18:00
728x90
반응형

지뢰찾기 게임?

Microsoft Windows에 포함된 기본 게임 중 하나이자 Windows 3.1부터 Windows 7까지 꾸준히 개근해 온 게

임이다. Windows 3.0에서는 지뢰 찾기 대신 바둑판 놀이라고 하여 오셀로(othello)를 지원했다.
의외로 비디오 게임 원시기(즉 메인프레임 컴퓨터로 만들어진 게임)부터 있었던 게임이다. 제리맥 래티프가 개발한 '큐브'(Jerimac Ratliff's Cube)라는 게임이 그 원형으로 여겨지고 있으며, 1980년대 다양한 소프트웨어 회사에서 만들어지면서 지뢰 찾기가 슬슬 보급되다가 윈도우로 인해 이제는 윈도우를 사용하는 사람이라면 가지고 있을 수밖에 없는 게임이 됐다.

 

지뢰찾기 게임 룰

Windows 기본 지뢰 찾기뿐만 아니라 파생작들도 난이도를 정의할 때 대부분 아래 기준을 따른다고 한다.
  • 초급 : 가로 9, 세로 9, 지뢰 10개 (12.3%)
  • 중급 : 가로 16, 세로 16, 지뢰 40개 (15.6%)
  • 고급 : 가로 30, 세로 16, 지뢰 99개 (20.6%)

플레이 목표는 맵에 지뢰가 존재하는 칸만 남기는 것이다.

플레이 방법은 칸을 클릭하는 것이다. 지뢰가 없는 칸을 클릭하면 그 칸과 연결된 (주변에 지뢰가 하나도 없는) 칸이 모두 사라지며, 지뢰가 있는 칸만 남기고 모든 칸을 없애는 것이 클리어 조건이다. 지뢰가 있는 칸을 클릭하는 즉시 게임오버다. 만약 클릭한 칸 주변에 지뢰가 존재하면, 그 칸을 중심으로 한 3×3 영역에 몇 개의 지뢰 수만큼 숫자가 뜨게 된다.

 

지뢰찾기 만들기

이제 지뢰찾기 게임 룰에 기반하여 관련 게임을 만들 것이다. 프로그래밍 언어는 파이썬을 이용한다.

import random

먼저 필요한 라이브러리를 임포트 해준다.

지뢰찾기에서 랜덤으로 지뢰를 배치할 때 필요한 random 라이브러리이다.

board_size = 9 # 보드 사이즈
num_mines = 10 # 지뢰 개수

처음 제작하는 것이기에 난이도를 구분하지 않고 초급 기준으로 만들 것이다.

 

1. 지뢰 랜덤 배치하기

# ' '로 초기화된 이차원 리스트를 생성하여 지뢰찾기 게임의 초기 상태를 나타내는 게임 보드를 만든다.
board = [[' ' for _ in range(board_size)] for _ in range(board_size)]

placed_mines = 0 # 현재까지 배치된 지뢰의 개수

# 원하는 지뢰 개수만큼 지뢰를 배치할 때까지 반복
while placed_mines < num_mines:
    # 무작위로 행과 열을 선택하여 지뢰를 배치할 위치 결정
    row, col = random.randint(0, board_size - 1), random.randint(0, board_size - 1)

    if board[row][col] != '*':
        # 선택된 위치에 지뢰가 없다면, 새로운 지뢰 배치
        board[row][col] = '*'

        # 새로운 지뢰가 배치되었으므로, 배치된 지뢰의 개수를 1 증가
        placed_mines += 1

게임의 초기 상태를 나타내는 게임 보드판을 생성한다. 랜덤으로 지뢰를 배치하고 배치된 곳은 * 으로 표시한다.

이것은 게임의 보드판이고 플레이어 기준에서 플레이어가 보는 보드판도 만들어준다.

 

2. 게임 판 만들고 출력하기

#사용자에게 보여지는 게임 화면을 표현하는 리스트
revealed = [[' ' for _ in range(board_size)] for _ in range(board_size)]

' '로 초기화된 이차원 리스트를 생성하여 각 셀의 현재 상태를 나타낸다. 처음에는 모든 셀이 가려진 상태(' ')로 초기화되고 이후 사용자가 셀을 열면 해당 위치의 revealed 값을 변경하여 지뢰 여부 또는 주변 지뢰 개수를 표시한다.

# 게임 보드 출력
def print_board(board):
    for row in board:
        print(' '.join(row))

위에서 만든 보드를 출력해 주는 함수를 만든다.

 

3. 주변 지뢰 개수 세기 

count = 0 # 주변 지뢰 개수

# 주어진 위치 (row, col) 주변의 모든 셀에 대해 반복
for r in range(row - 1, row + 2):
    for c in range(col - 1, col + 2):
    	# 인덱스가 유효한지 확인하고, 해당 셀이 지뢰인지 확인
        if 0 <= r < len(board) and 0 <= c < len(board[0]) and board[r][c] == '*':
            count += 1 # 주변에 지뢰가 있으면 count를 1 증가

 

다음으로 주변 지뢰의 개수를 세주는 코드를 만든다.

특정 위치(row, col : 행과 열) 기준으로 주변 8개의 인접한 셀에 대한 지뢰의 개수를 센다.

 

이제 주요 로직 코드는 전부 작성했으니 메인 부분을 만들어보자.

while True:
    print_board(revealed)
    row, col = map(int, input("열고 싶은 셀의 행과 열을 입력하세요 (예: 2 3): ").split())

	# 해당 셀이 * 면
    if board[row][col] == '*':
    	print_board(board)
        print("지뢰를 밟았습니다! 게임 종료!")
        break

	# 해당 셀이 ' '이 아니면
    if revealed[row][col] != ' ':
        print("이미 열린 셀입니다. 다른 셀을 선택하세요.")
        continue

    count = 0
    for r in range(row - 1, row + 2):
        for c in range(col - 1, col + 2):
            if 0 <= r < len(board) and 0 <= c < len(board[0]) and board[r][c] == '*':
                count += 1

    revealed[row][col] = str(count)

    # 게임 승리 조건
    if sum(row.count(' ') for row in revealed) == num_mines:
        print_board(revealed)
        print("축하합니다! 모든 안전한 셀을 찾았습니다. 게임 승리!")
        break

 

열고 싶은 행과 열을 입력을 받아 그 셀이 지뢰인지 아닌지 판별하여

지뢰면 게임이 종료되고 아니라면 주변 지뢰의 개수를 알려준다.

마지막으로 맵에 지뢰가 존재하는 칸만 남으면 승리한다.

 

 

 

지뢰찾기(ver.1) 플레이해보기

import random

# 게임 설정
board_size = 8
num_mines = 10

# 게임 보드 생성
def initialize_board(size, mines):
    board = [[' ' for _ in range(size)] for _ in range(size)]
    placed_mines = 0
    while placed_mines < mines:
        row, col = random.randint(0, size - 1), random.randint(0, size - 1)
        if board[row][col] != '*':
            board[row][col] = '*'
            placed_mines += 1
    return board

# 게임 보드 출력
def print_board(board):
    for row in board:
        print(' '.join(row))

# 지뢰 주변의 지뢰 개수 계산
def count_mines_around(board, row, col):
    count = 0
    for r in range(row - 1, row + 2):
        for c in range(col - 1, col + 2):
            if 0 <= r < len(board) and 0 <= c < len(board[0]) and board[r][c] == '*':
                count += 1
    return count

if __name__ == "__main__":
    board = initialize_board(board_size, num_mines)
    revealed = [[' ' for _ in range(board_size)] for _ in range(board_size)]
    
    while True:
        print_board(revealed)
        row, col = map(int, input("열고 싶은 셀의 행과 열을 입력하세요 (예: 2 3): ").split())

        if board[row][col] == '*':
            print_board(board)
            print("지뢰를 밟았습니다! 게임 종료!")
            break

        if revealed[row][col] != ' ':
            print("이미 열린 셀입니다. 다른 셀을 선택하세요.")
            continue

        revealed[row][col] = str(count_mines_around(board, row, col))

        # 게임 승리 조건
        if sum(row.count(' ') for row in revealed) == num_mines:
            print_board(revealed)
            print("축하합니다! 모든 안전한 셀을 찾았습니다. 게임 승리!")
            break

코드를 다듬고 함수화 시켜 최종 코드를 만들었다. 이제 실행해 보자

 

 

잘 동작하는 것을 확인할 수 있었다.

 

Next

다음엔 불편한 프롬프트 입력이 아닌 직접 클릭이 가능하도록 하는 GUI로 발전시킬 것이다.

728x90
반응형

'지뢰찾기 게임' 카테고리의 다른 글

지뢰찾기 게임 제작기 5  (0) 2024.04.02
지뢰찾기 게임 제작기 4  (0) 2024.03.26
지뢰찾기 게임 제작기 3  (0) 2024.03.19
지뢰찾기 게임 제작기 2  (7) 2024.03.12