weiqi.js
weiqi.js
is an implementation of the board game Go. It provides
mechanisms for representing a board with black and white stones, as well as the
logic to actually play a game. The objects used in weiqi.js
are
persistent--methods often return entirely new instances instead of
mutating internal state.
Persistence and structural sharing offer a memory-efficient way to represent multiple states of the board simutaneously, a desirable trait for applications where you'd like to explore the history of the game (such as for review) or to explore possible future responses (such as for AI decision-making).
The library is available as an npm
package, and can be used in the
browser with tools like browserify. If you don't want to use browserify,
there is a pre-built file in the dist-browser
directory that you can include
in your browser-targeted projects right away. Access Weiqi
with the global
Weiqi
variable in this case.
Usage
Creating a game
var Weiqi = ;var game = Weiqi; // creates a game on a 9 x 9 boardgame = Weiqi; // creates a game on a 13 x 13 boardgame = Weiqi; // creates a game on a 19 x 19 board
Playing a game
var Weiqi = ;var game = Weiqi;game = Weiqi;game = Weiqi;game = Weiqi; // black passesgame = Weiqi; // white passes
Weiqi.play
and Weiqi.pass
each take a player identifier ('black'
or 'white'
). Weiqi.play
takes an additional zero-indexed array of size two that indicates the position to place a stone. Weiqi.play
will raise exceptions for the following situations:
- the game is already over (there have already been two consecutive passes)
- it is not currently the turn of the player who is attempting to play
- the move violates positional superko (at the end of any turn, the board cannot be in a state in which it has been previously).
Querying the game
get('currentPlayer')
returns either 'black'
or 'white'
.
> var Weiqi = ;> var game = Weiqi;> game;"o"
isOver
returns true iff there have been two consecutive passes.
> var Weiqi = ;> var game = Weiqi;> Weiqi;false> game = Weiqi;> Weiqi;false> game = Weiqi;> Weiqi;true
To compute the score of the game (using area score) pass a value of komi to areaScore()
. All stones are considered alive.
Weiqi; // compute area score given 7.5 komi