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.6.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.6-py3-none-any.whl (40.5 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: sneks_engine-1.0.6.tar.gz
  • Upload date:
  • Size: 28.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: Hatch/1.16.5 cpython/3.14.3 HTTPX/0.28.1

File hashes

Hashes for sneks_engine-1.0.6.tar.gz
Algorithm Hash digest
SHA256 1ce71517e8e62c3873dfff9fb13bcc21b09b841640c8328ca91c90e71771aa89
MD5 1860e7592b164314e9d90d5081cc4086
BLAKE2b-256 e74cbb31af9d9b064679e2133fcbc75d5cc4f2cc1524a904d3a0740a7be9e8b5

See more details on using hashes here.

File details

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

File metadata

  • Download URL: sneks_engine-1.0.6-py3-none-any.whl
  • Upload date:
  • Size: 40.5 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: Hatch/1.16.5 cpython/3.14.3 HTTPX/0.28.1

File hashes

Hashes for sneks_engine-1.0.6-py3-none-any.whl
Algorithm Hash digest
SHA256 15016d0aa8a14cdeae784a99e3098307a6f3c9abd96cc337207d7ddc2bd7ca6c
MD5 1031a9239570c52c605bb67a32a8e511
BLAKE2b-256 55b79553f0ed4bcf9057e458d765aa2cf23207f72fedbe7ca5111851ecc37b41

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