diff --git a/img.png b/img.png new file mode 100644 index 0000000..26b9358 Binary files /dev/null and b/img.png differ diff --git a/readme.md b/readme.md new file mode 100644 index 0000000..0eff491 --- /dev/null +++ b/readme.md @@ -0,0 +1,98 @@ +# cppsnek - A Simple Snake Game in C++ with SFML + +![Snake Game Screenshot](img.png) + +Snake in C++17 ; uses SFML ; the snake is on fucking crack ; it moves like a fucking mig21 + +## Features + +- Classic Snake gameplay with grid-based movement +- Score tracking and milestone celebrations +- Programmatically generated sound effects (no external audio files needed) +- Simple pixel-art style graphics +- Responsive controls (WASD or arrow keys) +- Adjustable game speed that increases with score +- Visual grid overlay +- Pause/resume functionality (Space key) + +## Technical Details + +- **Language**: C++17 +- **Libraries**: + - SFML 2.5+ (Graphics, Window, System, Audio modules) +- **Pattern**: Object-oriented design with separate classes for game logic, rendering, and sound +- **Notable Techniques**: + - Programmatic sound generation + - Pixel pattern-based sprite creation + - Vertex arrays for grid rendering + - State management for game flow + +## Building the Project + +### Requirements + +- CMake (version 3.10+) +- SFML development libraries (libsfml-graphics, libsfml-window, libsfml-system, libsfml-audio) +- C++17 compatible compiler + +### Build Steps + +```bash +mkdir build && cd build +cmake .. +make +``` + +### Running + +```bash +./cppsnek +``` + +## Controls + +- **W** - Move Up +- **A** - Move Left +- **S** - Move Down +- **D** - Move Right +- **Space** - Pause/Resume game + +## Code Structure + +``` +. +├── main.cpp # Main game implementation +├── CMakeLists.txt # Build configuration +└── README.md # This file +``` + +Key classes: +- `Game`: Main game loop and state management +- `SoundManager`: Handles all audio generation and playback +- `NumericSprite`: Creates sprites from numeric patterns +- `SnakeSegment`: Simple struct for snake body parts + +## Customization + +You can easily modify: +- Game speed by changing the `speed` initial value in `Game` constructor +- Grid appearance by modifying the `createGrid()` method +- Snake and fruit visuals by editing the pattern arrays +- Sound characteristics in the `SoundManager` class + +## Known Issues/Limitations + +- Sound generation is CPU-intensive during initialization +- No proper game menu or start screen +- High scores aren't persisted between sessions +- Theme song generation is currently commented out + +## Learning Objectives + +This project demonstrates: +1. SFML basics (window management, rendering, input handling) +2. Game loop implementation +3. Procedural audio generation +4. Simple collision detection +5. State management in games +6. Object-oriented game design \ No newline at end of file