Minesweeper / app.py
DHEIVER's picture
Update app.py
c8b2153 verified
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()