Code of AI

[ChatGPT] 지뢰찾기 게임 만들기 II (수정)

별별AI 2023. 9. 20. 19:38
728x90

요청 : 

"지뢰찾기 게임 만들기 I"에 있는 코드를 대상으로
윈도우OS용 지뢰찾기 게임을 파이썬으로 코딩한 건데. 모든 칸을 버튼으로 만들고, 지뢰를 랜덤으로 배치하는데 지뢰가 있는 곳 버튼을 클릭하면 지뢰를 클릭했다는 메시지를 보여주도록 하고, 새로운 게임을 할지 선택하도록 해줘. 지뢰 주변 버튼을 클릭하면 주변에 지뢰가 몇개 맞닿아 있는지 숫자로 표시되도록 해줘. 모든 지뢰를 피해서 버튼을 클릭하면 모든 지뢰를 찾았다는 메시지와 함게 새로운 게임을 할지 선택하도록 코드를 수정해줘

 


 

아래는 주어진 코드를 수정하여 원하는 기능을 구현한 코드입니다. 새로운 게임을 시작하거나 게임이 종료되었을 때 사용자에게 선택을 받는 기능을 추가하였습니다.

 

import pygame
import random

# 게임 설정
WIDTH, HEIGHT = 400, 400
ROWS, COLS = 10, 10
MINES = 20
TILE_SIZE = WIDTH // COLS

# 색상
WHITE = (255, 255, 255)
GRAY = (192, 192, 192)
BLACK = (0, 0, 0)

# 초기화
pygame.init()
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("지뢰찾기")

# 함수: 게임 초기화
def initialize_game():
    global board, revealed, mines, game_over
    board = [[0 for _ in range(COLS)] for _ in range(ROWS)]
    revealed = [[False for _ in range(COLS)] for _ in range(ROWS)]
    mines = []
    game_over = False

    # 지뢰 배치
    for _ in range(MINES):
        while True:
            x, y = random.randint(0, COLS - 1), random.randint(0, ROWS - 1)
            if board[y][x] == 0:
                board[y][x] = -1
                mines.append((x, y))
                break

    # 주변 지뢰 개수 계산
    for x, y in mines:
        for dx in range(-1, 2):
            for dy in range(-1, 2):
                if 0 <= x + dx < COLS and 0 <= y + dy < ROWS and board[y + dy][x + dx] != -1:
                    board[y + dy][x + dx] += 1

initialize_game()

# 게임 루프
running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        if event.type == pygame.MOUSEBUTTONDOWN:
            if not game_over:
                x, y = event.pos[0] // TILE_SIZE, event.pos[1] // TILE_SIZE
                if not revealed[y][x]:
                    revealed[y][x] = True
                    if board[y][x] == -1:
                        # 게임 오버
                        print("게임 오버!")
                        game_over = True
                    elif board[y][x] == 0:
                        # 주변 지뢰가 없으면 주변 타일도 자동으로 열기
                        stack = [(x, y)]
                        while stack:
                            cx, cy = stack.pop()
                            for dx in range(-1, 2):
                                for dy in range(-1, 2):
                                    nx, ny = cx + dx, cy + dy
                                    if 0 <= nx < COLS and 0 <= ny < ROWS and not revealed[ny][nx]:
                                        revealed[ny][nx] = True
                                        if board[ny][nx] == 0:
                                            stack.append((nx, ny))
    # 게임 승리 체크
    if all(all(revealed[y][x] or board[y][x] == -1 for x in range(COLS)) for y in range(ROWS)) and not game_over:
        print("게임 승리!")
        game_over = True

    # 그리기
    screen.fill(WHITE)
    for y in range(ROWS):
        for x in range(COLS):
            rect = pygame.Rect(x * TILE_SIZE, y * TILE_SIZE, TILE_SIZE, TILE_SIZE)
            if revealed[y][x]:
                pygame.draw.rect(screen, GRAY, rect)
                if board[y][x] > 0:
                    font = pygame.font.Font(None, 36)
                    text = font.render(str(board[y][x]), True, BLACK)
                    text_rect = text.get_rect(center=rect.center)
                    screen.blit(text, text_rect)
            else:
                pygame.draw.rect(screen, BLACK, rect)

    # 게임 종료 메시지 표시
    if game_over:
        font = pygame.font.Font(None, 36)
        text = font.render("게임 종료. 다시 시작하려면 'R' 키를 누르세요.", True, BLACK)
        text_rect = text.get_rect(center=(WIDTH // 2, HEIGHT // 2))
        screen.blit(text, text_rect)

    pygame.display.flip()

    # 게임 재시작
    keys = pygame.key.get_pressed()
    if keys[pygame.K_r] and game_over:
        initialize_game()

pygame.quit()

 

 

이 코드는 새로운 게임을 시작하려면 'R' 키를 누르면 됩니다. 게임이 종료되면 화면에 "게임 종료. 다시 시작하려면 'R' 키를 누르세요." 메시지가 표시되며, 'R' 키를 누르면 새로운 게임이 시작됩니다. 게임에서 이기면 "게임 승리!" 메시지가 표시됩니다.

 


코드 실행 결과 확인

 

위처럼 지뢰의 갯수를 나타내주는 숫자들을 확인 가능

 

 

지뢰를 클릭했을 때, 문구가 제대로 출력되지 않는 현상 발생

추가 수정이 필요

 

728x90