Duck Chess adds one neutral piece to a chessboard. You make your move, then you put a duck on any empty square, and it blocks both players until somebody moves it again. It cannot be captured and belongs to nobody. Tim Paulden invented it in 2016; Chess.com made it an official variant in October 2022.

Nobody had put it on a xiangqi board, as far as I can find. Jim Aikin’s Eight-Stone Chess put movable neutral stones on a chessboard in 1999, which is the duck’s real ancestor, but it stays on the chess side. The Chinese variant whose name translates closest, 布雷象棋, turns out to be a mine-laying game where the pieces are hidden and yours, which is a different idea wearing similar clothes.

So I built it, and it was not a port.

Chess has one way to block. Xiangqi has four more.

In chess, blocking means one thing: stand on the square a piece wants, or in the line it would travel down. That is the whole mechanic, and the duck slots into it without asking any questions.

Xiangqi asks four more.

  • A horse has a leg. It moves one orthogonal step then one diagonal, and anything standing on that first step stops it. The leg is a real point on the board, not an abstraction.
  • An elephant has an eye, the midpoint of its two-step diagonal.
  • A cannon captures only by jumping over exactly one piece. That piece is called a screen, and it can be anybody’s.
  • The two generals bear on each other down any file with nothing in between.

Every one of those rules asks whether a point is occupied. The duck occupies. So the duck arrived with five jobs instead of one, and two of them had no obvious answer.

The horse one is a free win. In Duck Chess the duck cannot block a knight, because a knight has no path to block. Here it can, and it freezes the horse from a square the horse was never going to stand on. The duck is strictly stronger on this board than on the one it came from.

The cannon was a real choice

The cannon forced a decision Duck Chess never had to make, because chess has no capture that needs a platform.

I could have written the duck as a blocker that a cannon may not fire over. That is defensible: the duck is not a piece, it is not material, so why should it work as ammunition? It would also have made the duck a purely defensive object and the game much quieter.

I made it count as a screen, exactly like any piece. A rule that asks whether a point is occupied should get the same answer whatever is standing there, and inventing an exception because the object is unusual is how variants accumulate footnotes.

The consequence is the best thing in the game, and I did not see it coming. You place the duck at the end of your turn, so the screen you just built is your opponent’s to fire over and never yours. Duck placement can never be a cannon platform for yourself. It is a gift you are forced to give, every single turn.

The rule I kept after deleting the reason for it

Duck Chess has no check. You may leave your king attacked, move it onto an attacked square, and you win by capturing it outright rather than by mate. I kept that.

I also kept xiangqi’s rule that the two generals may never be left facing each other down an open file. That felt like the careful, respectful choice. A facing position looks wrong to anyone who plays xiangqi. It reads as a bug in the software rather than as a blunder by a player.

It was incoherent, and I only saw it when I stopped defending the rule long enough to ask what it was resting on.

Xiangqi’s prohibition is not a rule in its own right. The generals attack each other down an open file, which means leaving them facing is self-check, and self-check is the thing actually forbidden. I had deleted check and kept its consequence. The rule was still standing with nothing underneath it.

The fix was not to drop it but to promote it. The generals may now face, and a general may fly the length of an open file and capture the other one, which ends the game. That is exactly what Duck Chess does with kings: they may stand adjacent, and a king takes a king. I had the precedent in my hands the whole time.

The measurement that settled it: on a board where the generals share a file and the duck is the only thing between them, the old rule confined the duck to the 7 open points on that file out of 85 empty ones. A 92% confiscation of the shared piece, and nothing on the board announced it. Now all 85 are legal and 78 of them lose immediately. An invisible legality constraint became a visible blunder, which is what removing check had already done to every other attack in the game.

If you are designing a variant and you delete a rule, audit everything that was a consequence of it. A consequence keeps working after its cause is gone. It keeps passing its tests, too. It just stops meaning anything.

The square that restricts your opponent most is usually the one that loses

I wired up Fairy-Stockfish to play it, and the early duck placements looked lazy. They blocked nothing. They sat far from anything either side was doing.

I was sure this was an engine weakness, so I tried to fix it twice.

First attempt: more search on the duck. A turn here is a piece move and a duck placement, so the opening array offers 2,554 legal turns where xiangqi offers 44. I ran a two-stage search: full width for the piece move, then a re-search restricted to the ~58 turns sharing it, giving the duck decision roughly 44x the time per candidate. It picked a placement that removed zero opponent moves over one that removed two. No improvement at all.

Second attempt: steer it toward the most restrictive square. This one was actively harmful. Measured against the engine’s own choice across five positions, forcing the most restrictive duck point cost −15, −751, −583, +2 centipawns, and in the fifth position it walked into a forced loss.

Then I scored every legal duck placement in one opening position and the picture snapped into focus:

placement count avg eval
no screen given, hinders a horse or cannon 13 +17 cp
no screen given, inert 39 +8 cp
hands the opponent a cannon screen 6 −418 cp

Forty-six times more downside in giving away a screen than upside in hindering development. And the squares that restrict your opponent most are, overwhelmingly, the squares next to their pieces, which are exactly the squares that become platforms aimed at you.

The engine was not failing to find the useful square. It was declining to hand me a cannon, and then picking almost arbitrarily among the squares that were all equally fine. My “restrictiveness” metric was not a weak proxy for quality. It was close to an anti-proxy.

The engine has no idea where the duck is

There is a real limit underneath all of this, and it is not mine.

Fairy-Stockfish has no evaluation term for the duck at all, not in this variant and not in its own built-in Duck Chess. Its evaluate.cpp contains nothing about walls or ducks; the only duck knowledge anywhere in the engine is a move-ordering history keyed on the placement square. So the duck’s value reaches the search only through the search itself, and with a 2,554-wide root it cannot see far enough in a quiet position to tell two placements apart.

That is worth knowing if you are building on Fairy-Stockfish for a walling variant. You get correct rules and a strong piece-move player, and the wall half is unguided. Fixing it means a hand-written eval term or a trained net, which is a real project rather than a setting.

Play it

Duck Xiangqi on Mistboard: eight engine levels, or a friend. The rules page has the whole thing with diagrams, and there is a study of seven engine games if you want to watch it played first.

The thing I would tell anyone porting a variant across boards: the interesting work is never the mechanic you are moving. It is the three rules on the destination board that quietly assumed something the new piece breaks.