# egui-minesweeper
[](https://crates.io/crates/egui-minesweeper)
[](https://docs.rs/egui-minesweeper)
[](https://deps.rs/repo/github/cecton/egui-minesweeper)
[](https://github.com/cecton/egui-minesweeper/actions/workflows/ci.yml)
[](https://blog.rust-lang.org/2024/07/25/Rust-1.80.0.html)
[](https://github.com/cecton/egui-minesweeper#license)
[](CHANGELOG.md)
[](https://cecton.github.io/egui-minesweeper)
A self-contained Minesweeper game library for [egui](https://github.com/emilk/egui).
## Features
- Pure game logic struct (`MinesweeperGame`) with no egui dependency — usable headlessly or with any renderer
- Ready-to-use egui `Widget` (`MinesweeperWidget`) that renders a fully interactive board
- Safe first click: mines are placed on the first reveal, guaranteeing the player can never lose immediately
- Iterative flood-fill reveal (no recursion, safe on large boards)
- Classic Minesweeper cell styling: raised hidden cells, numbered revealed cells, flagging, mine reveal on loss
## Usage
Add the dependency:
```toml
[dependencies]
egui-minesweeper = "0.1"
```
Then use it in your egui app:
```rust
use egui_minesweeper::{MinesweeperGame, MinesweeperWidget};
// Store the game in your app state
let mut game = MinesweeperGame::new(16, 16, 40);
// Inside your egui update/UI closure:
ui.add(MinesweeperWidget::new(&mut game));
// Optionally set a fixed cell size (otherwise fills available space):
ui.add(MinesweeperWidget::new(&mut game).cell_size(32.0));
```
After each frame you can inspect `game.status` to check for a win or loss:
```rust
use egui_minesweeper::GameStatus;
match game.status {
GameStatus::Playing => {}
GameStatus::Won => println!("You won!"),
GameStatus::Lost => println!("You lost!"),
}
```
To start a new game with the same settings:
```rust
game.reset();
```
## egui version compatibility
| 0.1 | 0.34 |
## License
Licensed under either of [MIT](LICENSE-MIT) or [Apache-2.0](LICENSE-APACHE) at your option.