Skip to main content

Sneks engine

Project description

Sneks Engine

A Python game engine for creating snake-like games with customizable rules, graphics, and AI submissions.

Architecture

src/sneks/
├── engine/           # Core engine components
│   ├── core/         # Primitives: Cell, Bearing, Direction, Action
│   ├── entity/       # Game entities: Snek, Food, Static/Dynamic
│   ├── config/       # Configuration dataclasses
│   ├── manager/      # Cell and bearing calculations
│   ├── validator/    # Submission validation tests
│   ├── world.py      # Base World class (game loop)
│   ├── graphics.py   # Pygame rendering
│   ├── recorder.py   # Frame capture and video encoding
│   ├── runner.py     # Game execution and scoring
│   └── scoring.py    # Score normalization
└── games/            # Game variants
    ├── classic/      # Traditional snek
    ├── space/        # Asteroids + snek
    ├── toroidal/     # Infinite growth mode
    └── example/      # Example submission

Key Components

  • World: Manages the game loop, entities, and board state. Subclass this to create new game modes.
  • Entity: Base class for all game objects. DynamicEntity moves and grows; StaticEntity maintains shape.
  • Snek: The AI interface that submissions implement. Receives game state and returns an Action.
  • Config: Singleton configuration system. Each game mode extends Config with custom settings.

Creating a New Game Mode

  1. Create a config class extending Config:
from dataclasses import dataclass
from sneks.engine.config.base import Config


@dataclass(frozen=True)
class MyGameConfig(Config):
    title: str = "My Game"
    turn_limit: int = 5000
  1. Create a world class extending World:
from sneks.engine.world import World
from sneks.engine.scoring import Criteria


class MyGame(World):
    criteria = Criteria.AGE | Criteria.LENGTH  # Scoring criteria

    def __init__(self, config: MyGameConfig) -> None:
        super().__init__(config=config)

    # Override hooks as needed:
    # - load_entities(): Add custom entities
    # - before_step(): Pre-step logic
    # - after_step(): Post-step logic (collisions, growth)

Core Concepts

Bearing vs Direction vs Action

The engine uses a velocity-based movement model:

  • Bearing: Current velocity as Bearing(x, y) — cells moved per tick in each axis. A snek at Bearing(2, -1) moves 2 cells right and 1 cell down each tick.
  • Direction: Cardinal directions (UP, DOWN, LEFT, RIGHT) used for querying neighbors and obstacles.
  • Action: Acceleration input returned by get_next_action(). Actions modify the bearing — Action.UP increments bearing.y by 1.

Sneks start stationary at Bearing(0, 0). Returning Action.RIGHT twice results in Bearing(2, 0), moving 2 cells right per tick.

Toroidal Board

The game board wraps — moving off the right edge appears on the left. This affects:

  • Cell neighbors (e.g., Cell(0, 0).get_left() wraps to the rightmost column)
  • Distance calculations (shortest path may cross edges)
  • Collision detection

Relative Coordinates

Submissions receive positions relative to their head, which is always Cell(0, 0):

  • self.occupied contains obstacles offset from the head
  • self.food contains food positions offset from the head
  • self.body[0] is always Cell(0, 0) (the head)

This simplifies AI logic — you don't need to know absolute board position.

Vision Range

Sneks can only see obstacles within Config().snek.vision_range cells. Food is always visible regardless of distance.

Recording

Install the recording dependency:

pip install -e ".[record]"

Enable recording in your config:

from sneks.engine.config.graphics import GraphicsConfig

MyGameConfig(
    graphics=GraphicsConfig(
        record=True,
        record_prefix="./output",  # Output directory
        record_fps=12,             # Video framerate
    )
)

Frames are saved to output/pics/ during gameplay. Call recorder.animate_game() after the run to encode to MP4 in output/movies/. The encoder uses ffmpeg via imageio_ffmpeg.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

sneks_engine-1.0.4.tar.gz (28.0 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

sneks_engine-1.0.4-py3-none-any.whl (40.9 kB view details)

Uploaded Python 3

File details

Details for the file sneks_engine-1.0.4.tar.gz.

File metadata

  • Download URL: sneks_engine-1.0.4.tar.gz
  • Upload date:
  • Size: 28.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: python-httpx/0.28.1

File hashes

Hashes for sneks_engine-1.0.4.tar.gz
Algorithm Hash digest
SHA256 0cbcba7e76b205a33697d8e204038a57acd6c6c3dd8c103e34539c7b53a501b9
MD5 e27b1a2011a464c9cea19fd639e10d16
BLAKE2b-256 6e7ce5d93e1c0b83ca826a012439c66441b83dd716c3d8e6bf43f48cae0eb7cf

See more details on using hashes here.

File details

Details for the file sneks_engine-1.0.4-py3-none-any.whl.

File metadata

  • Download URL: sneks_engine-1.0.4-py3-none-any.whl
  • Upload date:
  • Size: 40.9 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: python-httpx/0.28.1

File hashes

Hashes for sneks_engine-1.0.4-py3-none-any.whl
Algorithm Hash digest
SHA256 6dd2cd484cea9739e1eb6bcfd9cf2094ee308dd16a6341d8de1f781d74926b9e
MD5 2a5df7fa5df75a33c9be290e8b327ce0
BLAKE2b-256 29beb207267064b163e5d75f8639a4aaf0f63ed5246cc87f9bd3dfc93e8c355c

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page