You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
193 lines
3.5 KiB
193 lines
3.5 KiB
4 years ago
|
package chess
|
||
|
|
||
|
// Color represents the color of a chess piece.
|
||
|
type Color int8
|
||
|
|
||
|
const (
|
||
|
// NoColor represents no color
|
||
|
NoColor Color = iota
|
||
|
// White represents the color white
|
||
|
White
|
||
|
// Black represents the color black
|
||
|
Black
|
||
|
)
|
||
|
|
||
|
// Other returns the opposie color of the receiver.
|
||
|
func (c Color) Other() Color {
|
||
|
switch c {
|
||
|
case White:
|
||
|
return Black
|
||
|
case Black:
|
||
|
return White
|
||
|
}
|
||
|
return NoColor
|
||
|
}
|
||
|
|
||
|
// String implements the fmt.Stringer interface and returns
|
||
|
// the color's FEN compatible notation.
|
||
|
func (c Color) String() string {
|
||
|
switch c {
|
||
|
case White:
|
||
|
return "w"
|
||
|
case Black:
|
||
|
return "b"
|
||
|
}
|
||
|
return "-"
|
||
|
}
|
||
|
|
||
|
// Name returns a display friendly name.
|
||
|
func (c Color) Name() string {
|
||
|
switch c {
|
||
|
case White:
|
||
|
return "White"
|
||
|
case Black:
|
||
|
return "Black"
|
||
|
}
|
||
|
return "No Color"
|
||
|
}
|
||
|
|
||
|
// PieceType is the type of a piece.
|
||
|
type PieceType int8
|
||
|
|
||
|
const (
|
||
|
// NoPieceType represents a lack of piece type
|
||
|
NoPieceType PieceType = iota
|
||
|
// King represents a king
|
||
|
King
|
||
|
// Queen represents a queen
|
||
|
Queen
|
||
|
// Rook represents a rook
|
||
|
Rook
|
||
|
// Bishop represents a bishop
|
||
|
Bishop
|
||
|
// Knight represents a knight
|
||
|
Knight
|
||
|
// Pawn represents a pawn
|
||
|
Pawn
|
||
|
)
|
||
|
|
||
|
// PieceTypes returns a slice of all piece types.
|
||
|
func PieceTypes() [6]PieceType {
|
||
|
return [6]PieceType{King, Queen, Rook, Bishop, Knight, Pawn}
|
||
|
}
|
||
|
|
||
|
func (p PieceType) String() string {
|
||
|
switch p {
|
||
|
case King:
|
||
|
return "k"
|
||
|
case Queen:
|
||
|
return "q"
|
||
|
case Rook:
|
||
|
return "r"
|
||
|
case Bishop:
|
||
|
return "b"
|
||
|
case Knight:
|
||
|
return "n"
|
||
|
}
|
||
|
return ""
|
||
|
}
|
||
|
|
||
|
func (p PieceType) promotableTo() bool {
|
||
|
switch p {
|
||
|
case Queen, Rook, Bishop, Knight:
|
||
|
return true
|
||
|
}
|
||
|
return false
|
||
|
}
|
||
|
|
||
|
// Piece is a piece type with a color.
|
||
|
type Piece int8
|
||
|
|
||
|
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
|
||
|
)
|
||
|
|
||
|
var (
|
||
|
allPieces = []Piece{
|
||
|
WhiteKing, WhiteQueen, WhiteRook, WhiteBishop, WhiteKnight, WhitePawn,
|
||
|
BlackKing, BlackQueen, BlackRook, BlackBishop, BlackKnight, BlackPawn,
|
||
|
}
|
||
|
)
|
||
|
|
||
|
func getPiece(t PieceType, c Color) Piece {
|
||
|
for _, p := range allPieces {
|
||
|
if p.Color() == c && p.Type() == t {
|
||
|
return p
|
||
|
}
|
||
|
}
|
||
|
return NoPiece
|
||
|
}
|
||
|
|
||
|
// Type returns the type of the piece.
|
||
|
func (p Piece) Type() PieceType {
|
||
|
switch p {
|
||
|
case WhiteKing, BlackKing:
|
||
|
return King
|
||
|
case WhiteQueen, BlackQueen:
|
||
|
return Queen
|
||
|
case WhiteRook, BlackRook:
|
||
|
return Rook
|
||
|
case WhiteBishop, BlackBishop:
|
||
|
return Bishop
|
||
|
case WhiteKnight, BlackKnight:
|
||
|
return Knight
|
||
|
case WhitePawn, BlackPawn:
|
||
|
return Pawn
|
||
|
}
|
||
|
return NoPieceType
|
||
|
}
|
||
|
|
||
|
// Color returns the color of the piece.
|
||
|
func (p Piece) Color() Color {
|
||
|
switch p {
|
||
|
case WhiteKing, WhiteQueen, WhiteRook, WhiteBishop, WhiteKnight, WhitePawn:
|
||
|
return White
|
||
|
case BlackKing, BlackQueen, BlackRook, BlackBishop, BlackKnight, BlackPawn:
|
||
|
return Black
|
||
|
}
|
||
|
return NoColor
|
||
|
}
|
||
|
|
||
|
// String implements the fmt.Stringer interface
|
||
|
func (p Piece) String() string {
|
||
|
return pieceUnicodes[int(p)]
|
||
|
}
|
||
|
|
||
|
var (
|
||
|
pieceUnicodes = []string{" ", "♔", "♕", "♖", "♗", "♘", "♙", "♚", "♛", "♜", "♝", "♞", "♟"}
|
||
|
)
|
||
|
|
||
|
func (p Piece) getFENChar() string {
|
||
|
for key, piece := range fenPieceMap {
|
||
|
if piece == p {
|
||
|
return key
|
||
|
}
|
||
|
}
|
||
|
return ""
|
||
|
}
|