diff --git a/chess/board.go b/chess/board.go index f984241..42123cf 100644 --- a/chess/board.go +++ b/chess/board.go @@ -131,20 +131,26 @@ func (b *Board) Parse(pgn string) error { func (b *Board) Move(position string) error { var ( - name PieceName - err error + err error ) - // TODO: implement remaining moveset of pieces if len(position) == 2 { - name = Pawn - } - - switch name { - case Pawn: err = b.movePawn(position) - default: - err = fmt.Errorf("invalid move: %s", position) + } else if len(position) == 3 { + switch strings.ToLower(position[0:1]) { + case "r": + err = b.moveRook(position[1:3]) + case "b": + err = b.moveBishop(position[1:3]) + case "n": + err = b.moveKnight(position[1:3]) + case "q": + err = b.moveQueen(position[1:3]) + case "k": + err = b.moveKing(position[1:3]) + default: + err = fmt.Errorf("invalid move: %s", position) + } } if err != nil { @@ -209,6 +215,111 @@ func (b *Board) movePawn(position string) error { return fmt.Errorf("no pawn found that can move to %s", position) } +func (b *Board) moveRook(position string) error { + return nil +} + +func (b *Board) moveBishop(position string) error { + return nil +} + +func (b *Board) moveKnight(position string) error { + var ( + x int + y int + xPrev int + yPrev int + piece *Piece + err error + ) + + if x, y, err = getXY(position); err != nil { + return err + } + + xPrev = x + 1 + yPrev = y - 2 + piece = b.tiles[xPrev][yPrev] + if piece != nil && piece.Name == Knight && piece.Color == b.turn { + b.tiles[xPrev][yPrev] = nil + b.tiles[x][y] = piece + return nil + } + + xPrev = x + 2 + yPrev = y - 1 + piece = b.tiles[xPrev][yPrev] + if piece != nil && piece.Name == Knight && piece.Color == b.turn { + b.tiles[xPrev][yPrev] = nil + b.tiles[x][y] = piece + return nil + } + + xPrev = x + 2 + yPrev = y + 1 + piece = b.tiles[xPrev][yPrev] + if piece != nil && piece.Name == Knight && piece.Color == b.turn { + b.tiles[xPrev][yPrev] = nil + b.tiles[x][y] = piece + return nil + } + + xPrev = x + 1 + yPrev = y + 2 + piece = b.tiles[xPrev][yPrev] + if piece != nil && piece.Name == Knight && piece.Color == b.turn { + b.tiles[xPrev][yPrev] = nil + b.tiles[x][y] = piece + return nil + } + + xPrev = x - 1 + yPrev = y + 2 + piece = b.tiles[xPrev][yPrev] + if piece != nil && piece.Name == Knight && piece.Color == b.turn { + b.tiles[xPrev][yPrev] = nil + b.tiles[x][y] = piece + return nil + } + + xPrev = x - 2 + yPrev = y + 1 + piece = b.tiles[xPrev][yPrev] + if piece != nil && piece.Name == Knight && piece.Color == b.turn { + b.tiles[xPrev][yPrev] = nil + b.tiles[x][y] = piece + return nil + } + + xPrev = x - 2 + yPrev = y - 1 + piece = b.tiles[xPrev][yPrev] + if piece != nil && piece.Name == Knight && piece.Color == b.turn { + b.tiles[xPrev][yPrev] = nil + b.tiles[x][y] = piece + return nil + } + + xPrev = x - 1 + yPrev = y - 2 + piece = b.tiles[xPrev][yPrev] + if piece != nil && piece.Name == Knight && piece.Color == b.turn { + b.tiles[xPrev][yPrev] = nil + b.tiles[x][y] = piece + return nil + } + + return fmt.Errorf("no knight found that can move to %s", position) +} + +func (b *Board) moveQueen(position string) error { + return nil +} + +func (b *Board) moveKing(position string) error { + return nil +} + func (b *Board) mustSetPiece(name PieceName, color Color, position string) { if err := b.SetPiece(name, color, position); err != nil { log.Fatalf("cannot set piece %s: %v", name, err) diff --git a/chess/board_test.go b/chess/board_test.go index da67b58..205e32e 100644 --- a/chess/board_test.go +++ b/chess/board_test.go @@ -95,6 +95,20 @@ func TestBoardMovePawnInvalid(t *testing.T) { assertMoveError(t, b, "h4", "no pawn found that can move to h4") } +func TestBoardMoveKnight(t *testing.T) { + b := chess.NewBoard() + + b.Move("Nf3") + + assertPiece(t, b, "f3", chess.Knight, chess.Light) + assertNoPiece(t, b, "g1") + + b.Move("Nf6") + + assertPiece(t, b, "f6", chess.Knight, chess.Dark) + assertNoPiece(t, b, "g8") +} + func assertPiece(t *testing.T, b *chess.Board, position string, name chess.PieceName, color chess.Color) { p := b.At(position)