Spaces:
Sleeping
Sleeping
| 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() |