Show HN: Zsweep – Play Minesweeper using only Vim motions
50 points
5 days ago
| 12 comments
| zsweep.com
| HN
QuadmasterXLII
2 hours ago
[-]
For reference, here are the supported motions:

    case '0': return { type: 'ZERO' };
    case '_': return { type: 'START_ROW' };

    // --- SEARCH ---
    case '/': return { type: 'START_SEARCH' };
    case 'n': return { type: 'NEXT_MATCH' };
    case 'N': return { type: 'PREV_MATCH' };

    // --- MOVEMENT (WASD Removed) ---
    case 'h': case 'ArrowLeft':  return { type: 'MOVE_CURSOR', dx: -1, dy: 0 };
    case 'j': case 'ArrowDown':  return { type: 'MOVE_CURSOR', dx: 0, dy: 1 };
    case 'k': case 'ArrowUp':    return { type: 'MOVE_CURSOR', dx: 0, dy: -1 };
    case 'l': case 'ArrowRight': return { type: 'MOVE_CURSOR', dx: 1, dy: 0 };
    
    // --- SKIPS ---
    case 'w': return { type: 'NEXT_UNREVEALED' };
    case 'b': return { type: 'PREV_UNREVEALED' };

    // --- ACTIONS ---
    case 'i': case 'Enter': return { type: 'REVEAL' };
    case ' ': return { type: 'SMART' };
    case 'f': return { type: 'FLAG' };
    
    // --- ADVANCED MOTIONS ---
    case '$': return { type: 'MOVE_CURSOR', dx: 999, dy: 0 };  
    case 'G': return { type: 'GO_BOTTOM' }; 
    case 'g': return { type: 'GO_TOP' };  
No macros or block select yet, still fun! probably for the best that /mine doesn't work yet
reply
oug-t
5 days ago
[-]
Hi HN,

I’m the creator of zsweep. It’s a keyboard-centric Minesweeper clone where you play entirely using Vim motions (h, j, k, l to move; w/b to skip words; etc.).

The Backstory: I wanted to build a project to get my hands dirty with Svelte 5 and the new Runes system. I also wanted a way to practice Vim muscle memory that wasn't just typing code.

Tech Stack:

Frontend: Svelte 5 (Runes) + SvelteKit

Styling: Tailwind CSS

State: Custom Finite State Machine (FSM) for the game logic

The Challenge: One of the hardest parts was getting the "chording" logic right (where you clear multiple squares at once) while keeping the keyboard navigation feeling instant and "vim-like."

It’s open source, so if you’re curious about how Svelte 5 handles game state, feel free to poke around the code: https://github.com/oug-t/zsweep

I’d love to hear your feedback on the controls or any edge cases you find!

reply
oug-t
5 days ago
[-]
reply
oug-t
5 days ago
[-]
also trying to add features with three.js for better visual impressions.
reply
johnhamlin
2 hours ago
[-]
Love games like this. I used Vim Snake to make the muscle memory for hjkl finally stick in my brain. (I wish you could disable the insert mode toggling -- it's cute but didn't help when I was trying to break the habit of moving my finger up to press W or Up Arrow and remember that everything is in a straight line.)

https://vimsnake.com

reply
unformedelta
3 hours ago
[-]
This was fun!

It would feel a little more intuitive if w/b worked on groups of unrevealed tiles instead of just moving 1 space when you were already on an unrevealed tile. i.e. unrevealed = words, revealed = spaces. That way, you could also use them to meaningfully navigate around unrevealed groups better than using h/l. I also found myself missing "e" to go to the end of a word, apparently I use it more often than "w".

I really appreciated the attention to detail though, I was delighted when I realized that gg/G/0/$ all worked as expected.

reply
TheGRS
2 hours ago
[-]
Very nice, only feedback I have rn is you should keep the board state displayed after you hit a mine. I like to look around the board to see what I missed after making a mistake.
reply
kej
4 hours ago
[-]
This is a fun idea and the implementation works pretty well.

The only complaint I have is that enter for clearing feels awkward in conjunction with hjkl movement; maybe add (d)elete and (f)lag as alternatives to enter and space to keep everything on the home row without requiring stretching?

reply
1313ed01
3 hours ago
[-]
It is common in traditional roguelikes to support vi keys as an alternative to arrow keys. I use that all the time when playing Brogue. Have a great vi keys muscle memory now thanks to that, but I use Emacs and only rarely vi, so it's not doing me much good.
reply
tcoff91
2 hours ago
[-]
Use EViL mode
reply
alejoar
2 hours ago
[-]
Remember to exclude vimium from the site!
reply
zahrevsky
3 hours ago
[-]
Too bad it doesn't display the keyboard on mobile :-(
reply
oug-t
5 days ago
[-]
reply
rajeshvar
4 hours ago
[-]
nice!
reply
sodacanner
2 hours ago
[-]
Very useful as someone who's trying to use Vim motions more often, thanks!
reply
lasgawe
3 hours ago
[-]
This is nice! love this
reply