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()