Mine Sweeperを作ろう

python
FreeSimpleGUIを使ってMine Sweeperを作りました。

うまく地雷を全部除去できた場合

 ⇒ こんなに沢山の地雷が埋まっていました

import FreeSimpleGUI as sg
import random

#sg.theme('DarkGreen') #地雷原の色のみ設定、他はボタンの色で変更できる

# 地雷のシンボルを定義
mine_symbol = 'X'

# プレーヤー用のボタンを含んだレイアウトを定義
layout = [
    [sg.Button('Start/Next', key='-START-'), sg.Button('Hint', key='-HINT-'), sg.Button('End', key='-END-')],
    [[sg.Button('', size=(4, 2), key=(i, j), pad=(0,0), button_color=('white', 'gray')) for j in range(10)] for i in range(10)]
]
#input()

# ウィンドウを作成
window = sg.Window('Mine Sweeper ver2.0', layout)

# ヒント表示の状態を追跡するフラグ
hint_active = False

def initialize_board():
    # ボードを初期化し、地雷をランダムに配置
    board = [[0] * 10 for _ in range(10)]
    mines = set()
    while len(mines) < 10:
        mines.add((random.randint(0, 9), random.randint(0, 9)))
    for mine in mines:
        board[mine[0]][mine[1]] = -1
    
    # 周囲の地雷の数をカウント
    for i in range(10):
        for j in range(10):
            if board[i][j] == -1:
                continue
            for di in range(-1, 2):
                for dj in range(-1, 2):
                    if 0 <= i+di < 10 and 0 <= j+dj < 10 and board[i+di][j+dj] == -1:
                        board[i][j] += 1
    return board, mines

board, mines = initialize_board()

while True:
    event, values = window.read()
    
    if event == sg.WIN_CLOSED or event == '-END-':
        break


    if event == '-START-':
        # ボードを再初期化
        board, mines = initialize_board()
        for i in range(10):
            for j in range(10):
                window[(i, j)].update('', button_color=('white', 'gray')) # 'gray'
        hint_active = False

    elif event == '-HINT-':
        # ヒントボタンのトグル、色変更
        hint_active = not hint_active
        for i in range(10):
            for j in range(10):
                if hint_active and (i, j) in mines:
                    window[(i, j)].update(mine_symbol, button_color=('white', 'red'))
                else:
                    window[(i, j)].update('', button_color=('white', 'gray'))

    elif isinstance(event, tuple):  # マス目のボタンが押された時
        i, j = event
        if board[i][j] == -1:  # 地雷をクリックした場合
            sg.popup('Boom! Game Over.', title='Result')
            break
        else:
            # 周囲の地雷の数を表示、色変更
            window[event].update(str(board[i][j]) if board[i][j] > 0 else '', button_color=('white', 'green'))

# ウィンドウを閉じる
window.close()