0.3.0 • Published 2 years ago

tsgammon-core v0.3.0

Weekly downloads
-
License
Apache-2.0
Repository
github
Last release
2 years ago

tsgammon-core

A Backgammon library for Typescript, formerly developed as a part of tsgammon-ui

npm version tkshio

demo

$ npm install tsgammon-core
$ npm exec tsgammon-core -- -b

...
(snip)
...

red: Roll 54 Moves 23/Off

 tsgammon        Position ID: AAAATt4fAAAAAA

 +13-14-15-16-17-18------19-20-21-22-23-24-+   
 |                  |   |                  |OOO
 |                  |   |                  |OOO
 |                  |   |                  |OOO
 |                  |   |                  |OOO
 |                  |   |                  |OOO
^|                  |BAR|                  |   
 |                  |   | 7                |   
 |                  |   | X  X             |   
 |                  |   | X  X           X |   
 |                  |   | X  X           X |   
 |                  |   | X  X     X     X |   
 +12-11-10--9--8--7-------6--5--4--3--2--1-+   
Red wins 2 pt. by Gammon
Result: red 2 - white 0
$

usage

setup:

const node:BoardStateNode = boardStateNodeFromArray(
    [
        0, // your bar point
        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, // opponents bar point
    ],
    1,3 // dice
)
// or:
// = boardStateNode(boardState(),diceRoll(1,3))

list up moves:

const candidates: Move[][] = collectMoves(node)
    .filter(moves => !moves.isRedundant)
    .map(moves => moves.moves)

candidates.map(moves => console.log(moves.map(move=>formatMove(move))))

// [ '1/4', '1/2' ]
// [ '1/4', '4/5' ]
// [ '1/4', '17/18' ]
// [ '1/4', '19/20' ]
// ...

or list up as nodes:

// each node corresponds to the position after moves[n]
const nodes:BoardStateNodes[] = collectNodes(node)

// nodes[0] corresponds to moves[0] (=[1/4, 1/2])
const nodeAfterMove = nodes[0]

// turn board for next player
const nextBoardState = nodeAfterMove.board.revert()

// build node again, with roll(52)
const nextNodeToPlay = boardStateNode(nextBoardState,diceRoll(5,2))

test whether pieces on a point is moveble:

const nodeAfterMove14 = findMove(node, 1, false/* use larger pip first */)
// returns position after move [1/4]
console.log(nodeAfterMove14.hasValue) // true

const nodeAfterMove12 = findMove(node, 1, true/* use smaller pip first */)
// returns position after move [1/2]
console.log(nodeAfterMove12.hasValue) // true

const nodeAfterMove23 = findMove(node, 2, true)
// there is no piece on point[2], so you can't move it
console.log(nodeAfterMove23.hasValue) // false

use jgammon's evaluator:

import { simpleNNEngine, evaluate } from "tsgammon_core/engines/SimpleNNGammon"

// let SimpleNNGammon play
const nodeAfterMove = simpleNNEngine.checkerPlay(node)
console.log(formatMoves(nodeAfterMove.lastMoves()))

// [ '17/20', '19/20' ]

// show evaluation
console.log(evaluate(node.board))

// {
//  e: 0.013857996981876702,
//  myWin: 0.5195381529700068,
//  myGammon: 0.13486295689906583,
//  oppWin: 0.48047063702629805,
//  oppGammon: 0.16007247586089787
//}

License

Apache 2.0 license.