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.

192 lines
3.5 KiB

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 ""
}