go-chess-models, v1.0
Posted on

The library that implements checking and generating of chess moves.
Major version.
Features
- representing the board as an associative array of pieces with their positions as keys;
- immutable applicating moves to the board via copying the latter;
- universal checkings of moves;
- generating moves via filtering from all possible ones;
- using an abstraction of a piece.
Installation
$ go get github.com/thewizardplusplus/go-chess-models
Examples
chessmodels.Board.CheckMove():
package main
import (
"fmt"
models "github.com/thewizardplusplus/go-chess-models"
)
type MockPiece struct {
kind models.Kind
color models.Color
position models.Position
checkMove func(move models.Move, board models.Board) bool
}
func (piece MockPiece) Kind() models.Kind {
return piece.kind
}
func (piece MockPiece) Color() models.Color {
return piece.color
}
func (piece MockPiece) Position() models.Position {
return piece.position
}
func (piece MockPiece) ApplyPosition(position models.Position) models.Piece {
return MockPiece{
kind: piece.kind,
color: piece.color,
position: position,
checkMove: piece.checkMove,
}
}
func (piece MockPiece) CheckMove(move models.Move, board models.Board) bool {
if piece.checkMove == nil {
panic("not implemented")
}
return piece.checkMove(move, board)
}
func main() {
board := models.NewBoard(models.Size{Width: 5, Height: 5}, []models.Piece{
MockPiece{
color: models.Black,
position: models.Position{File: 2, Rank: 2},
checkMove: func(move models.Move, board models.Board) bool { return false },
},
MockPiece{
color: models.White,
position: models.Position{File: 3, Rank: 3},
checkMove: func(move models.Move, board models.Board) bool { return true },
},
})
moveOne := models.Move{
Start: models.Position{File: 2, Rank: 2},
Finish: models.Position{File: 3, Rank: 3},
}
fmt.Printf("%+v: %v\n", moveOne, board.CheckMove(moveOne))
moveTwo := models.Move{
Start: models.Position{File: 3, Rank: 3},
Finish: models.Position{File: 2, Rank: 2},
}
fmt.Printf("%+v: %v\n", moveTwo, board.CheckMove(moveTwo))
// Output:
// {Start:{File:2 Rank:2} Finish:{File:3 Rank:3}}: illegal move
// {Start:{File:3 Rank:3} Finish:{File:2 Rank:2}}: <nil>
}
chessmodels.Board.ApplyMove():
package main
import (
"fmt"
"sort"
models "github.com/thewizardplusplus/go-chess-models"
)
type MockPiece struct {
kind models.Kind
color models.Color
position models.Position
checkMove func(move models.Move, board models.Board) bool
}
func (piece MockPiece) Kind() models.Kind {
return piece.kind
}
func (piece MockPiece) Color() models.Color {
return piece.color
}
func (piece MockPiece) Position() models.Position {
return piece.position
}
func (piece MockPiece) ApplyPosition(position models.Position) models.Piece {
return MockPiece{
kind: piece.kind,
color: piece.color,
position: position,
checkMove: piece.checkMove,
}
}
func (piece MockPiece) CheckMove(move models.Move, board models.Board) bool {
if piece.checkMove == nil {
panic("not implemented")
}
return piece.checkMove(move, board)
}
type ByPosition []models.Piece
func (group ByPosition) Len() int {
return len(group)
}
func (group ByPosition) Swap(i, j int) {
group[i], group[j] = group[j], group[i]
}
func (group ByPosition) Less(
i, j int,
) bool {
a := group[i].Position()
b := group[j].Position()
if a.File == b.File {
return a.Rank < b.Rank
}
return a.File < b.File
}
func main() {
board := models.NewBoard(models.Size{Width: 5, Height: 5}, []models.Piece{
MockPiece{
kind: models.Rook,
position: models.Position{File: 2, Rank: 2},
},
MockPiece{
kind: models.Bishop,
position: models.Position{File: 3, Rank: 3},
},
})
pieces := board.Pieces()
sort.Sort(ByPosition(pieces))
fmt.Printf("%+v\n", pieces)
updatedBoard := board.ApplyMove(models.Move{
Start: models.Position{File: 3, Rank: 3},
Finish: models.Position{File: 2, Rank: 2},
})
updatedPieces := updatedBoard.Pieces()
sort.Sort(ByPosition(updatedPieces))
fmt.Printf("%+v\n", updatedPieces)
// Output:
// [{kind:2 color:0 position:{File:2 Rank:2} checkMove:<nil>} {kind:3 color:0 position:{File:3 Rank:3} checkMove:<nil>}]
// [{kind:3 color:0 position:{File:2 Rank:2} checkMove:<nil>}]
}
Repository
Link: https://github.com/thewizardplusplus/go-chess-models/tree/v1.0.
Content: code.
License: MIT.