지뢰찾기 게임?
Microsoft Windows에 포함된 기본 게임 중 하나이자 Windows 3.1부터 Windows 7까지 꾸준히 개근해 온 게
임이다. Windows 3.0에서는 지뢰 찾기 대신 바둑판 놀이라고 하여 오셀로(othello)를 지원했다.
의외로 비디오 게임 원시기(즉 메인프레임 컴퓨터로 만들어진 게임)부터 있었던 게임이다. 제리맥 래티프가 개발한 '큐브'(Jerimac Ratliff's Cube)라는 게임이 그 원형으로 여겨지고 있으며, 1980년대 다양한 소프트웨어 회사에서 만들어지면서 지뢰 찾기가 슬슬 보급되다가 윈도우로 인해 이제는 윈도우를 사용하는 사람이라면 가지고 있을 수밖에 없는 게임이 됐다.
지뢰찾기 게임 룰
- 초급 : 가로 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로 발전시킬 것이다.
'지뢰찾기 게임' 카테고리의 다른 글
지뢰찾기 게임 제작기 5 (0) | 2024.04.02 |
---|---|
지뢰찾기 게임 제작기 4 (0) | 2024.03.26 |
지뢰찾기 게임 제작기 3 (0) | 2024.03.19 |
지뢰찾기 게임 제작기 2 (7) | 2024.03.12 |