Hey HN! I'm sami, the creator of echo chess. This is the true story of diving way too deep into a rabbit hole of chess, ML, and puzzle design. Hope you enjoy the read.
Originally built this chess variant as a fun hack but it really escalated since then. It's a single-player puzzle game. You're playing white, there's no opponent, and you need to clear the board to win. Every time you capture a piece, you become the 'echo' of that piece.
There's also an 'endless' mode with infinite levels generated in real time and validated by ML to ensure solvability. Took forever to make it work but it now has 99% accuracy. You can play the 'classic' mode here: https://echochess.com/ and endless here: https://echochess.com/?endless
Hello and thank you for the neat article. I have not finished it yet (I'm still partway through the ML bit), so ignore me if this is explained somewhere, but as far as I can see you only considered "generate and test for solvability" approaches. But isn't there a direct way to generate puzzles by solving the board "backwards"? Start with a single white piece on the board. Then, pick a random predecessor of that state; either the piece moved there normally or it was a capture. In the first case just move the white piece back, in the second replace it with a matching black piece and place a new white piece in a spot that could have captured it. Do this a few times until you are satisfied with the number of black pieces.
The biggest issue I can see right now is matching up the starting piece with the previous puzzle's ending piece, but I feel that should be manageable with some heuristics and brute force. And one would have to test whether the puzzles generated like this are actually "random-looking" enough.
100% exactly. This is a very smart observation and is actually one of the main approaches I attempted first when tackling the creation of 'endless' mode. There are a few nuances and adjustments that would actually turn what you're suggesting into a somewhat viable approach, but I think in general you're on the right track with both the hypothesis and its limitations.
A lot of the early playtesting I did for 'endless' kept indicating, much to my initial dismay, that the continuity of the carryover white piece is pretty much essential. In hindsight, it kinda makes sense. Imagine playing Tetris or Temple Run but where every 30 sec you essentially start from scratch. I guess maybe that's why people are more likely to binge-watch a whole season of Breaking Bad back-to-back than a full season of Black Mirror?
If we didn't have that constraint for echo chess, we could've easily just saved the crowdsourced pre-labeled solvable levels into a big 'test bank' db, and randomly served one of them any time a player needs a new level to play. Think SAT/GRE questions that are all pre-curated beforehand but that get 'generated' at random for every participant.
Thankfully the ML classification approach I ended up going with completely sidesteps the carryover piece dilemma. It's like you said: you simply "generate [incl. carryover] and test for solvability". Plus it works, with 99%+ accuracy, and in real time. So I think we're good for a bit :)
Fun write up and interesting game that repurposes known mechanics. I paused reading to solve your first fictional example and ended up using the exact strategy that you explain in the next few paragraphs. I don't play chess, but your write up and simple rules made the strategy part really intuitive (for the simple example). Excellent nerd sniping!
Yes! So happy to hear this. One thing I was really aiming for with the echo chess gameplay design is the ability for anyone to pick up the game without any prior familiarity with chess or other strategy games, while also offering a pretty exciting challenge for chess GMs and strategy veterans.
The fact that you directly got the solution to that fictional example kinda proves the point that 'type 2' folks (as described in that section of the post) can actually be at a disadvantage compared to the newcomers given their preexisting intuitions and heuristics. Curious to know if you ended up solving some of the main levels in 'classic' mode too.
> I paused reading to solve your first fictional example and ended up using the exact strategy that you explain in the next few paragraphs.
I did too, and really feel like it's the most natural strategy, even for regular chess players. I'm interested if OP has any anecdotal evidence that chess players would try to solve it by a "forward" algorithm rather than "backward." Even a natural chess player would get that this is a puzzle.
I was not! Just checked it out, great to see other chess variants out there. This looks like a simple but fun ‘clear the board’ puzzle. Here are the main differences with echo chess as far as I can tell:
1) No echoing mechanism. In echo chess, if you capture a pawn, you become that pawn. That means the maze effectively changes at every capture. The post linked above has a thorough analysis (and visual examples) of the strategic implications and limitations of this simple twist, so I highly recommend checking it out.
2)Forced to capture at every move. Solitaire chess seems to require a capture at every move. While that may appear to be a more difficult setting at first sight, it can actually lead to a much lower search space complexity by heavily restraining the degrees of freedom. In small enough puzzle boards, backtracking can become trivial.
3) No white pieces, so no squads, and no sacrifices. In echo chess, it’s white against the world. In future levels (starting 9), you get a squad of white pieces to use. This quickly becomes a double-edged sword: your ally is also a blocker on your quest. Higher levels even require you to sacrifice an ally piece in your squad to solve the maze. This adds a whole new level of strategy and complexity to the game.
4) Endless mode with ML. The ‘endless’ mode of echo chess continuously serves procedurally generated chess mazes in real time that are guaranteed to be solvable (with 99%+ accuracy) every time you solve a prior one. You carry over your white piece and ending square as a starting position for the next level. This adds a tremendous amount of replayability, variability, and continuity for the game. It essentially becomes a strategic Tetris variant.
There are lots of other differences and nuances but I really think the post linked above does a better job analyzing them. If you’re an experienced solitaire chess player, I’d love to hear your thoughts on echo chess once you try it out!
Thanks for sharing this cool variant too. I’ll make sure to give it a try :)
Click and click support is coming soon! Is the board itself not fitting on the screen? If you don't mind, can you please share what device/os/browser you're on. Resizing is disabled by default on mobile.
What a fun game and awesome write up! I've been considering building my own card game variation and this encouraged me to dive in and do it. I loved your balance of engineering/product/marketing/game theory throughout the article. Given the success, have you tried to monetize it at all?
This was a lot of fun to read, really enjoyed the journey from game design to product design to ML. One thing I was hoping to ask was how come you felt the need to procedurally generate levels? I've often heard debates around whether content needs to be "hand-crafted" to be worth another human's time but curious to hear your take on this since it seems like you implemented both ends of the spectrum with endless and classic.
Also do you feel like you now have a general set of principles to procedurally generate levels that apply to games outside of echo chess? Puzzle games are great since they're well scoped for indie devs and I'd imagine a lot of would be puzzle designers would burn out before they create a few dozen-hundred levels.
> how come you felt the need to procedurally generate levels?
Three reasons:
(1) demand for new levels was too high - game traction exceeded my laziness threshold as a designer;
(2) puzzle lovers suffered from lack of replayability - game was effectively punishing core users who engage with it the most;
(3) designing a 'good' difficulty curve required me to quantify a level's difficulty objectively - anytime I design a puzzle or strategy game, I also try to design an algorithm that can solve it to get a general sense of how the different levels compare in difficulty;
(4) I tend to get obsessively curious about stuff - wasn't sure if it's feasible to have a 100% real-time procedural gen of chess mazes so I decided to do it to find out.
> I've often heard debates around whether content needs to be "hand-crafted" to be worth another human's time
LLM jokes aside, I think this is a great point and I'm not sure exactly what the right answer is here. I ended up keeping both Classic and Endless modes for this exact reason. If there's enough interest, I'll add a manual level generator for the community of 'humans' to submit their own hand-crafted creations for others to play.
> a general set of principles to procedurally generate levels that apply to games outside of echo chess?
Good question. I think it really comes down to this:
(a) can you formalize the concept of a 'level' and its components for your game in a way as to encode/decode every game state (at a minimum) easily and efficiently?
(b) can you parametrize this formalism in a way as to connect malleable randomizations to every meaningful component of a level to generate (hypothetical) infinite variability?
(c) do you have a confident way to make sure whatever generation of a 'level' you're churning out is as playable, achievable, and as fun as the manually crafted one? The fun part is the hardest one to automate. That's where I think you need a very strong grasp of what actually make your puzzle game fun. All the rest can likely be generalizable to other games.
> puzzle designers would burn out before they create a few dozen-hundred levels
I implemented a partial generator based on the idea in my previous comment. It was quite a fun challenge.
At each step it determines the reachable squares for the given piece, that are not occupied or block past moves, and chooses one at random, then it computes the shortest path to that square.
This procedure is repeated until there are no squares available.
Only pawns, knights and kings are supported so far.
If you do check it out, I'd be curious to hear your thoughts on the Linjat approach and the limitation around trivial solvability of gens without an optimizer step of some sort. Still unclear at this stage where the debate of ML vs deterministic solvers will land on this one, though there are already several insights discussed that can be meaningful for puzzle design in general.
Let me know if you end up expanding the code and/or going through the 'forward solver' tangent debate. Thankful for your efforts in taking a stab at this challenge!
Certainly, feel free to drop a comment here any time.
> separate controls of sounds (piece selection, piece placement) and music (the score)
Not planned for the current minimalist version but I think that’s a good idea for a settings menu.
> I love the music, but a bit frustrated with the sounds
Sorry to hear that. Out of curiosity, is it the capturing sound in particular you’re referring to, or do you feel the same about the (less frequent) other SFX ones? Would be great to understand a bit more too what aspect in particular of these sounds you find suboptimal (genre, volume, frequency, specific audio, etc.)
You're welcome here and it looks like a good submission and a great game! but this post also got a ton of bogus upvotes and quite a few bogus comments. Those things are quite against HN's rules - this is in both the site guidelines (https://news.ycombinator.com/newsguidelines.html) and FAQ (https://news.ycombinator.com/newsfaq.html), and we ban accounts that do it (I've banned 5 of them so far.)
Please make sure that you and/or your friends don't do this on HN in the future! The community here is hypervigilant about this kind of thing and will use unkind words like 'astroturfing' and 'spamming' and email us complaints when they see it.
Thank you so much for bringing this up! Still new to the community (long time lurker, first time commenter). I'm very thankful for your input and I'm glad you're enjoying the submission and the game :)
From my understanding, the earlier comments on this post were all existing players - but I may be mistaken. In any case, all duly noted for us new posters. Thank you for your help in keeping the HN community so awesome!
Really odd to recognize we have a hard problem, but one that's very well specified & maps cleanly onto solvers (e.g. minizinc) and instead say this should be solved with a laundry list of sklearn.
This is one of the magical spaces where there is always a solution, the board space isn't that big & shrinks as you go
It's even simpler than that. You can randomly generate a valid sequence of moves (i.e you are a pawn at a2, move to a3, become knight, move to ..., move to ..., become ..., ...), instead of the initial board state and that guarantees the puzzle is solvable. The only thing you need to watch out for is that you are not allowed to touch squares that appear in previous moves.
This actually isn't too hard to make a solver for. Especially in the single white piece case. I made a solver [0] that can solve level 8 (the hardest single white level) in less than 100 ms. I believe that it can solve every single white puzzle, but I haven't tested it thoroughly.
It works by reducing the state to currently alive pieces and the current white piece right after conversion. It computes the transversable squares and possible captures for each state and does a basic DFS. One neat trick I used is that for simple traversability, the queen and the king are the same piece.
Multiple white pieces makes the code significantly more complex, but it simply adds a little bit to the statespace.
Nice work! I had a similar idea and also wrote a little solver in Rust [1]. I chose the same benchmark puzzle as is in your code, and it solves in ~25 microseconds on my laptop (i7-1165G7).
I haven't optimized my approach at all or even run it under a profiler, but it uses SIMD-within-a-register for computing the "flood fill" of which squares a piece can move to, which is a nice efficiency boost. For the simplest example, if you have a bit-vector `v: u64` of positions that a pawn might be in, then `v << 8` is the vector that denotes where it might be after one step, and `((v & can_move::LEFT) << 7) | ((v & can_move::RIGHT) << 9)` denotes what it might be able to capture.
I think the `Stepper` implementations and the way they flow into the top-level `captures` function is a cool and powerful approach; I encourage taking a look if it sounds interesting to you.
This post has 5 astroturfed (flagged and dead) comments from accounts less than 2 hours older than this post all within 1 hour of this being posted, and all with only a single comment on their account. Hmmm...
Yes I got schooled by dang about this as a n00b in the community :') Long time lurker, first time commenter. See comment thread from dang above, he was super nice to explain to me all this stuff. Thank you all for being kind and welcoming.
+1 for keeping the web version usable on mobile. I don't need something that runs in the background and tracks which IP addresses my phone passes through with a carbon copy to facebook via their sdk or whatnot.
Great feedback, thanks for that! There's plans to support two taps soon. Same for an 'are you sure' button when giving up. The reason the button is there (aside from its psychological benefit to not give up in early playtesting) is that it allows players who get stumped at a certain level to save their high score to the leaderboard without finishing the game. As explained in the post linked above, puzzle games are, in some sense, different from arcade games in that you can never just die.
Which brings us to the next point: 'endless' mode handles the game over state with a countdown timer, ensuring a convergence toward an end game even in a (theoretically) infinite game mode. But that mode is purposefully designed to be more arcade-like and speedrunnable, versus 'classic' mode which is dedicated to strategic patient thinkers. If timing in games stresses you out, definitely feel free to stick to classic instead of endless mode. Many folks love the timing aspect, but if you've never been into things like blitz chess, it's totally understandable.
Thankfully, you'd be happy to hear that the scoring system is purposefully designed to minimize the impact of timing in classic mode for exactly that reason (check out the 'Scoring System' section in the post).
p.s. I'm surprised to hear drag and drop is giving you issues on your phone, sorry about that. Not sure any players have had that issue before. Do you mind sharing what device/os/browser you're using, and if you're accessing echochess.com in a fresh browser tab directly?
>As explained in the post linked above, puzzle games are, in some sense, different from arcade games in that you can never just die.
I didn't finish the post because it went straight into strategy tips before I had even had a chance to play!
Also personally I'm not really interested in arcade mechanics. I'm not interested in global leaderboards or whatever either. Just interested in playing puzzles in my own time on my own terms.
Your thing is very cool! I like the way it is so constrained it's often possible to plan 6-7 moves ahead without much effort.
>but if you've never been into things like blitz chess, it's totally understandable
I'm massively into blitz chess. But this is a puzzle thing, and for me, there is no need for a timer in a solo game.
> Do you mind sharing what device/os/browser you're using, and if you're accessing echochess.com in a fresh browser tab directly?
FF/Android. I didn't understand your second question.
Similar to them, I also noticed some weird issues on iOS where it would sometimes drag the page when moving pieces and, other times, prevent seeing either the top or bottom portion of the UI. I ended up moving to PC for that reason. I also recall not being able to type in a name for the score at the end (on iOS).
One other thing I noticed was that submitting a lower score (at least in endless) still overrides your old one. (My scores went 860.5k -> 314.7k -> 446.9k -> 136.7m, overriding every time.)
Just like you, I accidentally hit "give up" at one point by mistake. I actually found the music quite good.
In a somewhat similar vein, I found the endless mode to be a bit tiring, since you have to keep up the pace to maintain enough time. It could be nice to have a pause button for endless mode (or both modes). Of course, it would defeat the purpose if someone could just pause right after seeing each board, but I feel like having a pause button with some sort of multi-minute cooldown could be an interesting addition. For some people, this might defeat the purpose of endless mode, but it's just a thought!
I also ended up playing endless long enough to get a score that was too large; my score overlapped with my name on the leaderboard. (I reached level 157 with 136.7m score, then I let time run out due to my hands getting tired.)
Your outrageous high score is breaking the endless leaderboard UI! Well done :)
I get your point about the pausing concern. I've actually thought about that in past playtests and I think the long-term solution for these things is likely even more drastic: increasing the difficulty of the procedural gens incrementally more after X levels have passed. And/or capping the winnable time back from solving every consecutive level after the first Y. There are lots of interesting things that can be explored in this area - see the last section of the original echo chess writeup.
Awesome to hear you reached LEVEL 157 in one run! Curious if you got taken by the 'one more turn syndrome' [0] in that session, or if you had embarked on this run with a clear goal of surpassing 100,000,000?
And please make sure to ice those fingers. echo chess cannot be held liable for finger damage.
I'm not expressing an opinion on whether the music is good or not. I just really don't want (or expect) any music to play. It's particularly annoying when I play on my phone in a quiet moment, and suddenly music is blasting out. It doesn't seem to remember the setting.
Sami is brilliant. He demoed Echo Chess at a recent San Diego engineer event and everyone was blown away and asking tons of questions. A lot of love and intelligence went into building this game.
aside: i always hear about cool events like this after the fact.
i have tried to find sites that have listings of hacker/engineering/conference type events, but most of them are very spammy, or low signal. is there a good resource for finding these?
Yeah, you're right it can be tough. We started our own organization (https://sdx.community) centered around hackers/builders because it felt like it was missing, exactly as you described!
We share on Twitter, Luma, LinkedIn, and try to get other community groups to amplify, but there's a lot of noise out there, so we likely miss a lot of cool people.
Sometimes you get lucky and there's a good community slack/discord (for example the San Diego Startups slack) where you'll see most events posted. Otherwise, startups that are hiring engineers tend to sponsor and share events. Beyond that you have to just find out from other hackers where they're speaking or joining something.
Got addicted to this game over the summer. Fun twist on chess puzzles and the upper levels get increasingly sophisticated. I think I got stuck on Level 13.
There doesn't seem to be a way to both take the f2 king and the a1 pawn. The b6 bishop can't reach either. The d1 pawn can only reach one or the other.
Most of the pictures are not displayed. (This seems to be because they are WebP format even though the file name is ".png".)
Do you have a full description of the rules, and do you have the FEN? I like to know the rules if I want to play game, and, it is not working so I made up my own, and if the levels is available then I can play game.
The below is I made up my own (I don't even know, if it is the real rules or not; but it is what I had understood):
; Echo Chess
(InputXY)
(Control
Input
(INIT $Cursor 1 1 0 0 Create =@cur)
(KEY IgnoreKey)
)
($Cursor
(Image "Cursor0" "Cursor1")
(DefaultImage ())
(Density -10)
(CREATE LOOP 0 1 50 Animate)
)
($Tile
(Image "Tile0" "Tile1")
(Density 10)
(INIT Loc + 1 band =Image)
(CLICK @cur ,ObjBelow #Move Loc ,Send . 1)
)
($White
(Image "P" "N" "B" "R" "Q" "K")
(CLICK @cur Loc ,MoveTo)
(#Move
fork
Image (case
(0 :pawn)
(1 :knight)
(2 :bishop)
(3 :rook)
(4 :queen)
(5 :king)
)
then
if
Arg1 Arg2 MoveTo .
Arg3 if
From ,Image =Image
From ,Destroy .
(=P $Black) lnot if WinLevel then
then
@cur Loc ,MoveTo .
then
)
(:pawn Yloc Arg2 1 + eq Xloc Arg1 Delta Arg3 eq land)
(:knight Xloc Arg1 Delta dup * Yloc Arg2 Delta dup * + 5 eq)
(:bishop Xloc Arg1 Delta Yloc Arg2 Delta eq if =:queen else 0 then)
(:rook Xloc Arg1 Delta Yloc Arg2 Delta land if 0 else =:queen then)
(:queen From Seek =%d Loc begin %d NewXY over over ObjTopAt dup From eq if . . ret then ,Class $Tile ne until . . 0)
(:king From Chebyshev 1 eq)
)
($Black
(Image "PB" "NB" "BB" "RB" "QB" "KB")
(CLICK @cur ,ObjBelow #Move Loc 1 ,SendEx . 1)
)
Are you referring to the images in the post or the actual game? Looks good on my side, might be the unexpected extra traffic. Sorry about that! In any case, you can try the game directly here: https://echochess.com/
The rules are really simple:
1) You are playing White, there's no opponent. You must capture all pieces to win.
2) You become the "echo" of any piece you capture. Captured a bishop? Become that bishop.
3) You can’t pass through red obstacles. Find the best move order to clear the board.
You can play it on any device, just drag and drop the white piece to move around. Let me know if you have any issues.
I can't "play it on any device". It doesn't work on my computer. (It is why I asked if there is some way to access the FEN, in case of it won't work and you want to play game on another computer, or by actual chess pieces on a board instead of on the computer, etc)
I read the rules like you wrote it here too, it is same thing, and I understand that. Nevertheless, it does not answer all of the questions (e.g. pawns promotion). From the example, it seems to not be check/mate, but I that short explanation won't explain everything. Capture all pieces? Do you mean capture the black pieces only? You cannot capture the white pieces, isn't it (otherwise there won't be any to capture it)? Is the code I wrote, the correct rules of the game?
Hey HN! I'm sami, the creator of echo chess. This is the true story of diving way too deep into a rabbit hole of chess, ML, and puzzle design. Hope you enjoy the read.
Originally built this chess variant as a fun hack but it really escalated since then. It's a single-player puzzle game. You're playing white, there's no opponent, and you need to clear the board to win. Every time you capture a piece, you become the 'echo' of that piece.
There's also an 'endless' mode with infinite levels generated in real time and validated by ML to ensure solvability. Took forever to make it work but it now has 99% accuracy. You can play the 'classic' mode here: https://echochess.com/ and endless here: https://echochess.com/?endless
Happy to answer any questions.
Hello and thank you for the neat article. I have not finished it yet (I'm still partway through the ML bit), so ignore me if this is explained somewhere, but as far as I can see you only considered "generate and test for solvability" approaches. But isn't there a direct way to generate puzzles by solving the board "backwards"? Start with a single white piece on the board. Then, pick a random predecessor of that state; either the piece moved there normally or it was a capture. In the first case just move the white piece back, in the second replace it with a matching black piece and place a new white piece in a spot that could have captured it. Do this a few times until you are satisfied with the number of black pieces.
The biggest issue I can see right now is matching up the starting piece with the previous puzzle's ending piece, but I feel that should be manageable with some heuristics and brute force. And one would have to test whether the puzzles generated like this are actually "random-looking" enough.
100% exactly. This is a very smart observation and is actually one of the main approaches I attempted first when tackling the creation of 'endless' mode. There are a few nuances and adjustments that would actually turn what you're suggesting into a somewhat viable approach, but I think in general you're on the right track with both the hypothesis and its limitations.
A lot of the early playtesting I did for 'endless' kept indicating, much to my initial dismay, that the continuity of the carryover white piece is pretty much essential. In hindsight, it kinda makes sense. Imagine playing Tetris or Temple Run but where every 30 sec you essentially start from scratch. I guess maybe that's why people are more likely to binge-watch a whole season of Breaking Bad back-to-back than a full season of Black Mirror?
If we didn't have that constraint for echo chess, we could've easily just saved the crowdsourced pre-labeled solvable levels into a big 'test bank' db, and randomly served one of them any time a player needs a new level to play. Think SAT/GRE questions that are all pre-curated beforehand but that get 'generated' at random for every participant.
Thankfully the ML classification approach I ended up going with completely sidesteps the carryover piece dilemma. It's like you said: you simply "generate [incl. carryover] and test for solvability". Plus it works, with 99%+ accuracy, and in real time. So I think we're good for a bit :)
6 replies →
Fun write up and interesting game that repurposes known mechanics. I paused reading to solve your first fictional example and ended up using the exact strategy that you explain in the next few paragraphs. I don't play chess, but your write up and simple rules made the strategy part really intuitive (for the simple example). Excellent nerd sniping!
Yes! So happy to hear this. One thing I was really aiming for with the echo chess gameplay design is the ability for anyone to pick up the game without any prior familiarity with chess or other strategy games, while also offering a pretty exciting challenge for chess GMs and strategy veterans.
The fact that you directly got the solution to that fictional example kinda proves the point that 'type 2' folks (as described in that section of the post) can actually be at a disadvantage compared to the newcomers given their preexisting intuitions and heuristics. Curious to know if you ended up solving some of the main levels in 'classic' mode too.
> I paused reading to solve your first fictional example and ended up using the exact strategy that you explain in the next few paragraphs.
I did too, and really feel like it's the most natural strategy, even for regular chess players. I'm interested if OP has any anecdotal evidence that chess players would try to solve it by a "forward" algorithm rather than "backward." Even a natural chess player would get that this is a puzzle.
1 reply →
Are you aware of Solitaire Chess?
https://www.thinkfun.com/products/brain-fitness-solitaire-ch...
I was not! Just checked it out, great to see other chess variants out there. This looks like a simple but fun ‘clear the board’ puzzle. Here are the main differences with echo chess as far as I can tell:
1) No echoing mechanism. In echo chess, if you capture a pawn, you become that pawn. That means the maze effectively changes at every capture. The post linked above has a thorough analysis (and visual examples) of the strategic implications and limitations of this simple twist, so I highly recommend checking it out.
2)Forced to capture at every move. Solitaire chess seems to require a capture at every move. While that may appear to be a more difficult setting at first sight, it can actually lead to a much lower search space complexity by heavily restraining the degrees of freedom. In small enough puzzle boards, backtracking can become trivial.
3) No white pieces, so no squads, and no sacrifices. In echo chess, it’s white against the world. In future levels (starting 9), you get a squad of white pieces to use. This quickly becomes a double-edged sword: your ally is also a blocker on your quest. Higher levels even require you to sacrifice an ally piece in your squad to solve the maze. This adds a whole new level of strategy and complexity to the game.
4) Endless mode with ML. The ‘endless’ mode of echo chess continuously serves procedurally generated chess mazes in real time that are guaranteed to be solvable (with 99%+ accuracy) every time you solve a prior one. You carry over your white piece and ending square as a starting position for the next level. This adds a tremendous amount of replayability, variability, and continuity for the game. It essentially becomes a strategic Tetris variant.
There are lots of other differences and nuances but I really think the post linked above does a better job analyzing them. If you’re an experienced solitaire chess player, I’d love to hear your thoughts on echo chess once you try it out!
Thanks for sharing this cool variant too. I’ll make sure to give it a try :)
1 reply →
can you please implement click&click controls, like on lichess?
hold&drag is almost unusable on the phone
(and/or you need to resize the website, as it doesn't fit the screen neither in phone- nor in desktop-mode of the browser)
Click and click support is coming soon! Is the board itself not fitting on the screen? If you don't mind, can you please share what device/os/browser you're on. Resizing is disabled by default on mobile.
3 replies →
What a fun game and awesome write up! I've been considering building my own card game variation and this encouraged me to dive in and do it. I loved your balance of engineering/product/marketing/game theory throughout the article. Given the success, have you tried to monetize it at all?
Do it! If you build that game, I'd love to check it out. No plans for monetization. Just enjoying the quest atm. Glad you're enjoying it so far.
This was a lot of fun to read, really enjoyed the journey from game design to product design to ML. One thing I was hoping to ask was how come you felt the need to procedurally generate levels? I've often heard debates around whether content needs to be "hand-crafted" to be worth another human's time but curious to hear your take on this since it seems like you implemented both ends of the spectrum with endless and classic.
Also do you feel like you now have a general set of principles to procedurally generate levels that apply to games outside of echo chess? Puzzle games are great since they're well scoped for indie devs and I'd imagine a lot of would be puzzle designers would burn out before they create a few dozen-hundred levels.
> how come you felt the need to procedurally generate levels?
Three reasons: (1) demand for new levels was too high - game traction exceeded my laziness threshold as a designer; (2) puzzle lovers suffered from lack of replayability - game was effectively punishing core users who engage with it the most; (3) designing a 'good' difficulty curve required me to quantify a level's difficulty objectively - anytime I design a puzzle or strategy game, I also try to design an algorithm that can solve it to get a general sense of how the different levels compare in difficulty; (4) I tend to get obsessively curious about stuff - wasn't sure if it's feasible to have a 100% real-time procedural gen of chess mazes so I decided to do it to find out.
> I've often heard debates around whether content needs to be "hand-crafted" to be worth another human's time
LLM jokes aside, I think this is a great point and I'm not sure exactly what the right answer is here. I ended up keeping both Classic and Endless modes for this exact reason. If there's enough interest, I'll add a manual level generator for the community of 'humans' to submit their own hand-crafted creations for others to play.
> a general set of principles to procedurally generate levels that apply to games outside of echo chess?
Good question. I think it really comes down to this: (a) can you formalize the concept of a 'level' and its components for your game in a way as to encode/decode every game state (at a minimum) easily and efficiently? (b) can you parametrize this formalism in a way as to connect malleable randomizations to every meaningful component of a level to generate (hypothetical) infinite variability? (c) do you have a confident way to make sure whatever generation of a 'level' you're churning out is as playable, achievable, and as fun as the manually crafted one? The fun part is the hardest one to automate. That's where I think you need a very strong grasp of what actually make your puzzle game fun. All the rest can likely be generalizable to other games.
> puzzle designers would burn out before they create a few dozen-hundred levels
Tell me about it.
I implemented a partial generator based on the idea in my previous comment. It was quite a fun challenge.
At each step it determines the reachable squares for the given piece, that are not occupied or block past moves, and chooses one at random, then it computes the shortest path to that square. This procedure is repeated until there are no squares available.
Only pawns, knights and kings are supported so far.
https://gist.github.com/oessessnex/bc617095675da44f857216f98...
Great game btw :)
Glad you enjoyed the game - and the generator metagame. Thanks for pitching in and sharing your partial gen implementation!
> the reachable squares for the given piece, that are not occupied or block past moves
The last part is key. There's a similar discussion related to level generation here: https://news.ycombinator.com/item?id=37334186
If you do check it out, I'd be curious to hear your thoughts on the Linjat approach and the limitation around trivial solvability of gens without an optimizer step of some sort. Still unclear at this stage where the debate of ML vs deterministic solvers will land on this one, though there are already several insights discussed that can be meaningful for puzzle design in general.
Let me know if you end up expanding the code and/or going through the 'forward solver' tangent debate. Thankful for your efforts in taking a stab at this challenge!
I don't know if you still read this, but is there a chance to separate controls of sounds (piece selection, piece placement) and music (the score)?
I love the music, but a bit frustrated with the sounds
> I don’t know if you still read this
Certainly, feel free to drop a comment here any time.
> separate controls of sounds (piece selection, piece placement) and music (the score)
Not planned for the current minimalist version but I think that’s a good idea for a settings menu.
> I love the music, but a bit frustrated with the sounds
Sorry to hear that. Out of curiosity, is it the capturing sound in particular you’re referring to, or do you feel the same about the (less frequent) other SFX ones? Would be great to understand a bit more too what aspect in particular of these sounds you find suboptimal (genre, volume, frequency, specific audio, etc.)
2 replies →
It would be great to include these links prominently in the article, fairly high up,
Great point, thanks. Will update.
2 replies →
You're welcome here and it looks like a good submission and a great game! but this post also got a ton of bogus upvotes and quite a few bogus comments. Those things are quite against HN's rules - this is in both the site guidelines (https://news.ycombinator.com/newsguidelines.html) and FAQ (https://news.ycombinator.com/newsfaq.html), and we ban accounts that do it (I've banned 5 of them so far.)
Please make sure that you and/or your friends don't do this on HN in the future! The community here is hypervigilant about this kind of thing and will use unkind words like 'astroturfing' and 'spamming' and email us complaints when they see it.
By the way, how does the software calculate solicited votes? Does it omit upvotes from a user on the same IP as the story creator?
2 replies →
Thank you so much for bringing this up! Still new to the community (long time lurker, first time commenter). I'm very thankful for your input and I'm glad you're enjoying the submission and the game :)
From my understanding, the earlier comments on this post were all existing players - but I may be mistaken. In any case, all duly noted for us new posters. Thank you for your help in keeping the HN community so awesome!
Really odd to recognize we have a hard problem, but one that's very well specified & maps cleanly onto solvers (e.g. minizinc) and instead say this should be solved with a laundry list of sklearn.
This is one of the magical spaces where there is always a solution, the board space isn't that big & shrinks as you go
It's even simpler than that. You can randomly generate a valid sequence of moves (i.e you are a pawn at a2, move to a3, become knight, move to ..., move to ..., become ..., ...), instead of the initial board state and that guarantees the puzzle is solvable. The only thing you need to watch out for is that you are not allowed to touch squares that appear in previous moves.
This actually isn't too hard to make a solver for. Especially in the single white piece case. I made a solver [0] that can solve level 8 (the hardest single white level) in less than 100 ms. I believe that it can solve every single white puzzle, but I haven't tested it thoroughly.
It works by reducing the state to currently alive pieces and the current white piece right after conversion. It computes the transversable squares and possible captures for each state and does a basic DFS. One neat trick I used is that for simple traversability, the queen and the king are the same piece.
Multiple white pieces makes the code significantly more complex, but it simply adds a little bit to the statespace.
[0]: https://github.com/TheThirdOne/assorted-examples/blob/master...
Nice work! I had a similar idea and also wrote a little solver in Rust [1]. I chose the same benchmark puzzle as is in your code, and it solves in ~25 microseconds on my laptop (i7-1165G7).
I haven't optimized my approach at all or even run it under a profiler, but it uses SIMD-within-a-register for computing the "flood fill" of which squares a piece can move to, which is a nice efficiency boost. For the simplest example, if you have a bit-vector `v: u64` of positions that a pawn might be in, then `v << 8` is the vector that denotes where it might be after one step, and `((v & can_move::LEFT) << 7) | ((v & can_move::RIGHT) << 9)` denotes what it might be able to capture.
I think the `Stepper` implementations and the way they flow into the top-level `captures` function is a cool and powerful approach; I encourage taking a look if it sounds interesting to you.
[1]: https://github.com/wchargin/echo-chess
Direct link to source:
https://github.com/wchargin/echo-chess/blob/main/src/main.rs
1 reply →
This post has 5 astroturfed (flagged and dead) comments from accounts less than 2 hours older than this post all within 1 hour of this being posted, and all with only a single comment on their account. Hmmm...
Yes I got schooled by dang about this as a n00b in the community :') Long time lurker, first time commenter. See comment thread from dang above, he was super nice to explain to me all this stuff. Thank you all for being kind and welcoming.
Best post ever? The level of details is beautiful. Any plan in releasing an Android app? Thank you
Possibly soon. Should work fine on android mobile web in the meantime. Let me know if you run into any issues.
+1 for keeping the web version usable on mobile. I don't need something that runs in the background and tracks which IP addresses my phone passes through with a carbon copy to facebook via their sdk or whatnot.
1 reply →
A few comments on the game:
- would be good to support two tap moves like on lichens rather than only drag and drop
- drag and drop seems really buggy on my phone. Often had to repeat my move.
- accidentally clicked give up instead of try again, then my game was over? Not really sure why there is a give up button at all.
- the timer just adds stress instead of fun, for me.
- hated the music being on by default
- imho the obstacles should be symbols, not just a different square colour. I had trouble seeing them.
Great feedback, thanks for that! There's plans to support two taps soon. Same for an 'are you sure' button when giving up. The reason the button is there (aside from its psychological benefit to not give up in early playtesting) is that it allows players who get stumped at a certain level to save their high score to the leaderboard without finishing the game. As explained in the post linked above, puzzle games are, in some sense, different from arcade games in that you can never just die.
Which brings us to the next point: 'endless' mode handles the game over state with a countdown timer, ensuring a convergence toward an end game even in a (theoretically) infinite game mode. But that mode is purposefully designed to be more arcade-like and speedrunnable, versus 'classic' mode which is dedicated to strategic patient thinkers. If timing in games stresses you out, definitely feel free to stick to classic instead of endless mode. Many folks love the timing aspect, but if you've never been into things like blitz chess, it's totally understandable.
Thankfully, you'd be happy to hear that the scoring system is purposefully designed to minimize the impact of timing in classic mode for exactly that reason (check out the 'Scoring System' section in the post).
p.s. I'm surprised to hear drag and drop is giving you issues on your phone, sorry about that. Not sure any players have had that issue before. Do you mind sharing what device/os/browser you're using, and if you're accessing echochess.com in a fresh browser tab directly?
>As explained in the post linked above, puzzle games are, in some sense, different from arcade games in that you can never just die.
I didn't finish the post because it went straight into strategy tips before I had even had a chance to play!
Also personally I'm not really interested in arcade mechanics. I'm not interested in global leaderboards or whatever either. Just interested in playing puzzles in my own time on my own terms.
Your thing is very cool! I like the way it is so constrained it's often possible to plan 6-7 moves ahead without much effort.
>but if you've never been into things like blitz chess, it's totally understandable
I'm massively into blitz chess. But this is a puzzle thing, and for me, there is no need for a timer in a solo game.
> Do you mind sharing what device/os/browser you're using, and if you're accessing echochess.com in a fresh browser tab directly?
FF/Android. I didn't understand your second question.
8 replies →
Similar to them, I also noticed some weird issues on iOS where it would sometimes drag the page when moving pieces and, other times, prevent seeing either the top or bottom portion of the UI. I ended up moving to PC for that reason. I also recall not being able to type in a name for the score at the end (on iOS).
One other thing I noticed was that submitting a lower score (at least in endless) still overrides your old one. (My scores went 860.5k -> 314.7k -> 446.9k -> 136.7m, overriding every time.)
3 replies →
> it allows players who get stumped at a certain level to save their high score to the leaderboard without finishing the game
Have you considered saving the high score after every level automatically?
1 reply →
Just like you, I accidentally hit "give up" at one point by mistake. I actually found the music quite good.
In a somewhat similar vein, I found the endless mode to be a bit tiring, since you have to keep up the pace to maintain enough time. It could be nice to have a pause button for endless mode (or both modes). Of course, it would defeat the purpose if someone could just pause right after seeing each board, but I feel like having a pause button with some sort of multi-minute cooldown could be an interesting addition. For some people, this might defeat the purpose of endless mode, but it's just a thought!
I also ended up playing endless long enough to get a score that was too large; my score overlapped with my name on the leaderboard. (I reached level 157 with 136.7m score, then I let time run out due to my hands getting tired.)
Your outrageous high score is breaking the endless leaderboard UI! Well done :)
I get your point about the pausing concern. I've actually thought about that in past playtests and I think the long-term solution for these things is likely even more drastic: increasing the difficulty of the procedural gens incrementally more after X levels have passed. And/or capping the winnable time back from solving every consecutive level after the first Y. There are lots of interesting things that can be explored in this area - see the last section of the original echo chess writeup.
Awesome to hear you reached LEVEL 157 in one run! Curious if you got taken by the 'one more turn syndrome' [0] in that session, or if you had embarked on this run with a clear goal of surpassing 100,000,000?
And please make sure to ice those fingers. echo chess cannot be held liable for finger damage.
[0]: https://en.wikipedia.org/wiki/Civilization_(series)
2 replies →
> I actually found the music quite good.
I'm not expressing an opinion on whether the music is good or not. I just really don't want (or expect) any music to play. It's particularly annoying when I play on my phone in a quiet moment, and suddenly music is blasting out. It doesn't seem to remember the setting.
7 replies →
what's wrong with music on by default?
flash games operated like that from the beginning till the end
I guess it's normal in the arcade world, but not in the puzzle world.
1 reply →
Sami is brilliant. He demoed Echo Chess at a recent San Diego engineer event and everyone was blown away and asking tons of questions. A lot of love and intelligence went into building this game.
aside: i always hear about cool events like this after the fact.
i have tried to find sites that have listings of hacker/engineering/conference type events, but most of them are very spammy, or low signal. is there a good resource for finding these?
Yeah, you're right it can be tough. We started our own organization (https://sdx.community) centered around hackers/builders because it felt like it was missing, exactly as you described!
We share on Twitter, Luma, LinkedIn, and try to get other community groups to amplify, but there's a lot of noise out there, so we likely miss a lot of cool people.
Sometimes you get lucky and there's a good community slack/discord (for example the San Diego Startups slack) where you'll see most events posted. Otherwise, startups that are hiring engineers tend to sponsor and share events. Beyond that you have to just find out from other hackers where they're speaking or joining something.
Where do you live?
1 reply →
thank you for the support, glad you're enjoying echo chess. it's been a ton of fun building a chess variant with ML. happy to answer any questions.
Got addicted to this game over the summer. Fun twist on chess puzzles and the upper levels get increasingly sophisticated. I think I got stuck on Level 13.
Glad you're enjoying it. Making it to Level 13 is pretty awesome. I remember one of the early playtesters calling it 'the level from hell'.
Are you sure that level 13 is possible?
There doesn't seem to be a way to both take the f2 king and the a1 pawn. The b6 bishop can't reach either. The d1 pawn can only reach one or the other.
6 replies →
Most of the pictures are not displayed. (This seems to be because they are WebP format even though the file name is ".png".)
Do you have a full description of the rules, and do you have the FEN? I like to know the rules if I want to play game, and, it is not working so I made up my own, and if the levels is available then I can play game.
The below is I made up my own (I don't even know, if it is the real rules or not; but it is what I had understood):
Are you referring to the images in the post or the actual game? Looks good on my side, might be the unexpected extra traffic. Sorry about that! In any case, you can try the game directly here: https://echochess.com/
The rules are really simple:
1) You are playing White, there's no opponent. You must capture all pieces to win.
2) You become the "echo" of any piece you capture. Captured a bishop? Become that bishop.
3) You can’t pass through red obstacles. Find the best move order to clear the board.
You can play it on any device, just drag and drop the white piece to move around. Let me know if you have any issues.
p.s. love that you just made your own!
I can't "play it on any device". It doesn't work on my computer. (It is why I asked if there is some way to access the FEN, in case of it won't work and you want to play game on another computer, or by actual chess pieces on a board instead of on the computer, etc)
I read the rules like you wrote it here too, it is same thing, and I understand that. Nevertheless, it does not answer all of the questions (e.g. pawns promotion). From the example, it seems to not be check/mate, but I that short explanation won't explain everything. Capture all pieces? Do you mean capture the black pieces only? You cannot capture the white pieces, isn't it (otherwise there won't be any to capture it)? Is the code I wrote, the correct rules of the game?
3 replies →
Love this game!!
Glad you're enjoying it. What level did you reach?
This could be a good coffee table book.
Down to make a coffee table version if you know a good print shop. Can send you a copy for free.
[flagged]
[flagged]
[flagged]
[flagged]
[flagged]