xiangqiground
Version:
77 lines (71 loc) • 1.66 kB
text/typescript
import { pos2key, invRanks } from './util.js';
import * as cg from './types.js';
export const initial: cg.FEN = 'rnbakabnr/9/1c5c1/p1p1p1p1p/9/9/P1P1P1P1P/1C5C1/9/RNBAKABNR';
const roles: { [letter: string]: cg.Role } = {
p: 'pawn',
r: 'chariot',
n: 'horse',
h: 'horse',
b: 'elephant',
e: 'elephant',
a: 'advisor',
k: 'king',
c: 'cannon',
};
const letters = {
pawn: 'p',
chariot: 'r',
horse: 'n',
elephant: 'b',
advisor: 'a',
king: 'k',
cannon: 'c',
};
export function read(fen: cg.FEN): cg.Pieces {
if (fen === 'start') fen = initial;
const pieces: cg.Pieces = new Map();
let row = 9,
col = 0;
for (const c of fen) {
switch (c) {
case ' ':
return pieces;
case '/':
--row;
if (row < 0) return pieces;
col = 0;
break;
default: {
const nb = c.charCodeAt(0);
if (nb < 58) col += nb - 48;
else {
const role = c.toLowerCase();
console.log(col, row);
pieces.set(pos2key([col, row]), {
role: roles[role],
color: c === role ? 'black' : 'white',
});
++col;
}
}
}
}
return pieces;
}
export function write(pieces: cg.Pieces): cg.FEN {
return invRanks
.map(y =>
cg.files
.map(x => {
const piece = pieces.get((x + y) as cg.Key);
if (piece) {
let p = letters[piece.role];
if (piece.color === 'white') p = p.toUpperCase();
return p;
} else return '1';
})
.join(''),
)
.join('/')
.replace(/1{2,}/g, s => s.length.toString());
}