Yinsh is an abstract strategy board game for two players, created by Kris Burm. It's played on a hexagonal board, where players place rings of their color. The objective is to create rows of five markers of the same color, while removing rings to keep track of the score. Just visit yinsh.net to start playing.
I built this as a way to challenge myself, and create something complete yet minimal and intuitive - no accounts needed, just gameplay. Using minimal dependencies, I designed each part of the experience from the ground up: from drawing the board and UI elements to guide gameplay, to handling tricky scoring cases and building an adversarial AI. Starting with some working knowledge of Julia and JavaScript, I picked up everything else along the way.
- Play against the AI, or invite a friend
- For two-player games: get a game ID code and share it with your opponent
- Pick between random or manual rings setup
- Each player gets 5 rings
- On your turn: place a marker in one of your rings to activate it, then move that ring
- Rings can only move in straight lines
- Rings can't move over other rings
- Rings can move over markers, but must stop at the first empty slot right after
- Moving a ring over markers will flip all the markers they pass over - changing their color
- Form rows of 5 markers to score: remove the row and one of your rings to mark the score
- The first to remove 3 rings wins (or just 1 ring in quick mode)
- More details on the rules webpage from the game inventor
gameplay.mp4
- Frontend: JavaScript + Canvas + SolidJS
- Backend: Julia (including the adversarial AI, a minimax heuristic at depth-2)
- Deployment: Docker & NGiNX on a Hetzner VM + Cloudflare
- Dark mode
- Smarter adversarial AI
- Support for mobile/tablet
- User authentication & game history
- Add a join by invite link functionality
- Replay/navigate game history in client
- Add quick game option (first to score wins)
- Play with strangers / match-making / tournaments
- New end-game animations
Got any? Just open an issue on this repo!
- Sounds sourced from freesound (CC0)
- (some) icons sourced from SVGrepo (CC0)
- Julia repo
- Pluto.jl repo
- HTTP.jl repo
- JSON3.jl repo
- Solid JS repo
This work is open-source and licensed under CC BY-NC-SA 4.0 - commercial use is not allowed.