rsnaker 0.4.2

A good old retro Snake in terminal UI
Documentation

crates.io Doc.rs GPLv3 License Last Commit Build Test cargo-deny Last doc Code lines

Snake Game using Ratatui

It is a terminal-based snake game using the Ratatui crate for rendering. Playing Snake Terminal Welcome Menu Terminal Output Menu Terminal Output Running

Features

  • Terminal UI: Uses Ratatui for rendering a grid-based game.
  • Game Logic: Manages snake movement, collisions, and scoring.
  • Multithreading: Uses multiple threads for input handling, rendering at 60 FPS, and game logic execution.
  • Emoji-based graphics: Supports rendering the snake using emojis instead of ASCII.
  • Configurable parameters: With clap for command-line arguments & toml file.

Installation from release

✅ Prerequisites

  • 💻 Use a terminal that supports emoji
    • On Windows, the new Microsoft terminal shipped with w11 (and compatible w10) supports emoji out of the box among other improvements.
    • On Linux / Android, you could need to install the Noto Emoji font: 👉 Emoji font support for instructions.
    • Some screen displays can flicker at 60 FPS in the terminal, use a decent display or an external monitor.

Running

  • Download the latest release from the release page according to your OS.
  • Run the executable using the terminal or double-click on the file if your OS supports it.
  • For windows:
    • Search for "Terminal" in the search menu to launch it and set as default (to be able to run the snake by double-clicking the .exe) or run rsnake from the terminal with:
    • cd "download path" then .\rsnake-x86_64-pc-windows-msvc.exe
  • For Linux/macOS:
    • cd "download path" && ./rsnake-x86_64-unknown-linux-musl (or ./rsnake-x86_64-apple-darwin on macOS)
  • For android:
    • Dedicated Android binary (rsnake-aarch64-linux-android) or static musl build (rsnake-aarch64-unknown-linux-musl) for emulated linux with proot.

    • For easier use, END key works as ENTER, "-" as a pause key, HOME for Menu, Tab to quit.

    • Use a linux emulator, tested with:

    • Download from the release page:

      wget -O rsnake https://github.com/FromTheRags/rsnake/releases/latest/download/rsnake-aarch64-linux-android
      # or
      wget -O rsnake https://github.com/FromTheRags/rsnake/releases/latest/download/rsnake-aarch64-unknown-linux-musl
      chmod +x rsnake
      ./rsnake
    

In case pre-build binaries are not enough, you can build from source Installation from source

Run Game options

  • To see run options, use: rsnake --help
  • E.g., rsnake -z 🐼 -b 🍥 or cargo run -- -z 🐼 -b 🍥 (if from source)

TOML Presets

  • To save a set of parameters:
    • Use the in-game menu "edit", load a slot (with a number between 1 and 7), make your modification with arrows keys, then save with 'x'
    • Create and alias for the CI option
  • Then load with --load option or using the in-game menu "edit".
    NB: You can download some of the Best Configurations and put it in the same folder as the executable

Installation from source

✅ Prerequisites

Running from source

Short path

  • Using cargo only: cargo install --locked rsnaker --force
  • To run the game execute: rsnake, if not found, the binary is in ~/.cargo/bin/rsnake

Long path

  • Clone this repository git clone https://github.com/FromTheRags/rsnake.git
  • Go to the directory cd rsnake
  • To run the game, either:cargo run or cargo run --manifest-path rsnake/Cargo.toml (if in another directory)
  • To install the game as a command:
    cargo install --path .
    And then run the game with: rsnake
  • See Run option below for more details.

Architecture

Full details are available in architecture.md.

  • Logging Configuration

The logging subsystem is configured from a dedicated TOML file (snake_log_config.toml), separate from the game options file. It is read only once at startup, and is deserialization-only (the game never writes back to it). If the file is missing or invalid, sensible defaults are used.

# snake_log_config.toml
level = "off"                                              # off, error, warn, info, debug, trace
file_name = "snake.log"                                    # output log file (current directory)
time_format = "[hour]:[minute]:[second].[subsecond digits:6]"  # `time` crate format description
with_ansi = false                                          # ANSI colors in the log file
with_target = false                                        # include the module path (target)
with_thread_names = true                                   # include thread names
with_thread_ids = false                                    # include thread ids
with_line_number = true                                    # include source line numbers
with_file = true                                           # include source file names
with_level = true                                          # include the log level

The CLI flag --log-level (if explicitly set, i.e., not off) overrides the level coming from the TOML file via the hot-reload handle, as well as log option overrides if set in game-preset file/menu.

  • Uses Arc & RwLock for synchronization.
  • Spawns separate threads for input handling, rendering (60 Hz), and game logic execution.

Documentation generation

  • cargo doc --document-private-items --no-deps --open

Tests

  • As usual run them with cargo test the project is set up with a lib containing all the code, and a main.rs just calling it
  • As this is a widespread pattern providing full compliance with the Rust test ecosystem, allowing doc comment to be automatically tested, for example.
  • To have a coverage report, install llvm-cov:
    rustup component add llvm-tools-preview
    cargo install cargo-llvm-cov
    
  • And run cargo llvm-cov --open
  • A great coverage is not a goal for this project (tests are only there to showcase tests in rust),
  • For reference, the current coverage is : codecov

References