tsgammon-core
Version:
A Backgammon library for Typescript, formerly developed as a part of tsgammon-ui
77 lines (76 loc) • 3.4 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.encodeFIBSBoardString = exports.initBoard = exports.DIRECTION = exports.COLOUR = exports.TURN = void 0;
var TURN;
(function (TURN) {
TURN[TURN["X"] = 0] = "X";
TURN[TURN["O"] = 1] = "O";
TURN[TURN["OVER"] = 2] = "OVER";
})(TURN = exports.TURN || (exports.TURN = {}));
var COLOUR;
(function (COLOUR) {
COLOUR[COLOUR["X"] = 0] = "X";
COLOUR[COLOUR["O"] = 1] = "O";
})(COLOUR = exports.COLOUR || (exports.COLOUR = {}));
var DIRECTION;
(function (DIRECTION) {
DIRECTION[DIRECTION["ASC"] = 0] = "ASC";
DIRECTION[DIRECTION["DESC"] = 1] = "DESC";
})(DIRECTION = exports.DIRECTION || (exports.DIRECTION = {}));
/**
* 既定値を補ってFIBSBoardを生成する
*
* @param board
* @returns
*/
function initBoard(board) {
return Object.assign({ player: 'You', opponent: 'opponent', matchLen: 9999, playerScore: 0, opponentScore: 0,
// prettier-ignore
pos: [
0,
-2, 0, 0, 0, 0, 5, 0, 3, 0, 0, 0, -5,
5, 0, 0, 0, -3, 0, -5, 0, 0, 0, 0, 2,
0,
], turn: TURN.OVER, dice1: 0, dice2: 0, cubeValue: 1, playerMayDouble: true, opponentMayDouble: true, wasDoubled: false, colour: COLOUR.X, direction: DIRECTION.DESC, home: 0, bar: 25, playerOnHome: 0, opponentOnHome: 0, canMove: 0, _forcedMove: false, _didCrawford: false, redoubles: 0 }, board);
}
exports.initBoard = initBoard;
/**
* FIBS形式の文字列を生成する
*
* http://www.fibs.com/fibs_interface.html#board_state
*
* @param board 局面
* @param player 自分の名前
* @param opponent 対戦相手の名前
* @returns
*/
function encodeFIBSBoardString(board) {
validate(board);
const score3 = `${board.matchLen}:${board.playerScore}:${board.opponentScore}`;
const boardPos26 = `${board.pos.join(':')}`;
const turn = board.turn === TURN.OVER ? 0 : board.turn === TURN.O ? 1 : -1;
const dice4 = board.turn === TURN.OVER
? '0:0:0:0'
: board.turn === TURN.O
? board.colour === COLOUR.O
? `${board.dice1}:${board.dice2}:0:0`
: `0:0:${board.dice1}:${board.dice2}`
: board.colour === COLOUR.X
? `${board.dice1}:${board.dice2}:0:0`
: `0:0:${board.dice1}:${board.dice2}`;
const cube4 = `${board.cubeValue}:${board.playerMayDouble ? 1 : 0}:${board.opponentMayDouble ? 1 : 0}:${board.wasDoubled ? 1 : 0}`;
const boardLayout4 = `${board.colour === COLOUR.O ? 1 : -1}:${board.direction === DIRECTION.ASC ? 1 : -1}:${board.home}:${board.bar}`;
const [playerOnTheBar, opponentOnTheBar] = (board.direction === DIRECTION.ASC
? [board.pos[0], board.pos[25]]
: [board.pos[25], board.pos[0]]).map(Math.abs);
const pieces4 = `${board.playerOnHome}:${board.opponentOnHome}:${playerOnTheBar}:${opponentOnTheBar}`;
const movable3 = `${board.canMove}:${board._forcedMove ? 0 : 0}:${board._didCrawford ? 0 : 0}`;
const redoubles1 = board.redoubles;
return `board:${board.player}:${board.opponent}:${score3}:${boardPos26}:${turn}:${dice4}:${cube4}:${boardLayout4}:${pieces4}:${movable3}:${redoubles1}`;
}
exports.encodeFIBSBoardString = encodeFIBSBoardString;
function validate(board) {
if (board.pos.length != 26) {
throw new Error('board length != 26, was:' + board.pos.length);
}
}