Major networking overhaul to reduce latency and bandwidth: UDP Protocol Implementation: - Created UDP server handler with sequence number tracking (uint32 with wrapping support) - Implemented 1000-packet window for reordering tolerance - Packet structure: [seq_num(4) + msg_type(1) + update_id(2) + payload] - Handles 4+ billion packets without sequence number issues - Auto-fallback to TCP on >20% packet loss Binary Codec with Schema Versioning: - Extensible field-based format with version negotiation - Position encoding: 11-bit packed (6-bit x + 5-bit y for 40x30 grid) - Delta encoding for snake bodies: 2 bits per segment direction - Variable-length integers for compact numbers - String encoding: up to 16 chars with 4-bit length prefix - Player ID hashing: CRC32 for compact representation - zlib compression for payload reduction Partial Update System: - Splits large game states into independent packets <1280 bytes (IPv6 MTU) - Each packet is self-contained (packet loss affects only subset of snakes) - Smart snake segmenting for very long snakes (>100 segments) - Player name caching: sent once per player, then omitted - Metadata (food, game_running) separated from snake data 32-Player Support: - Extended COLOR_SNAKES array to 32 distinct colors - Server enforces MAX_PLAYERS=32 limit - Player names limited to MAX_PLAYER_NAME_LENGTH=16 - Name validation and sanitization - Color assignment with rotation through 32 colors Desktop Client Components: - UDP client with automatic TCP fallback - Partial state reassembly and tracking - Sequence validation and duplicate detection - Statistics tracking for fallback decisions Web Client Components: - 32-color palette matching Python colors - JavaScript binary codec (mirrors Python implementation) - Partial state tracker for reassembly - WebRTC DataChannel transport skeleton (for future use) - Graceful fallback to WebSocket Server Integration: - UDP server on port 8890 (configurable via --udp-port) - Integrated with existing TCP (8888) and WebSocket (8889) servers - Proper cleanup on shutdown - Command-line argument: --udp-port (0 to disable, default 8890) Performance Improvements: - ~75% bandwidth reduction (binary + compression vs JSON) - All packets guaranteed <1280 bytes (safe for all networks) - UDP eliminates TCP head-of-line blocking for lower latency - Independent partial updates gracefully handle packet loss - Delta encoding dramatically reduces snake body size Comprehensive Testing: - 46 tests total, all passing (100% success rate) - 15 UDP protocol tests (sequence wrapping, packet parsing, compression) - 20 binary codec tests (encoding, delta compression, strings, varint) - 11 partial update tests (splitting, reassembly, packet loss resilience) Files Added: - src/shared/binary_codec.py: Extensible binary serialization - src/shared/udp_protocol.py: UDP packet handling with sequence numbers - src/server/udp_handler.py: Async UDP server - src/server/partial_update.py: State splitting logic - src/client/udp_client.py: Desktop UDP client with TCP fallback - src/client/partial_state_tracker.py: Client-side reassembly - web/binary_codec.js: JavaScript binary codec - web/partial_state_tracker.js: JavaScript reassembly - web/webrtc_transport.js: WebRTC transport (ready for future use) - tests/test_udp_protocol.py: UDP protocol tests - tests/test_binary_codec.py: Binary codec tests - tests/test_partial_updates.py: Partial update tests 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
Multiplayer Snake Game
A network multiplayer Snake game built with Python, asyncio, and pygame.
Features
- Real-time multiplayer gameplay with client-server architecture
- Web client - Play in your browser without installing anything!
- Desktop client - Native pygame client for local play
- Automatic server discovery using multicast (zero-configuration LAN play)
- Dual-protocol support - TCP for desktop, WebSocket for web
- Support for multiple players simultaneously
- Classic Snake gameplay with collision detection
- Color-coded snakes for each player
- Score tracking and win conditions
Setup
# Create and activate virtual environment
python -m venv venv
source venv/bin/activate # On Windows: venv\Scripts\activate
# Install dependencies
pip install -r requirements.txt
# For development
pip install -r requirements-dev.txt
Running the Game
Web Client (Easiest!)
-
Start the server:
python run_server.py --name "My Game" -
Open your browser and navigate to:
http://localhost:8000 -
Enter your name and click Connect. The WebSocket URL is auto-detected!
-
Play! Multiple players can join from different browsers/devices.
Desktop Client (Pygame)
-
Start the server (if not already running):
python run_server.py -
Start pygame clients (in separate terminals):
python run_client.py --name Alice # Auto-discovers the server on your network
Mixed Play
Web and desktop clients can play together! The server supports both protocols simultaneously:
- Desktop clients connect via TCP (port 8888)
- Web clients connect via WebSocket (port 8889)
Manual Connection
# Server with all options
python run_server.py --host 0.0.0.0 --port 8888 --ws-port 8889 --name "Game Room"
# Desktop client (direct connection)
python run_client.py 192.168.1.100 --port 8888 --name Bob
# Web client: enter ws://192.168.1.100:8889 in the browser
Server Options
python run_server.py --help
# Network
# --host HOST Host address to bind to (default: localhost)
# --port PORT TCP port for desktop clients (default: 8888)
# --ws-port PORT WebSocket port for web clients (default: 8889, 0 to disable)
# --http-port PORT HTTP server port (default: 8000, 0 to disable)
# --name NAME Server name for discovery (default: Snake Server)
# Features
# --no-discovery Disable multicast discovery beacon
# --no-websocket Disable WebSocket server (desktop only)
# --no-http Disable HTTP server (use external web server like nginx)
# --web-dir PATH Path to web files (default: web)
Production Deployment
For production with nginx or Apache:
# Run server without built-in HTTP server
python run_server.py --no-http --host 0.0.0.0
# nginx serves static files from web/ directory
# and proxies WebSocket connections to port 8889
See web/README.md for detailed nginx/Apache configuration.
Client Options
python run_client.py --help
# [host] Server host (omit to use auto-discovery)
# --port PORT Server port (default: 8888)
# --name NAME Your player name (default: Player)
# --discover Force discovery mode
Playing the Game
- Press SPACE to start the game (any player can start)
- Use arrow keys or WASD to control your snake
- Eat food to grow and score points
- Avoid walls and other snakes
Testing
pytest
pytest --cov=src --cov-report=html # With coverage
Project Structure
src/server/- Game server with authoritative game statesrc/client/- Game client with pygame renderingsrc/shared/- Shared code (models, protocol, constants)tests/- Unit tests
Description
Languages
Python
77.9%
JavaScript
18.9%
CSS
2%
HTML
1.2%