The Pushme-Pullyu (U) (gnu) captures pieces which are on its line of
movement, either just below the first square or right after the final
square. It cannot capture both, however.
- li.
- The Archer (A) (bow) captures by "shooting": it can remove any enemy
- piece P standing in its range, provided that
+ li
+ | The Archer (A) (bow) captures by "shooting": it can remove any enemy
+ | piece P standing in its range, provided that
ul
li P is standing at most two squares from the archer, or,
li.
a friendly piece is at a distance of two squares or less from P,
without obstacle between it and P.
- In both cases the archer must have a clear path until the target.
+ | In both cases the archer must have a clear path until the target.
li.
The Shield (S) protects all friendly pieces adjacent to it: they
cannot be captured. The shield cannot capture.
El "Pushme-Pullyu" (U) (ñu) captura las piezas que yacen en su línea
movimiento, ya sea justo antes del primer cuadro o justo después de la
casilla final. Sin embargo, no puede tomar ambos.
- li.
- El arquero (A) (arco) captura "disparando": puede suprimir cualquier
- pieza enemiga P qué está dentro del alcance, siempre que
+ li
+ | El arquero (A) (arco) captura "disparando": puede suprimir cualquier
+ | pieza enemiga P qué está dentro del alcance, siempre que
ul
li P está a dos casillas o menos del arquero, o
li.
una pieza amiga está a dos casillas o menos de P (en línea recta),
sin obstáculo entre ella y P.
- En ambos casos, el arquero debe tener un
- camino despejado hacia su objetivo.
+ | En ambos casos, el arquero debe tener un
+ | camino despejado hacia su objetivo.
li.
El Escudo (S) protege cualquier pieza amiga a su lado: estos no
puede ser capturado. El escudo no puede capturar.
Le "Pushme-Pullyu" (U) (gnou) capture les pièces se situant sur sa ligne
de déplacement, soit juste avant la première case soit juste après la
case finale. Il ne peut pas prendre les deux, ceci dit.
- li.
- L'Archer (A) (arc) capture en "tirant" : il peut supprimer n'importe
- quelle pièce ennemie P à sa portée, à condition que
+ li
+ | L'Archer (A) (arc) capture en "tirant" : il peut supprimer n'importe
+ | quelle pièce ennemie P à sa portée, à condition que
ul
li P se trouve à deux cases ou moins de l'archer, ou,
li.
une pièce amie est à deux cases ou moins de P (en ligne droite),
sans obstacle entre elle et P.
- Dans les deux cas l'archer doit avoir un chemin dégagé jusqu'à sa cible.
+ | Dans les deux cas l'archer doit avoir un chemin dégagé jusqu'à sa cible.
li.
Le Bouclier (S) protège toute pièce amie à côté de lui : celles-ci ne
peuvent être capturées. Le bouclier ne peut pas capturer.
const steps = V.steps[V.ROOK].concat(V.steps[V.BISHOP]);
const c = this.turn;
let moves = [];
- let atLeastOnePotentialKick = false;
+ let kicks = {};
for (let s of steps) {
const [i, j] = [x + s[0], y + s[1]];
if (
this.board[i][j] != V.EMPTY &&
this.getColor(i, j) == c
) {
- if (!atLeastOnePotentialKick) atLeastOnePotentialKick = true;
- Array.prototype.push.apply(moves, this.tryKickFrom([i, j]));
+ const kmoves = this.tryKickFrom([i, j]);
+ kmoves.forEach(km => {
+ const key = V.CoordsToSquare(km.start) + V.CoordsToSquare(km.end);
+ if (!kicks[km]) {
+ moves.push(km);
+ kicks[km] = true;
+ }
+ });
}
}
- if (atLeastOnePotentialKick) {
+ if (Object.keys(kicks).length > 0) {
// And, always add the "end" move. For computer, keep only one
outerLoop: for (let i=0; i < V.size.x; i++) {
for (let j=0; j < V.size.y; j++) {