From ca1e87fbfcf92e0c5958c0a9d528452bf279d973 Mon Sep 17 00:00:00 2001 From: Marco Date: Tue, 27 Jun 2023 23:47:24 +0200 Subject: [PATCH] Check which color should be moving and fix knight moves. --- chess/bishop.go | 2 +- chess/board.go | 16 +++++++++++---- chess/free_squares.go | 38 ++++++++++++++++++++++++++---------- types/coordinate.go | 45 +++++++++++++++++++++++-------------------- 4 files changed, 65 insertions(+), 36 deletions(-) diff --git a/chess/bishop.go b/chess/bishop.go index 229b4b5..c0fbab5 100644 --- a/chess/bishop.go +++ b/chess/bishop.go @@ -17,5 +17,5 @@ func (b Bishop) GetColor() types.ChessColor { } func (b Bishop) GetAllNonBlockedMoves(board Board, fromSquare types.Coordinate) []types.Coordinate { - return []types.Coordinate{} + return board.GetNonBlockedDiagonals(fromSquare) } diff --git a/chess/board.go b/chess/board.go index 4fbd43f..638f5a4 100644 --- a/chess/board.go +++ b/chess/board.go @@ -10,14 +10,16 @@ import ( type Position map[types.Coordinate]Piece type Board struct { - position Position - history []types.Move + position Position + history []types.Move + colorToMove types.ChessColor } func newBoard() Board { return Board{ - position: make(Position), - history: make([]types.Move, 0), + position: make(Position), + history: make([]types.Move, 0), + colorToMove: types.White, } } @@ -63,7 +65,11 @@ func (b *Board) CheckAndPlay(move types.Move) (bool, string) { if pieceAtStartSquare == nil { return false, "no piece at start square" } + move.ColorMoved = pieceAtStartSquare.GetColor() + if move.ColorMoved != tempBoard.colorToMove { + return false, "wrong color moved" + } move.PieceMoved = GetShortNameForPiece(pieceAtStartSquare) //Check end square of move @@ -114,6 +120,7 @@ func (b *Board) CheckAndPlay(move types.Move) (bool, string) { //We play the move on the real board b.position = tempBoard.position b.history = tempBoard.history + b.colorToMove = b.colorToMove.Opposite() b.appendMoveToHistory(move) return true, "" } @@ -176,6 +183,7 @@ func (b Board) getCopyOfBoard() Board { return Board{ position: b.position.getCopyOfPosition(), history: b.history, + colorToMove: b.colorToMove, } } diff --git a/chess/free_squares.go b/chess/free_squares.go index 852dd75..8e392c2 100644 --- a/chess/free_squares.go +++ b/chess/free_squares.go @@ -8,10 +8,10 @@ func (b *Board) GetNonBlockedRowAndColumn(fromSquare types.Coordinate) []types.C squaresAbove := fromSquare.GetStraightInDirection(types.Coordinate.Up) squaresBelow := fromSquare.GetStraightInDirection(types.Coordinate.Down) - nonBlocked := b.getNonBlocked(squaresLeft, fromSquare) - nonBlocked = append(nonBlocked, b.getNonBlocked(squaresRight, fromSquare)...) - nonBlocked = append(nonBlocked, b.getNonBlocked(squaresAbove, fromSquare)...) - nonBlocked = append(nonBlocked, b.getNonBlocked(squaresBelow, fromSquare)...) + nonBlocked := b.getNonBlockedConsecutive(squaresLeft, fromSquare) + nonBlocked = append(nonBlocked, b.getNonBlockedConsecutive(squaresRight, fromSquare)...) + nonBlocked = append(nonBlocked, b.getNonBlockedConsecutive(squaresAbove, fromSquare)...) + nonBlocked = append(nonBlocked, b.getNonBlockedConsecutive(squaresBelow, fromSquare)...) return nonBlocked } @@ -22,20 +22,20 @@ func (b *Board) GetNonBlockedDiagonals(fromSquare types.Coordinate) []types.Coor leftDown := fromSquare.GetDiagonalInDirection(types.Coordinate.Left, types.Coordinate.Down) rightDown := fromSquare.GetDiagonalInDirection(types.Coordinate.Right, types.Coordinate.Down) - nonBlocked := b.getNonBlocked(rightUp, fromSquare) - nonBlocked = append(nonBlocked, b.getNonBlocked(leftUp, fromSquare)...) - nonBlocked = append(nonBlocked, b.getNonBlocked(leftDown, fromSquare)...) - nonBlocked = append(nonBlocked, b.getNonBlocked(rightDown, fromSquare)...) + nonBlocked := b.getNonBlockedConsecutive(rightUp, fromSquare) + nonBlocked = append(nonBlocked, b.getNonBlockedConsecutive(leftUp, fromSquare)...) + nonBlocked = append(nonBlocked, b.getNonBlockedConsecutive(leftDown, fromSquare)...) + nonBlocked = append(nonBlocked, b.getNonBlockedConsecutive(rightDown, fromSquare)...) return nonBlocked } func (b *Board) GetNonBlockedKnightMoves(fromSquare types.Coordinate) []types.Coordinate { allKnightMoves := fromSquare.GetAllKnightMoves() - return b.getNonBlocked(allKnightMoves, fromSquare) + return b.getNonBlockedForKnights(allKnightMoves, fromSquare) } -func (b *Board) getNonBlocked( +func (b *Board) getNonBlockedConsecutive( squaresToCheck []types.Coordinate, sourceSquare types.Coordinate, ) []types.Coordinate { @@ -46,6 +46,8 @@ func (b *Board) getNonBlocked( piece := b.getPieceAt(square) if piece != nil { if piece.GetColor() == pieceOnSourceSquare.GetColor() { + //We do not append squares with same-colored pieces + //and also not the squares behind it break } // if there is an opposite colored piece we append it but @@ -57,3 +59,19 @@ func (b *Board) getNonBlocked( } return nonBlocked } + +func (b *Board) getNonBlockedForKnights( + squaresToCheck []types.Coordinate, + sourceSquare types.Coordinate, +) []types.Coordinate { + pieceOnSourceSquare := b.getPieceAt(sourceSquare) + nonBlocked := []types.Coordinate{} + + for _, square := range squaresToCheck { + piece := b.getPieceAt(square) + if piece == nil || piece.GetColor() != pieceOnSourceSquare.GetColor() { + nonBlocked = append(nonBlocked, square) + } + } + return nonBlocked +} diff --git a/types/coordinate.go b/types/coordinate.go index 17398d4..345f75a 100644 --- a/types/coordinate.go +++ b/types/coordinate.go @@ -20,6 +20,12 @@ type CoordinateBuilder struct { coordinate Coordinate } +func newCoordinateBuilder(c Coordinate) *CoordinateBuilder { + return &CoordinateBuilder{ + coordinate: c, + } +} + func (b *CoordinateBuilder) Up(number int) *CoordinateBuilder { b.coordinate.Row += number return b @@ -45,34 +51,31 @@ func (b *CoordinateBuilder) Resolve() *Coordinate { if c.Row <= RangeLastValid && c.Row >= RangeFirstValid && c.Col <= RangeLastValid && - c.Col >= RangeLastValid { - return nil + c.Col >= RangeFirstValid { + return &c } - return &c + return nil } func (c *Coordinate) GetAllKnightMoves() []Coordinate { - unfilteredMoves := make([]*Coordinate, 0, 8) - - builder := CoordinateBuilder{coordinate: *c} - - unfilteredMoves = append(unfilteredMoves, builder.Up(2).Right(1).Resolve()) - unfilteredMoves = append(unfilteredMoves, builder.Up(1).Right(2).Resolve()) - unfilteredMoves = append(unfilteredMoves, builder.Down(1).Right(2).Resolve()) - unfilteredMoves = append(unfilteredMoves, builder.Down(2).Right(1).Resolve()) - unfilteredMoves = append(unfilteredMoves, builder.Down(2).Left(1).Resolve()) - unfilteredMoves = append(unfilteredMoves, builder.Down(1).Left(2).Resolve()) - unfilteredMoves = append(unfilteredMoves, builder.Up(1).Left(2).Resolve()) - unfilteredMoves = append(unfilteredMoves, builder.Up(2).Left(1).Resolve()) - + unfilteredMoves := make([]*Coordinate, 0, 8) + + unfilteredMoves = append(unfilteredMoves, newCoordinateBuilder(*c).Up(2).Right(1).Resolve()) + unfilteredMoves = append(unfilteredMoves, newCoordinateBuilder(*c).Up(1).Right(2).Resolve()) + unfilteredMoves = append(unfilteredMoves, newCoordinateBuilder(*c).Down(1).Right(2).Resolve()) + unfilteredMoves = append(unfilteredMoves, newCoordinateBuilder(*c).Down(2).Right(1).Resolve()) + unfilteredMoves = append(unfilteredMoves, newCoordinateBuilder(*c).Down(2).Left(1).Resolve()) + unfilteredMoves = append(unfilteredMoves, newCoordinateBuilder(*c).Down(1).Left(2).Resolve()) + unfilteredMoves = append(unfilteredMoves, newCoordinateBuilder(*c).Up(1).Left(2).Resolve()) + unfilteredMoves = append(unfilteredMoves, newCoordinateBuilder(*c).Up(2).Left(1).Resolve()) return lo.FilterMap(unfilteredMoves, func(unfilteredMove *Coordinate, _ int) (Coordinate, bool) { - if unfilteredMove != nil { - return *unfilteredMove, true - } - return Coordinate{}, false - }) + if unfilteredMove != nil { + return *unfilteredMove, true + } + return Coordinate{}, false + }) } func (c Coordinate) Up(number int) *Coordinate {