Implemented a complete network multiplayer Snake game with the following features: Core Game: - Client-server architecture using asyncio for networking - Pygame-based rendering at 60 FPS - Server-authoritative game state with 10 TPS - Collision detection (walls, self, other players) - Food spawning and score tracking - Support for multiple players with color-coded snakes Server Discovery: - UDP multicast-based automatic server discovery (239.255.0.1:9999) - Server beacon broadcasts presence every 2 seconds - Client discovery with 3-second timeout - Server selection UI for multiple servers - Auto-connect for single server - Graceful fallback to manual connection Project Structure: - src/shared/ - Protocol, models, constants, discovery utilities - src/server/ - Game server, game logic, server beacon - src/client/ - Game client, renderer, discovery, server selector - tests/ - Unit tests for game logic, models, and discovery Command-line interface with argparse for both server and client. Comprehensive documentation in README.md and CLAUDE.md. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
3.9 KiB
3.9 KiB
CLAUDE.md
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
Project Overview
This is a network multiplayer Snake game built with Python 3.11, using asyncio for networking, pygame for graphics, and UDP multicast for automatic server discovery.
Project Structure:
src/shared/- Shared code (models, protocol, constants, discovery utilities)src/server/- Game server with authoritative game state and multicast beaconsrc/client/- Game client with pygame rendering, discovery, and server selection UItests/- Test files using pytest
Setup Commands
# Create and activate virtual environment
python -m venv venv
venv\Scripts\activate # Windows
# source venv/bin/activate # Linux/Mac
# Install dependencies
pip install -r requirements.txt
# Install development dependencies
pip install -r requirements-dev.txt
Running the Game
# Start the server (with discovery beacon enabled by default)
python run_server.py --name "My Game" --port 8888
# Start clients with auto-discovery (no host needed)
python run_client.py --name Alice
# If multiple servers found, a selection UI appears
# Manual connection (skip discovery)
python run_client.py 192.168.1.100 --port 8888 --name Bob
# Server options:
# --host HOST Bind address (default: localhost)
# --port PORT Port number (default: 8888)
# --name NAME Server name for discovery
# --no-discovery Disable multicast beacon
# Client options:
# [host] Server host (omit for auto-discovery)
# --port PORT Server port
# --name NAME Player name
# --discover Force discovery mode
# Press SPACE to start the game, arrow keys/WASD to move
Development Commands
# Run all tests
pytest
# Run tests with coverage
pytest --cov=src --cov-report=html
# Format code with black
black src/ tests/
# Lint code
flake8 src/ tests/
# Type check
mypy src/
Architecture
Client-Server Model:
- Server (
src/server/game_server.py) runs the authoritative game loop using asyncio - Clients connect via TCP and send input commands (MOVE, START_GAME, etc.)
- Server broadcasts game state updates to all connected clients at 10 FPS
- Clients render the game state locally at 60 FPS using pygame
Key Components:
src/shared/protocol.py- JSON-based message protocol (MessageType enum, Message class)src/shared/models.py- Data models (Snake, Position, Food, GameState) with serializationsrc/shared/constants.py- Game configuration (grid size, colors, tick rate, multicast settings)src/shared/discovery.py- Multicast discovery utilities (ServerInfo, DiscoveryMessage)src/server/game_logic.py- Game rules (movement, collision detection, food spawning)src/server/server_beacon.py- UDP multicast beacon for server discoverysrc/client/renderer.py- Pygame rendering of game statesrc/client/server_discovery.py- Client-side server discoverysrc/client/server_selector.py- Pygame UI for selecting from multiple servers
Game Flow:
- Server starts on port 8888 and broadcasts presence on multicast group 239.255.0.1:9999
- Clients send DISCOVER message to multicast group and collect SERVER_ANNOUNCE responses
- If multiple servers found, client shows selection UI; if one found, auto-connects
- Clients connect via TCP and receive WELCOME message with player_id
- Any player can press SPACE to send START_GAME message
- Server creates snakes for all connected players and spawns food
- Server runs game loop: update positions → check collisions → broadcast state
- Game ends when only 0-1 snakes remain alive
Discovery Protocol:
- Multicast group: 239.255.0.1:9999 (local network)
- Client → Multicast: DISCOVER (broadcast request)
- Server → Client: SERVER_ANNOUNCE (direct response with host, port, name, player count)
- Server also periodically broadcasts presence every 2 seconds