# Tetris (Go + Raylib) A small, self‑contained Tetris clone written in Go using raylib‑go. It features classic gameplay (movement, rotation, line clearing, scoring), a simple menu and game‑over flow, pixel‑art tiles, and embedded audio — all shipped as a single binary via `go:embed`. ## Features - Classic Tetris gameplay with 7 tetrominoes - Next piece preview and line clearing with scoring - Keyboard controls for movement, rotation, and soft drop - Simple menu and game‑over screens via a tiny state machine - Embedded sprites, icon, SFX, and background music (no external files at runtime) ## Controls - Left / Right: Move piece - Up: Rotate clockwise - Down (hold): Soft drop (faster fall) - Enter: Select in menu, restart from game over - Q: Return to menu from game over ## Scoring Points are awarded per simultaneous line clear using: `score = L^2 * 100` where `L` is the number of lines cleared at once. - 1 line → 100 - 2 lines → 400 - 3 lines → 900 - 4 lines → 1600 ## Build and Run Prerequisites: - Go (as indicated in `go.mod`) - A working C toolchain (required by raylib‑go). On Linux you may need basic X11/ALSA dev packages. ### Build Using `make` ```sh make ``` Using go directly: ```sh go build tetris.go ``` ### Run ```sh ./tetris ``` ## Project Structure - `tetris.go`: Program entrypoint; initializes window, renderer, audio, and the state machine. - `assets/`: Embedded resources (sprites, icon, SFX, music) and a compact tile‑font mapping. - `engine/`: Lightweight helpers for audio, graphics, font/tile rendering, timing, and render context. - `game/`: Core gameplay (grid, shapes, collision, scoring) and state handlers for `menu`, `gameplay`, and `gameover`. ## Roadmap - [x] Line clear animations - [ ] Hard drop and ghost piece - [ ] Level/speed progression and pause - [ ] High score persistence - [ ] Custom key bindings