egui-nonogram 0.2.0

A nonogram (picross) puzzle game library for egui
Documentation

egui-nonogram

crates.io docs.rs deps.rs CI Rust version License Changelog Live demo

A self-contained Nonogram (picross) puzzle game library for egui.

Features

  • Pure game logic struct (NonogramGame) with no egui dependency — usable headlessly or with any renderer
  • Ready-to-use egui Widget (NonogramWidget) that renders an interactive board with row/column clues
  • Two ways to build a puzzle: NonogramGame::from_grid (supply your own picture) and NonogramGame::random (procedural, seeded)
  • Monochrome only — cells are filled or empty, clues are plain run-length numbers
  • Left-click fills a cell, right-click crosses it out; crossed cells are a player aid only and never need to match the solution
  • Click-and-drag paints (or erases) a whole stroke of cells in one gesture
  • Solved rows/columns dim and strike through their clue as a solving hint
  • Optional read-only progress preview thumbnail beside the board
  • Undo/redo history
  • No losing state — every action is reversible

Usage

Add the dependency:

[dependencies]
egui-nonogram = "0.1"

Then use it in your egui app:

use egui_nonogram::{NonogramGame, NonogramWidget};

// A curated puzzle from an explicit picture:
let grid = vec![
    vec![false, true, false],
    vec![true, true, true],
    vec![false, true, false],
];
let mut game = NonogramGame::from_grid(grid);

// Or a procedural puzzle, reproducible via a seed:
let mut game = NonogramGame::random(10, 10, 0.45, 42);

// Inside your egui update/UI closure:
ui.add(NonogramWidget::new(&mut game));

After each frame you can inspect game.status to check for a win:

use egui_nonogram::GameStatus;

match game.status {
    GameStatus::Playing => {}
    GameStatus::Won => println!("Solved!"),
}

To start over on the same puzzle:

game.reset();

egui version compatibility

egui-nonogram egui
0.1 0.35

License

Licensed under either of MIT or Apache-2.0 at your option.