import gradio as gr import numpy as np import random class Minesweeper: def __init__(self, size=8, num_mines=10): self.size = size self.num_mines = num_mines self.board = np.zeros((size, size), dtype=int) self.revealed = np.zeros((size, size), dtype=bool) self.flags = np.zeros((size, size), dtype=bool) self.game_over = False self.first_move = True def place_mines(self, first_x, first_y): positions = [(i, j) for i in range(self.size) for j in range(self.size)] positions.remove((first_x, first_y)) mine_positions = random.sample(positions, self.num_mines) for x, y in mine_positions: self.board[x, y] = -1 for x in range(self.size): for y in range(self.size): if self.board[x, y] != -1: self.board[x, y] = self.count_adjacent_mines(x, y) def count_adjacent_mines(self, x, y): count = 0 for i in range(max(0, x-1), min(self.size, x+2)): for j in range(max(0, y-1), min(self.size, y+2)): if self.board[i, j] == -1: count += 1 return count def reveal(self, x, y): if self.first_move: self.place_mines(x, y) self.first_move = False if self.board[x, y] == -1: self.game_over = True return "💥 Game Over!" self.revealed[x, y] = True if self.board[x, y] == 0: for i in range(max(0, x-1), min(self.size, x+2)): for j in range(max(0, y-1), min(self.size, y+2)): if not self.revealed[i, j]: self.reveal(i, j) if self.check_win(): return "🎉 Você venceu!" return None def check_win(self): return np.all(self.revealed | (self.board == -1)) def get_display(self): display = [] for i in range(self.size): row = [] for j in range(self.size): if not self.revealed[i, j]: if self.flags[i, j]: row.append("🚩") else: row.append("⬜") else: if self.board[i, j] == -1: row.append("💣") elif self.board[i, j] == 0: row.append("⬛") else: row.append(str(self.board[i, j])) display.append(row) return display def create_game(): return Minesweeper() def make_move(x, y, is_flag, game): if game is None: game = create_game() if game.game_over: return "Game Over! Clique em 'Novo Jogo'", game if is_flag: game.flags[x, y] = not game.flags[x, y] message = None else: if game.flags[x, y]: return "Remova a bandeira primeiro!", game message = game.reveal(x, y) if game.game_over: game.revealed = np.ones((game.size, game.size), dtype=bool) grid = game.get_display() buttons = [] for i in range(game.size): for j in range(game.size): buttons.append(gr.Button(value=grid[i][j], scale=1)) return message if message else "Jogo em andamento", game def create_interface(): with gr.Blocks() as demo: gr.Markdown(""" # 💣 Campo Minado - Clique nos quadrados para revelar - Use 'Bandeira' para marcar possíveis minas - Evite todas as minas! """) game_state = gr.State() status = gr.Textbox(label="Status", value="Clique para começar!") with gr.Column(): use_flag = gr.Checkbox(label="Bandeira") new_game = gr.Button("Novo Jogo") with gr.Row(): for i in range(8): with gr.Column(scale=1): for j in range(8): btn = gr.Button("⬜", scale=1) btn.click( make_move, inputs=[gr.Number(value=i, visible=False), gr.Number(value=j, visible=False), use_flag, game_state], outputs=[status, game_state] ) new_game.click( lambda: (None, create_game()), outputs=[status, game_state] ) return demo demo = create_interface() demo.launch()