#cellular-automata #conway #back-end #game-of-life #board-game #user-interface

life-backend

A backend implementation of Conway's Game of Life

3 releases

0.0.2 Jun 25, 2023
0.0.1 Jun 18, 2023
0.0.0 Jun 16, 2023

#345 in Science

MIT/Apache

140KB
2.5K SLoC

life-backend

GitHub crates.io Docs.rs CI Status Docs Status

A backend implementation of Conway's Game of Life.

This library provides several functionalities for simulating Life-like cellular automata, including Conway's Game of Life.

The following operations are supported:

  • Parsing or writing patterns of Life-like cellular automata (Plaintext and RLE formats are supported)
  • Parsing or writing rules in the birth/survival notation (e.g., "B3/S23")
  • Managing a board, a two-dimensional orthogonal grid map of live and dead cells (The type of the x- and y-coordinates of positions is generalized)
  • Creating a new game based on a given rule and board, advancing the generation and querying the state

It does not provide frontend functionality for viewing or editing patterns through a user interface.

Examples

The following code example demonstrates how to create a new game from a pattern file, advance the game and print its final state:

use life_backend::format;
use life_backend::{Board, Game, Position};

// Read a pattern file
let handler = format::open("patterns/glider.rle")?;

// Create a new game (the type parameter is `i16`)
let rule = handler.rule();
let board = handler
  .live_cells()
  .map(Position::try_from)
  .collect::<Result<Board<i16>, _>>()?;
let mut game = Game::new(rule, board);

// Advance the generation
let generation = 4;
for _ in 0..generation {
  game.advance();
}

// Print the last state
let bbox = game.board().bounding_box();
let population = game.board().iter().count();
println!("Generation {generation}: bounding-box = {bbox}, population = {population}");
println!("{game}");

examples/game.rs is a simple Game of Life program. It creates a new game from a pattern file, advances the game and prints its state to the standard output. You can run this program like as:

$ cargo run --example game -- --generation=1 patterns/glider.rle
...
Generation 0: bounding-box = (x:[0, 2], y:[0, 2]), population = 5
.O.
..O
OOO

Generation 1: bounding-box = (x:[0, 2], y:[1, 3]), population = 5
O.O
.OO
.O.

License

Licensed under either of

at your option.

Contribution

Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.

Dependencies

~275–375KB