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>
Show human-readable player names instead of player IDs in both desktop
and web clients. Player names are now stored in the Snake model and
synchronized across all clients.
Changes:
- Added player_name field to Snake model
- Updated create_snake() to accept player_name parameter
- Desktop client shows "YOU:" or "PlayerName:"
- Web client shows "You (Name)" or "Name"
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Major gameplay changes:
- Snakes no longer die from collisions
- When blocked, snakes get "stuck" - head stays in place, tail shrinks by 1 per tick
- Snakes auto-unstick when obstacle clears (other snakes move/shrink away)
- Minimum snake length is 1 (head-only)
- Game runs continuously without rounds or game-over state
Color system:
- Each player gets a persistent color for their entire connection
- Colors assigned on join, rotate through available colors
- Color follows player even after disconnect/reconnect
- Works for both desktop and web clients
Display improvements:
- Show snake length instead of score
- Length accurately reflects current snake size
- Updates in real-time as snakes grow/shrink
Server fixes:
- Fixed HTTP server initialization issues
- Changed default host to 0.0.0.0 for network multiplayer
- Improved file serving with proper routing
Testing:
- Updated all collision tests for stuck mechanics
- Added tests for stuck/unstick behavior
- Added tests for color persistence
- All 12 tests passing
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
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>