Documentation
¶
Overview ¶
Package chess provides a chess engine implementation using bitboard representation.
The package uses bitboards (64-bit integers) to represent the chess board state, where each bit corresponds to a square on the board. The squares are numbered from 0 to 63, starting from the most significant bit (A1) to the least significant bit (H8):
8 | 56 57 58 59 60 61 62 63
7 | 48 49 50 51 52 53 54 55
6 | 40 41 42 43 44 45 46 47
5 | 32 33 34 35 36 37 38 39
4 | 24 25 26 27 28 29 30 31
3 | 16 17 18 19 20 21 22 23
2 | 08 09 10 11 12 13 14 15
1 | 00 01 02 03 04 05 06 07
-------------------------
A B C D E F G H
A bit value of 1 indicates the presence of a piece, while 0 indicates an empty square.
Usage:
// Create a new bitboard with pieces on A1 and E4
squares := map[Square]bool{
NewSquare(FileA, Rank1): true,
NewSquare(FileE, Rank4): true,
}
bb := newBitboard(squares)
// Check if E4 is occupied
if bb.Occupied(NewSquare(FileE, Rank4)) {
fmt.Println("E4 is occupied")
}
// Print board representation
fmt.Println(bb.Draw())
Package chess is a go library designed to accomplish the following:
- chess game / turn management
- move validation
- PGN encoding / decoding
- FEN encoding / decoding
Using Moves
game := chess.NewGame() moves := game.ValidMoves() game.Move(moves[0])
Using Algebraic Notation
game := chess.NewGame()
game.MoveStr("e4")
Using PGN
pgn, _ := chess.PGN(pgnReader) game := chess.NewGame(pgn)
Using FEN
fen, _ := chess.FEN("rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1")
game := chess.NewGame(fen)
Random Game
package main
import (
"fmt"
"math/rand"
"github.com/corentings/chess/v2"
)
func main() {
game := chess.NewGame()
// generate moves until game is over
for game.Outcome() == chess.NoOutcome {
// select a random move
moves := game.ValidMoves()
move := moves[rand.Intn(len(moves))]
game.Move(move)
}
// print outcome and game PGN
fmt.Println(game.Position().Board().Draw())
fmt.Printf("Game completed. %s by %s.\n", game.Outcome(), game.Method())
fmt.Println(game.String())
}
Package chess implements a chess game engine that manages move generation, position analysis, and game state validation. The engine uses bitboard operations and lookup tables for efficient move generation and position analysis. Move generation includes standard piece moves, captures, castling, en passant, and pawn promotions. Example usage:
// Create a position
pos := NewPosition()
// Calculate legal moves for current position
eng := engine{}
moves := eng.CalcMoves(pos, false)
// Check game status
status := eng.Status(pos)
if status == Checkmate {
fmt.Println("Game Over - Checkmate")
}
Package chess provides a complete chess game implementation with support for move validation, game tree management, and standard chess formats (PGN, FEN). The package manages complete chess games including move history, variations, and game outcomes. It supports standard chess rules including all special moves (castling, en passant, promotion) and automatic draw detection. Example usage:
// Create new game
game := NewGame()
// Make moves
game.PushMove("e4", nil)
game.PushMove("e5", nil)
// Check game status
if game.Outcome() != NoOutcome {
fmt.Printf("Game ended: %s by %s\n", game.Outcome(), game.Method())
}
Package chess provides PGN lexical analysis through a lexer that converts PGN text into a stream of tokens. The lexer handles all standard PGN notation including moves, annotations, comments, and game metadata. The lexer provides token-by-token processing of PGN content with proper handling of chess-specific notation and PGN syntax rules. Example usage:
// Create new lexer
lexer := NewLexer("[Event \"World Championship\"] 1. e4 e5 {Opening}")
// Process tokens
for {
token := lexer.NextToken()
if token.Type == EOF {
break
}
// Process token
}
Package chess provides PGN (Portable Game Notation) parsing functionality, supporting standard chess notation including moves, variations, comments, annotations, and game metadata. Example usage:
// Create parser from tokens tokens := TokenizeGame(game) parser := NewParser(tokens) // Parse complete game game, err := parser.Parse()
Package chess provides position representation and manipulation for chess games. The package implements complete position tracking including piece placement, castling rights, en passant squares, and move counts. It supports standard chess formats (FEN) and provides methods for position analysis and move validation. Example usage:
// Create starting position pos := StartingPosition() // Check valid moves moves := pos.ValidMoves() // Update position with move newPos := pos.Update(move) // Get FEN string fen := pos.String()
Index ¶
- Variables
- func FEN(fen string) (func(*Game), error)
- func GetPolyglotHashBytes(index int) []byte
- func GetPolyglotHashes() []string
- func IgnoreFivefoldRepetitionDraw() func(*Game)
- func IgnoreInsufficientMaterialDraw() func(*Game)
- func IgnoreSeventyFiveMoveRuleDraw() func(*Game)
- func MoveToPolyglot(m Move) uint16
- func PGN(r io.Reader) (func(*Game), error)
- func ValidateSAN(s string) error
- func ZobristHashToUint64(hash string) uint64
- type AlgebraicNotation
- type Board
- func (b *Board) Draw() string
- func (b *Board) Draw2(perspective Color, darkMode bool) string
- func (b *Board) Flip(fd FlipDirection) *Board
- func (b *Board) MarshalBinary() ([]byte, error)
- func (b *Board) MarshalText() ([]byte, error)
- func (b *Board) Piece(sq Square) Piece
- func (b *Board) Rotate() *Board
- func (b *Board) SquareMap() map[Square]Piece
- func (b *Board) String() string
- func (b *Board) Transpose() *Board
- func (b *Board) UnmarshalBinary(data []byte) error
- func (b *Board) UnmarshalText(text []byte) error
- type BookSource
- type BytesBookSource
- type CastleRights
- type Color
- type Decoder
- type Encoder
- type File
- type FileBookSource
- type FlipDirection
- type Game
- func (g *Game) AddTagPair(k, v string) bool
- func (g *Game) AddVariation(parent *Move, newMove *Move)
- func (g *Game) Clone() *Game
- func (g *Game) Comments() [][]string
- func (g *Game) CurrentPosition() *Position
- func (g *Game) Draw(method Method) error
- func (g *Game) EligibleDraws() []Method
- func (g *Game) FEN() string
- func (g *Game) GetRootMove() *Move
- func (g *Game) GetTagPair(k string) string
- func (g *Game) GoBack() bool
- func (g *Game) GoForward() bool
- func (g *Game) IsAtEnd() bool
- func (g *Game) IsAtStart() bool
- func (g *Game) MarshalText() ([]byte, error)
- func (g *Game) Method() Method
- func (g *Game) Move(move *Move, options *PushMoveOptions) error
- func (g *Game) Moves() []*Move
- func (g *Game) NavigateToMainLine()
- func (g *Game) Outcome() Outcome
- func (g *Game) Position() *Position
- func (g *Game) Positions() []*Position
- func (g *Game) PushMove(algebraicMove string, options *PushMoveOptions) errordeprecated
- func (g *Game) PushNotationMove(moveStr string, notation Notation, options *PushMoveOptions) error
- func (g *Game) RemoveTagPair(k string) bool
- func (g *Game) Resign(color Color)
- func (g *Game) Split() []*Game
- func (g *Game) String() string
- func (g *Game) UnmarshalText(text []byte) error
- func (g *Game) UnsafeMove(move *Move, options *PushMoveOptions) error
- func (g *Game) UnsafePushNotationMove(moveStr string, notation Notation, options *PushMoveOptions) error
- func (g *Game) ValidMoves() []Move
- func (g *Game) Variations(move *Move) []*Move
- type GameScanned
- type Hash
- type Lexer
- type LongAlgebraicNotation
- type Method
- type Move
- func (m *Move) AddComment(comment string)
- func (m *Move) AddTag(tag MoveTag)
- func (m *Move) Children() []*Move
- func (m *Move) Clone() *Move
- func (m *Move) Comments() string
- func (m *Move) FullMoveNumber() int
- func (m *Move) GetCommand(key string) (string, bool)
- func (m *Move) HasTag(tag MoveTag) bool
- func (m *Move) NAG() string
- func (m *Move) Number() int
- func (m *Move) Parent() *Move
- func (m *Move) Ply() int
- func (m *Move) Position() *Position
- func (m *Move) Promo() PieceType
- func (m *Move) S1() Square
- func (m *Move) S2() Square
- func (m *Move) SetCommand(key, value string)
- func (m *Move) SetComment(comment string)
- func (m *Move) SetNAG(nag string)
- func (m *Move) String() string
- type MoveTag
- type MoveWithWeight
- type Notation
- type Outcome
- type PGNError
- type Parser
- type ParserError
- type Piece
- type PieceType
- type PolyglotBook
- func (book *PolyglotBook) AddMove(positionHash uint64, move Move, weight uint16)
- func (book *PolyglotBook) DeleteMoves(positionHash uint64)
- func (book *PolyglotBook) FindMoves(positionHash uint64) []PolyglotEntry
- func (book *PolyglotBook) GetChessMoves(positionHash uint64) ([]Move, error)
- func (book *PolyglotBook) GetRandomMove(positionHash uint64) *PolyglotEntry
- func (book *PolyglotBook) ToMoveMap() map[uint64][]MoveWithWeight
- func (book *PolyglotBook) UpdateMove(positionHash uint64, move Move, newWeight uint16) error
- type PolyglotEntry
- type PolyglotMove
- type Position
- func (pos *Position) Board() *Board
- func (pos *Position) CastleRights() CastleRights
- func (pos *Position) ChangeTurn() *Position
- func (pos *Position) EnPassantSquare() Square
- func (pos *Position) HalfMoveClock() int
- func (pos *Position) Hash() [16]byte
- func (pos *Position) MarshalBinary() ([]byte, error)
- func (pos *Position) MarshalText() ([]byte, error)
- func (pos *Position) Ply() int
- func (pos *Position) Status() Method
- func (pos *Position) String() string
- func (pos *Position) Turn() Color
- func (pos *Position) UnmarshalBinary(data []byte) error
- func (pos *Position) UnmarshalText(text []byte) error
- func (pos *Position) Update(m *Move) *Position
- func (pos *Position) ValidMoves() []Move
- func (pos *Position) XFENString() string
- type PushMoveOptions
- type Rank
- type ReaderBookSource
- type Scanner
- type ScannerOption
- type ScannerOpts
- type Side
- type Square
- type TagPairs
- type Token
- type TokenType
- type UCINotation
- type ZobristHasher
Constants ¶
This section is empty.
Variables ¶
var ( ErrUnterminatedComment = func(pos int) error { return &PGNError{"unterminated comment", pos} } ErrUnterminatedQuote = func(pos int) error { return &PGNError{"unterminated quote", pos} } ErrInvalidCommand = func(pos int) error { return &PGNError{"invalid command in comment", pos} } ErrInvalidPiece = func(pos int) error { return &PGNError{"invalid piece", pos} } ErrInvalidSquare = func(pos int) error { return &PGNError{"invalid square", pos} } ErrInvalidRank = func(pos int) error { return &PGNError{"invalid rank", pos} } ErrNoGameFound = errors.New("no game found in PGN data") )
Custom error types for different PGN errors
Functions ¶
func FEN ¶
FEN takes a string and returns a function that updates the game to reflect the FEN data. Since FEN doesn't encode prior moves, the move list will be empty. The returned function is designed to be used in the NewGame constructor. An error is returned if there is a problem parsing the FEN data.
func GetPolyglotHashBytes ¶ added in v2.0.4
GetPolyglotHashBytes returns a precomputed byte slice for a given index
func GetPolyglotHashes ¶
func GetPolyglotHashes() []string
GetPolyglotHashes returns a reference to the static hash array
func IgnoreFivefoldRepetitionDraw ¶ added in v2.3.3
func IgnoreFivefoldRepetitionDraw() func(*Game)
IgnoreFivefoldRepetitionDraw returns a Game option that disables automatic draws caused by the fivefold repetition rule. When applied, the game will not automatically end in a draw if the same position occurs five times.
func IgnoreInsufficientMaterialDraw ¶ added in v2.3.3
func IgnoreInsufficientMaterialDraw() func(*Game)
IgnoreInsufficientMaterialDraw returns a Game option that disables automatic draws caused by insufficient material. When applied, the game will not automatically end in a draw even if checkmate is impossible with the remaining pieces.
func IgnoreSeventyFiveMoveRuleDraw ¶ added in v2.3.3
func IgnoreSeventyFiveMoveRuleDraw() func(*Game)
IgnoreSeventyFiveMoveRuleDraw returns a Game option that disables automatic draws triggered by the seventy-five move rule. When applied, the game will not automatically end in a draw if one hundred fifty half-moves pass without a pawn move or capture.
func MoveToPolyglot ¶ added in v2.0.2
func PGN ¶
PGN takes a reader and returns a function that updates the game to reflect the PGN data. The PGN can use any move notation supported by this package. The returned function is designed to be used in the NewGame constructor. An error is returned if there is a problem parsing the PGN data.
func ValidateSAN ¶ added in v2.2.0
ValidateSAN checks if a string is valid Standard Algebraic Notation (SAN) syntax. This function only validates the syntax, not whether the move is legal in any position. Examples of valid SAN: "e4", "Nf3", "O-O", "Qxd2+", "e8=Q#"
func ZobristHashToUint64 ¶ added in v2.0.2
Types ¶
type AlgebraicNotation ¶
type AlgebraicNotation struct{}
AlgebraicNotation (or Standard Algebraic Notation) is the official chess notation used by FIDE. Examples: e4, e5, O-O (short castling), e8=Q (promotion).
func (AlgebraicNotation) Decode ¶
func (AlgebraicNotation) Decode(pos *Position, s string) (*Move, error)
Decode implements the Decoder interface.
func (AlgebraicNotation) Encode ¶
func (AlgebraicNotation) Encode(pos *Position, m *Move) string
Encode implements the Encoder interface.
func (AlgebraicNotation) String ¶
func (AlgebraicNotation) String() string
String implements the fmt.Stringer interface and returns the notation's name.
type Board ¶
type Board struct {
// contains filtered or unexported fields
}
Board represents a chess board and its relationship between squares and pieces. It maintains separate bitboards for each piece type and color, along with convenience bitboards for quick position analysis.
func NewBoard ¶
NewBoard returns a board from a square to piece mapping. The map should contain only occupied squares.
Example:
squares := map[Square]Piece{
NewSquare(FileE, Rank1): WhiteKing,
NewSquare(FileE, Rank8): BlackKing,
}
board := NewBoard(squares)
func (*Board) Draw ¶
Draw returns a visual ASCII representation of the board. Capital letters represent white pieces, lowercase represent black pieces. Empty squares are shown as "-".
Example output:
A B C D E F G H 8 r n b q k b n r 7 p p p p p p p p 6 - - - - - - - - 5 - - - - - - - - 4 - - - - - - - - 3 - - - - - - - - 2 P P P P P P P P 1 R N B Q K B N R
func (*Board) Draw2 ¶ added in v2.1.0
Draw2 returns visual representation of the board useful for debugging. It is similar to Draw() except allows the caller to specify perspective and dark mode options
func (*Board) Flip ¶
func (b *Board) Flip(fd FlipDirection) *Board
Flip returns a new board flipped over the specified axis. For UpDown, pieces are mirrored across the horizontal center line. For LeftRight, pieces are mirrored across the vertical center line.
func (*Board) MarshalBinary ¶
MarshalBinary implements the encoding.BinaryMarshaler interface and returns the bitboard representations as a array of bytes. Bitboads are encoded in the following order: WhiteKing, WhiteQueen, WhiteRook, WhiteBishop, WhiteKnight WhitePawn, BlackKing, BlackQueen, BlackRook, BlackBishop, BlackKnight, BlackPawn.
func (*Board) MarshalText ¶
MarshalText implements the encoding.TextMarshaler interface and returns a string in the FEN board format: rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR.
func (*Board) Piece ¶
Piece returns the piece for the given square. Returns NoPiece if the square is empty.
func (*Board) SquareMap ¶
SquareMap returns a mapping of squares to pieces. A square is only added to the map if it is occupied.
func (*Board) String ¶
String implements the fmt.Stringer interface and returns a string in the FEN board format: rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR.
func (*Board) UnmarshalBinary ¶
UnmarshalBinary implements the encoding.BinaryUnmarshaler interface and parses the bitboard representations as a array of bytes. Bitboads are decoded in the following order: WhiteKing, WhiteQueen, WhiteRook, WhiteBishop, WhiteKnight WhitePawn, BlackKing, BlackQueen, BlackRook, BlackBishop, BlackKnight, BlackPawn.
func (*Board) UnmarshalText ¶
UnmarshalText implements the encoding.TextUnarshaler interface and takes a string in the FEN board format: rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR.
type BookSource ¶
type BookSource interface {
// Read reads exactly len(p) bytes into p or returns an error
Read(p []byte) (n int, err error)
// Size returns the total size of the book data
Size() (int64, error)
}
BookSource defines the interface for reading polyglot book data. This interface allows for different source implementations (file, memory, etc.) while maintaining consistent access patterns.
type BytesBookSource ¶
type BytesBookSource struct {
// contains filtered or unexported fields
}
BytesBookSource implements BookSource for byte slices
func NewBytesBookSource ¶
func NewBytesBookSource(data []byte) *BytesBookSource
NewBytesBookSource creates a new memory-based book source
func (*BytesBookSource) Read ¶
func (b *BytesBookSource) Read(p []byte) (n int, err error)
Read implements BookSource for BytesBookSource
func (*BytesBookSource) Size ¶
func (b *BytesBookSource) Size() (int64, error)
Size implements BookSource for BytesBookSource
type CastleRights ¶
type CastleRights string
CastleRights holds the state of both sides castling abilities.
func (CastleRights) CanCastle ¶
func (cr CastleRights) CanCastle(c Color, side Side) bool
CanCastle returns true if the given color and side combination can castle.
Example:
if rights.CanCastle(White, KingSide) {
// White can castle kingside
}
func (CastleRights) String ¶
func (cr CastleRights) String() string
String implements the fmt.Stringer interface and returns a FEN compatible string. Ex. KQq.
type Decoder ¶
Decoder is the interface implemented by objects that can decode a string into a move given the position. It is not the decoders responsibility to validate the move. An error is returned if the string could not be decoded.
type Encoder ¶
Encoder is the interface implemented by objects that can encode a move into a string given the position. It is not the encoders responsibility to validate the move.
type FileBookSource ¶
type FileBookSource struct {
// contains filtered or unexported fields
}
FileBookSource implements BookSource for files
type FlipDirection ¶
type FlipDirection int
FlipDirection is the direction for the Board.Flip method.
const ( // UpDown flips the board's rank values. UpDown FlipDirection = iota // LeftRight flips the board's file values. LeftRight )
type Game ¶
type Game struct {
// contains filtered or unexported fields
}
A Game represents a single chess game.
func NewGame ¶
NewGame returns a new game in the standard starting position. Optional functions can be provided to configure the initial game state.
Example:
// Standard game
game := NewGame()
// Game from FEN
game := NewGame(FEN("rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1"))
func (*Game) AddTagPair ¶
AddTagPair adds or updates a tag pair with the given key and value and returns true if the value is overwritten.
func (*Game) AddVariation ¶
AddVariation adds a new variation to the game. The parent move must be a move in the game or nil to add a variation to the root.
func (*Game) Comments ¶
Comments returns the comments for the game indexed by moves. Comments returns the comments for the game indexed by moves.
func (*Game) CurrentPosition ¶
CurrentPosition returns the game's current move position. This is the position at the current pointer in the move tree. This should be used to get the current position of the game instead of Position().
func (*Game) Draw ¶
Draw attempts to draw the game by the given method. If the method is valid, then the game is updated to a draw by that method. If the method isn't valid then an error is returned.
func (*Game) EligibleDraws ¶
EligibleDraws returns valid inputs for the Draw() method.
func (*Game) GetRootMove ¶ added in v2.0.2
GetRootMove returns the root move of the game.
func (*Game) GetTagPair ¶
GetTagPair returns the tag pair for the given key or nil if it is not present.
func (*Game) GoBack ¶
GoBack navigates to the previous move in the game. Returns true if the move was successful. Returns false if there are no moves to go back to. If the game is at the start, it will return false.
func (*Game) GoForward ¶
GoForward navigates to the next move in the game. Returns true if the move was successful. Returns false if there are no moves to go forward to. If the game is at the end, it will return false.
func (*Game) MarshalText ¶
MarshalText implements the encoding.TextMarshaler interface and encodes the game's PGN.
func (*Game) Move ¶ added in v2.0.7
func (g *Game) Move(move *Move, options *PushMoveOptions) error
Move method adds a move to the game using a Move struct. It returns an error if the move is invalid. This method validates the move before adding it to ensure game correctness. For high-performance scenarios where moves are pre-validated, use UnsafeMove.
Example:
possibleMove := game.ValidMoves()[0]
err := game.Move(&possibleMove, nil)
if err != nil {
panic(err)
}
func (*Game) NavigateToMainLine ¶
func (g *Game) NavigateToMainLine()
NavigateToMainLine navigates to the main line of the game. The main line is the first child of each move.
func (*Game) Positions ¶
Positions returns all positions in the game in the main line. This includes the starting position and all positions after each move.
func (*Game) PushMove
deprecated
func (g *Game) PushMove(algebraicMove string, options *PushMoveOptions) error
Deprecated: use PushNotationMove instead.
PushMove adds a move in algebraic notation to the game. Returns an error if the move is invalid. This method now validates moves for consistency with other move methods.
Example:
err := game.PushMove("e4", &PushMoveOptions{ForceMainline: true})
func (*Game) PushNotationMove ¶ added in v2.0.7
func (g *Game) PushNotationMove(moveStr string, notation Notation, options *PushMoveOptions) error
PushNotationMove adds a move to the game using any supported notation. It validates the move before adding it to ensure game correctness. For high-performance scenarios where moves are pre-validated, use UnsafePushNotationMove.
Example:
err := game.PushNotationMove("e4", chess.AlgebraicNotation{}, &PushMoveOptions{ForceMainline: true})
if err != nil {
panic(err)
}
game.PushNotationMove("c7c5", chess.UCINotation{}, nil)
game.PushNotationMove("Nc1f3", chess.LongAlgebraicNotation{}, nil)
func (*Game) RemoveTagPair ¶
RemoveTagPair removes the tag pair for the given key and returns true if a tag pair was removed.
func (*Game) Resign ¶
Resign resigns the game for the given color. If the game has already been completed then the game is not updated.
func (*Game) Split ¶ added in v2.1.0
Split takes a Game with a main line and 0 or more variations and returns a slice of Games (one for each variation), each containing exactly only a main line and 0 variations
func (*Game) UnmarshalText ¶
UnmarshalText implements the encoding.TextUnmarshaler interface and assumes the data is in the PGN format.
func (*Game) UnsafeMove ¶ added in v2.3.0
func (g *Game) UnsafeMove(move *Move, options *PushMoveOptions) error
UnsafeMove adds a move to the game without validation. This method is intended for high-performance scenarios where moves are known to be valid. Use this method only when you have already validated the move or are certain it's legal. For general use, prefer the Move method which includes validation.
Example:
// Only use when you're certain the move is valid
validMoves := game.ValidMoves()
move := &validMoves[0] // We know this is valid
err := game.UnsafeMove(move, nil)
if err != nil {
panic(err) // Should not happen with valid moves
}
func (*Game) UnsafePushNotationMove ¶ added in v2.3.0
func (g *Game) UnsafePushNotationMove(moveStr string, notation Notation, options *PushMoveOptions) error
UnsafePushNotationMove adds a move to the game using any supported notation without validation. This method is intended for high-performance scenarios where moves are known to be valid. Use this method only when you have already validated the move or are certain it's legal. For general use, prefer PushNotationMove which includes validation.
Example:
// Only use when you're certain the move is valid
err := game.UnsafePushNotationMove("e4", chess.AlgebraicNotation{}, nil)
if err != nil {
panic(err) // Should not happen with valid notation/moves
}
func (*Game) ValidMoves ¶
ValidMoves returns all legal moves in the current position.
func (*Game) Variations ¶
Variations returns all alternative moves at the given position.
type GameScanned ¶
type GameScanned struct {
// Raw contains the complete PGN text of the game
Raw string
}
GameScanned represents a complete chess game in PGN format.
type Lexer ¶
type Lexer struct {
// contains filtered or unexported fields
}
Lexer provides lexical analysis of PGN text.
func NewLexer ¶
NewLexer creates a new Lexer for the provided input text. The lexer is initialized and ready to produce tokens through calls to NextToken().
Example:
lexer := NewLexer("1. e4 e5")
func (*Lexer) NextToken ¶
NextToken reads the next token from the input stream. Returns an EOF token when the input is exhausted. Returns an ILLEGAL token for invalid input.
The method handles all standard PGN notation including: - Move notation (e4, Nf3, O-O) - Comments ({comment} or ; comment) - Tags ([Event "World Championship"]) - Move numbers and variations - Annotations ($1, !!, ?!)
Example:
lexer := NewLexer("1. e4 {Strong move}")
token := lexer.NextToken() // NUMBER: "1"
token = lexer.NextToken() // DOT: "."
token = lexer.NextToken() // NOTATION: "e4"
token = lexer.NextToken() // COMMENT: "Strong move"
token = lexer.NextToken() // EOF
type LongAlgebraicNotation ¶
type LongAlgebraicNotation struct{}
LongAlgebraicNotation is a fully expanded version of algebraic notation in which the starting and ending squares are specified. Examples: e2e4, Rd3xd7, O-O (short castling), e7e8=Q (promotion).
func (LongAlgebraicNotation) Decode ¶
func (LongAlgebraicNotation) Decode(pos *Position, s string) (*Move, error)
Decode implements the Decoder interface.
func (LongAlgebraicNotation) Encode ¶
func (LongAlgebraicNotation) Encode(pos *Position, m *Move) string
Encode implements the Encoder interface.
func (LongAlgebraicNotation) String ¶
func (LongAlgebraicNotation) String() string
String implements the fmt.Stringer interface and returns the notation's name.
type Method ¶
type Method uint8
A Method is the method that generated the outcome.
const ( // NoMethod indicates that an outcome hasn't occurred or that the method can't be determined. NoMethod Method = iota // Checkmate indicates that the game was won checkmate. Checkmate // Resignation indicates that the game was won by resignation. Resignation // DrawOffer indicates that the game was drawn by a draw offer. DrawOffer // Stalemate indicates that the game was drawn by stalemate. Stalemate // ThreefoldRepetition indicates that the game was drawn when the game // state was repeated three times and a player requested a draw. ThreefoldRepetition // FivefoldRepetition indicates that the game was automatically drawn // by the game state being repeated five times. FivefoldRepetition // FiftyMoveRule indicates that the game was drawn by the half // move clock being one hundred or greater when a player requested a draw. FiftyMoveRule // SeventyFiveMoveRule indicates that the game was automatically drawn // when the half move clock was one hundred and fifty or greater. SeventyFiveMoveRule // InsufficientMaterial indicates that the game was automatically drawn // because there was insufficient material for checkmate. InsufficientMaterial )
type Move ¶
type Move struct {
// contains filtered or unexported fields
}
A Move is the movement of a piece from one square to another.
func (*Move) AddComment ¶ added in v2.0.1
func (*Move) AddTag ¶ added in v2.0.4
AddTag adds the given MoveTag to the move's tags using a bitwise OR operation. Multiple tags can be combined by calling AddTag multiple times.
func (*Move) Clone ¶ added in v2.1.0
Clone returns a deep copy of a move.
Per-field exceptions:
parent: not copied; the clone'd move has no parent children: not copied; the clone'd move has no children
func (*Move) FullMoveNumber ¶ added in v2.0.9
FullMoveNumber returns the full move number (increments after Black's move).
func (*Move) SetCommand ¶ added in v2.0.1
func (*Move) SetComment ¶ added in v2.0.5
type MoveTag ¶
type MoveTag uint16
A MoveTag represents a notable consequence of a move.
const ( // KingSideCastle indicates that the move is a king side castle. KingSideCastle MoveTag = 1 << iota // QueenSideCastle indicates that the move is a queen side castle. QueenSideCastle // Capture indicates that the move captures a piece. Capture // EnPassant indicates that the move captures via en passant. EnPassant // Check indicates that the move puts the opposing player in check. Check )
type MoveWithWeight ¶ added in v2.0.2
MoveWithWeight is a helper struct that couples a chess.Move with a weight.
type Outcome ¶
type Outcome string
A Outcome is the result of a game.
const ( UnknownOutcome Outcome = "" // NoOutcome indicates that a game is in progress or ended without a result. NoOutcome Outcome = "*" // WhiteWon indicates that white won the game. WhiteWon Outcome = "1-0" // BlackWon indicates that black won the game. BlackWon Outcome = "0-1" // Draw indicates that game was a draw. Draw Outcome = "1/2-1/2" )
type PGNError ¶
type PGNError struct {
// contains filtered or unexported fields
}
PGNError custom error types for different PGN errors.
type Parser ¶
type Parser struct {
// contains filtered or unexported fields
}
Parser holds the state needed during parsing.
func NewParser ¶
NewParser creates a new parser instance initialized with the given tokens. The parser starts with a root move containing the starting position.
Example:
tokens := TokenizeGame(game) parser := NewParser(tokens)
func (*Parser) Parse ¶
Parse processes all tokens and returns the complete game. This includes parsing header information (tags), moves, variations, comments, and the game result.
Returns an error if the PGN is malformed or contains illegal moves.
Example:
game, err := parser.Parse()
if err != nil {
log.Fatal("Error parsing game:", err)
}
fmt.Printf("Event: %s\n", game.GetTagPair("Event"))
type ParserError ¶
func (*ParserError) Error ¶
func (e *ParserError) Error() string
type Piece ¶
type Piece int8
Piece is a piece type with a color.
const ( // NoPiece represents no piece. NoPiece Piece = iota // WhiteKing is a white king. WhiteKing // WhiteQueen is a white queen. WhiteQueen // WhiteRook is a white rook. WhiteRook // WhiteBishop is a white bishop. WhiteBishop // WhiteKnight is a white knight. WhiteKnight // WhitePawn is a white pawn. WhitePawn // BlackKing is a black king. BlackKing // BlackQueen is a black queen. BlackQueen // BlackRook is a black rook. BlackRook // BlackBishop is a black bishop. BlackBishop // BlackKnight is a black knight. BlackKnight // BlackPawn is a black pawn. BlackPawn )
func NewPiece ¶
NewPiece returns the piece matching the PieceType and Color. NoPiece is returned if the PieceType or Color isn't valid.
func (Piece) DarkString ¶ added in v2.1.0
DarkString is equivalent to String() except colors reversed for terminal windows in dark mode
type PieceType ¶
type PieceType int8
PieceType is the type of a piece.
func PieceTypeFromByte ¶
func PieceTypeFromString ¶
func (PieceType) ToPolyglotPromotionValue ¶ added in v2.0.2
type PolyglotBook ¶
type PolyglotBook struct {
// contains filtered or unexported fields
}
PolyglotBook represents a polyglot opening book with optimized lookup capabilities. A polyglot book is a binary file format widely used in chess engines to store opening moves. Each entry in the book contains a position hash, a move, and additional metadata.
Example usage:
// Load from file
book, err := LoadBookFromReader(fileReader)
if err != nil {
log.Fatal(err)
}
// Find moves for a position
hash := uint64(0x463b96181691fc9c) // Starting position hash
moves := book.FindMoves(hash)
// Get a random move weighted by the stored weights
randomMove := book.GetRandomMove(hash)
func LoadFromBytes ¶
func LoadFromBytes(data []byte) (*PolyglotBook, error)
LoadFromBytes loads a polyglot book from a byte slice. This is useful when the book data is already in memory.
Example:
data := // ... your book data ...
book, err := LoadFromBytes(data)
if err != nil {
log.Fatal(err)
}
func LoadFromReader ¶
func LoadFromReader(reader io.Reader) (*PolyglotBook, error)
LoadFromReader loads a polyglot book from an io.Reader. Note that this will read the entire input into memory.
Example:
file, err := os.Open("openings.bin")
if err != nil {
log.Fatal(err)
}
defer file.Close()
book, err := LoadFromReader(file)
if err != nil {
log.Fatal(err)
}
func LoadFromSource ¶
func LoadFromSource(source BookSource) (*PolyglotBook, error)
LoadFromSource loads a polyglot book from any BookSource
func NewPolyglotBookFromMap ¶ added in v2.0.2
func NewPolyglotBookFromMap(m map[uint64][]MoveWithWeight) *PolyglotBook
NewPolyglotBookFromMap creates a PolyglotBook from a map where the key is the zobrist hash (uint64) and the value is a slice of MoveWithWeight.
func (*PolyglotBook) AddMove ¶ added in v2.0.2
func (book *PolyglotBook) AddMove(positionHash uint64, move Move, weight uint16)
AddMove adds a new move (with its weight) to a given position hash in the book.
func (*PolyglotBook) DeleteMoves ¶ added in v2.0.2
func (book *PolyglotBook) DeleteMoves(positionHash uint64)
DeleteMoves removes all moves for a given position hash from the book.
func (*PolyglotBook) FindMoves ¶
func (book *PolyglotBook) FindMoves(positionHash uint64) []PolyglotEntry
FindMoves looks up all moves for a given position hash. Returns moves sorted by weight (highest weight first). Returns nil if no moves are found.
Example:
hash := uint64(0x463b96181691fc9c) // Starting position
moves := book.FindMoves(hash)
if moves != nil {
for _, move := range moves {
decodedMove := DecodeMove(move.Move)
fmt.Printf("Move: %v, Weight: %d\n", decodedMove, move.Weight)
}
}
func (*PolyglotBook) GetChessMoves ¶ added in v2.0.2
func (book *PolyglotBook) GetChessMoves(positionHash uint64) ([]Move, error)
func (*PolyglotBook) GetRandomMove ¶
func (book *PolyglotBook) GetRandomMove(positionHash uint64) *PolyglotEntry
GetRandomMove returns a weighted random move from the available moves for a position. The probability of selecting a move is proportional to its weight. Returns nil if no moves are available.
Example:
hash := uint64(0x463b96181691fc9c) // Starting position
move := book.GetRandomMove(hash)
if move != nil {
decodedMove := DecodeMove(move.Move)
fmt.Printf("Selected move: %v\n", decodedMove)
}
func (*PolyglotBook) ToMoveMap ¶ added in v2.0.2
func (book *PolyglotBook) ToMoveMap() map[uint64][]MoveWithWeight
func (*PolyglotBook) UpdateMove ¶ added in v2.0.2
func (book *PolyglotBook) UpdateMove(positionHash uint64, move Move, newWeight uint16) error
UpdateMove searches for an existing move at the given position and updates its weight.
type PolyglotEntry ¶
type PolyglotEntry struct {
Key uint64 // Zobrist hash of the chess position
Move uint16 // Encoded move (see DecodeMove for format)
Weight uint16 // Relative weight for move selection
Learn uint32 // Learning data (usually 0)
}
PolyglotEntry represents a single entry in a polyglot opening book. Each entry is exactly 16 bytes and contains information about a chess position and a recommended move.
type PolyglotMove ¶
type PolyglotMove struct {
FromFile int // Source file (0-7)
FromRank int // Source rank (0-7)
ToFile int // Target file (0-7)
ToRank int // Target rank (0-7)
Promotion int // Promotion piece type (0=none, 1=knight, 2=bishop, 3=rook, 4=queen)
CastlingMove bool // True if this is a castling move
}
PolyglotMove represents a decoded chess move from a polyglot entry. The coordinates use 0-based indices where: - Files go from 0 (a-file) to 7 (h-file) - Ranks go from 0 (1st rank) to 7 (8th rank)
func DecodeMove ¶
func DecodeMove(move uint16) PolyglotMove
DecodeMove converts a polyglot move encoding into a more usable format. The move encoding uses bit fields as follows:
- bits 0-2: to file
- bits 3-5: to rank
- bits 6-8: from file
- bits 9-11: from rank
- bits 12-14: promotion piece
Promotion pieces are encoded as:
- 0: none
- 1: knight
- 2: bishop
- 3: rook
- 4: queen
Example:
move := uint16(0x1234) // Some move from the book
decoded := DecodeMove(move)
fmt.Printf("From: %c%d, To: %c%d\n",
'a'+decoded.FromFile, decoded.FromRank+1,
'a'+decoded.ToFile, decoded.ToRank+1)
func (PolyglotMove) Encode ¶ added in v2.0.2
func (pm PolyglotMove) Encode() uint16
func (PolyglotMove) ToMove ¶ added in v2.0.2
func (pm PolyglotMove) ToMove() Move
type Position ¶
type Position struct {
// contains filtered or unexported fields
}
Position represents a complete chess position state. It includes piece placement, castling rights, en passant squares, move counts, and side to move.
func StartingPosition ¶
func StartingPosition() *Position
StartingPosition returns the starting position rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1.
func (*Position) CastleRights ¶
func (pos *Position) CastleRights() CastleRights
CastleRights returns the castling rights of the position.
func (*Position) ChangeTurn ¶
ChangeTurn returns a new position with the turn changed.
func (*Position) EnPassantSquare ¶
EnPassantSquare returns the en-passant square.
func (*Position) HalfMoveClock ¶
HalfMoveClock returns the half-move clock (50-rule).
func (*Position) MarshalBinary ¶
MarshalBinary implements the encoding.BinaryMarshaler interface.
func (*Position) MarshalText ¶
MarshalText implements the encoding.TextMarshaler interface and encodes the position's FEN.
func (*Position) Status ¶
Status returns the position's status as one of the outcome methods. Possible returns values include Checkmate, Stalemate, and NoMethod.
func (*Position) String ¶
String implements the fmt.Stringer interface and returns a string with the FEN format: rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1.
func (*Position) UnmarshalBinary ¶
UnmarshalBinary implements the encoding.BinaryMarshaler interface.
func (*Position) UnmarshalText ¶
UnmarshalText implements the encoding.TextUnarshaler interface and assumes the data is in the FEN format.
func (*Position) Update ¶
Update returns a new position resulting from the given move. The move isn't validated - use Game.Move() for validation. This method is optimized for move generation where validation is handled separately.
Example:
newPos := pos.Update(move)
func (*Position) ValidMoves ¶
ValidMoves returns all legal moves in the current position. The moves are cached for performance. TODO: Can we make this more efficient? Maybe using an iterator?
func (*Position) XFENString ¶ added in v2.1.0
XFENString() is similar to String() except that it returns a string with the X-FEN format
type PushMoveOptions ¶
type PushMoveOptions struct {
// ForceMainline makes this move the main line if variations exist
ForceMainline bool
}
PushMoveOptions contains options for pushing a move to the game
type ReaderBookSource ¶
type ReaderBookSource struct {
// contains filtered or unexported fields
}
ReaderBookSource implements BookSource for io.Reader
func NewReaderBookSource ¶
func NewReaderBookSource(reader io.Reader) (*ReaderBookSource, error)
NewReaderBookSource creates a new reader-based book source Note: This will read the entire input into memory to support Size() and multiple reads
func (*ReaderBookSource) Read ¶
func (r *ReaderBookSource) Read(p []byte) (n int, err error)
Read implements BookSource for ReaderBookSource
func (*ReaderBookSource) Size ¶
func (r *ReaderBookSource) Size() (int64, error)
Size implements BookSource for ReaderBookSource
type Scanner ¶
type Scanner struct {
// contains filtered or unexported fields
}
Scanner provides functionality to read chess games from a PGN source. It supports streaming processing of multiple games and proper handling of PGN syntax.
func NewScanner ¶
func NewScanner(r io.Reader, opts ...ScannerOption) *Scanner
NewScanner creates a new PGN scanner that reads from the provided reader. The scanner is configured to properly split PGN games and handle PGN-specific syntax.
Example:
scanner := NewScanner(strings.NewReader(pgnText))
func (*Scanner) HasNext ¶
HasNext returns true if there are more games available to read. This method can be used to iterate over all games in the source.
Example:
for scanner.HasNext() {
scangame, err := scanner.ScanGame()
// Process scangame
}
func (*Scanner) ParseNext ¶ added in v2.1.0
ParseNext is a convenience wrapper combining the functionality of ScanGame(), TokenizeGame(), NewParser(), and Parse() enabling callers to simplify iterating over each Game within a pgn file.
Example:
for scanner.HasNext() {
game, err := scanner.ParseNext()
// Process game
}
func (*Scanner) ScanGame ¶
func (s *Scanner) ScanGame() (*GameScanned, error)
ScanGame reads and returns the next game from the source. Returns nil and io.EOF when no more games are available. Returns nil and an error if reading fails.
Example:
game, err := scanner.ScanGame()
if err == io.EOF {
// No more games
}
type ScannerOption ¶ added in v2.1.0
type ScannerOption func(*Scanner)
func WithExpandVariations ¶ added in v2.1.0
func WithExpandVariations() ScannerOption
WithExpandVariations() instructs the scanner to expand all variations in a single GameScanned into multiple Game instances (1 per variation) rather than a single Game instance.
type ScannerOpts ¶ added in v2.1.0
type ScannerOpts struct {
ExpandVariations bool // default false
}
type Square ¶
type Square int8
A Square is one of the 64 rank and file combinations that make up a chess board.
type Token ¶
Token represents a lexical token from PGN text.
func TokenizeGame ¶
func TokenizeGame(game *GameScanned) ([]Token, error)
TokenizeGame converts a PGN game into a sequence of tokens. Returns nil if the game is nil. Returns an error if tokenization fails.
The function handles all PGN elements including moves, comments, annotations, and metadata tags.
Example:
tokens, err := TokenizeGame(game)
if err != nil {
// Handle error
}
type TokenType ¶
type TokenType int
TokenType represents the type of token in PGN text.
const ( EOF TokenType = iota Undefined TagStart // [ TagEnd // ] TagKey // The key part of a tag (e.g., "Site") TagValue // The value part of a tag (e.g., "Internet") MoveNumber // 1, 2, 3, etc. DOT // . ELLIPSIS // ... PIECE // N, B, R, Q, K SQUARE // e4, e5, etc. CommentStart // { CommentEnd // } COMMENT // The comment text RESULT // 1-0, 0-1, 1/2-1/2, * CAPTURE // 'x' in moves FILE // a-h in moves when used as disambiguation RANK // 1-8 in moves when used as disambiguation KingsideCastle // 0-0 QueensideCastle // 0-0-0 PROMOTION // = in moves PromotionPiece // The piece being promoted to (Q, R, B, N) CHECK // + in moves CHECKMATE // # in moves NAG // Numeric Annotation Glyph (e.g., $1, $2, etc.) VariationStart // ( for starting a variation VariationEnd // ) for ending a variation CommandStart // [% CommandName // The command name (e.g., clk, eval) CommandParam // Command parameter CommandEnd // ] DeambiguationSquare // Full square disambiguation (e.g., e8 in Qe8f7) )
type UCINotation ¶
type UCINotation struct{}
UCINotation is a more computer friendly alternative to algebraic notation. This notation uses the same format as the UCI (Universal Chess Interface). Examples: e2e4, e7e5, e1g1 (white short castling), e7e8q (for promotion).
func (UCINotation) Decode ¶
func (UCINotation) Decode(pos *Position, s string) (*Move, error)
Decode implements the Decoder interface.
func (UCINotation) Encode ¶
func (UCINotation) Encode(_ *Position, m *Move) string
Encode implements the Encoder interface.
func (UCINotation) String ¶
func (UCINotation) String() string
String implements the fmt.Stringer interface and returns the notation's name.
type ZobristHasher ¶ added in v2.0.2
type ZobristHasher struct {
// contains filtered or unexported fields
}
ZobristHasher provides methods to generate Zobrist hashes for chess positions
func NewChessHasher ¶
func NewChessHasher() *ZobristHasher
NewChessHasher creates a new instance of ChessHasher Deprecated: Use NewZobristHasher instead
func NewZobristHasher ¶ added in v2.0.2
func NewZobristHasher() *ZobristHasher
NewZobristHasher creates a new instance of ZobristHasher
func (*ZobristHasher) HashPosition ¶ added in v2.0.2
func (ch *ZobristHasher) HashPosition(fen string) (string, error)
HashPosition computes a Zobrist hash for a chess position in FEN notation
Source Files
¶
Directories
¶
| Path | Synopsis |
|---|---|
|
Package image is a go library that creates images from board positions
|
Package image is a go library that creates images from board positions |
|
Package opening implements chess opening determination and exploration.
|
Package opening implements chess opening determination and exploration. |
