-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathpiece.go
267 lines (242 loc) · 4.99 KB
/
piece.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
package chess
import "strings"
// 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
)
func ColorFromString(s string) Color {
switch strings.ToLower(s) {
case "w":
return White
case "b":
return Black
}
return NoColor
}
// Other returns the opposite 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 PieceTypeFromByte(b byte) PieceType {
switch b {
case 'k':
return King
case 'q':
return Queen
case 'r':
return Rook
case 'b':
return Bishop
case 'n':
return Knight
case 'p':
return Pawn
}
return NoPieceType
}
func PieceTypeFromString(s string) PieceType {
if len(s) != 1 {
return NoPieceType
}
return PieceTypeFromByte(strings.ToLower(s)[0])
}
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"
case Pawn:
return "p"
}
return ""
}
func (p PieceType) Bytes() []byte {
switch p {
case King:
return []byte{'k'}
case Queen:
return []byte{'q'}
case Rook:
return []byte{'r'}
case Bishop:
return []byte{'b'}
case Knight:
return []byte{'n'}
case Pawn:
return []byte{'p'}
case NoPieceType:
return []byte{}
}
return []byte{}
}
func (p PieceType) ToPolyglotPromotionValue() int {
switch p {
case Knight:
return 1
case Bishop:
return 2
case Rook:
return 3
case Queen:
return 4
default:
return 0
}
}
// 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
)
// TODO: This is a constant slice
//
//nolint:gochecknoglobals // This is a constant slice.
var allPieces = []Piece{
WhiteKing, WhiteQueen, WhiteRook, WhiteBishop, WhiteKnight, WhitePawn,
BlackKing, BlackQueen, BlackRook, BlackBishop, BlackKnight, BlackPawn,
}
// NewPiece returns the piece matching the PieceType and Color.
// NoPiece is returned if the PieceType or Color isn't valid.
func NewPiece(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)]
}
// TODO: This is a constant slice
//
//nolint:gochecknoglobals // This is a constant slice.
var pieceUnicodes = []string{" ", "♔", "♕", "♖", "♗", "♘", "♙", "♚", "♛", "♜", "♝", "♞", "♟"}
// getFENChar returns the FEN character representation of a piece
// Returns a single byte representing the piece.
func (p Piece) getFENChar() byte {
pieceType := p.Type()
if pieceType < 0 || pieceType > 6 {
return 0 // Invalid piece type
}
if p.Color() == White {
return whitePiecesToFEN[pieceType]
}
return blackPiecesToFEN[pieceType]
}