Implement bishop moves
This commit is contained in:
parent
a8dd06590a
commit
8e881fc0b3
|
@ -221,7 +221,89 @@ func (b *Board) moveRook(position string) error {
|
|||
}
|
||||
|
||||
func (b *Board) moveBishop(position string) error {
|
||||
return nil
|
||||
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
|
||||
yPrev = y
|
||||
for xPrev >= 0 && xPrev < 8 && yPrev >= 0 && yPrev < 8 {
|
||||
xPrev++
|
||||
yPrev--
|
||||
piece = b.getPiece(xPrev, yPrev)
|
||||
if piece != nil {
|
||||
if piece.Name == Bishop && piece.Color == b.turn {
|
||||
b.tiles[xPrev][yPrev] = nil
|
||||
b.tiles[x][y] = piece
|
||||
return nil
|
||||
} else {
|
||||
// direction blocked by other piece
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
xPrev = x
|
||||
yPrev = y
|
||||
for xPrev >= 0 && xPrev < 8 && yPrev >= 0 && yPrev < 8 {
|
||||
xPrev++
|
||||
yPrev++
|
||||
piece = b.getPiece(xPrev, yPrev)
|
||||
if piece != nil {
|
||||
if piece.Name == Bishop && piece.Color == b.turn {
|
||||
b.tiles[xPrev][yPrev] = nil
|
||||
b.tiles[x][y] = piece
|
||||
return nil
|
||||
} else {
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
xPrev = x
|
||||
yPrev = y
|
||||
for xPrev >= 0 && xPrev < 8 && yPrev >= 0 && yPrev < 8 {
|
||||
xPrev--
|
||||
yPrev++
|
||||
piece = b.getPiece(xPrev, yPrev)
|
||||
if piece != nil {
|
||||
if piece.Name == Bishop && piece.Color == b.turn {
|
||||
b.tiles[xPrev][yPrev] = nil
|
||||
b.tiles[x][y] = piece
|
||||
return nil
|
||||
} else {
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
xPrev = x
|
||||
yPrev = y
|
||||
for xPrev >= 0 && xPrev < 8 && yPrev >= 0 && yPrev < 8 {
|
||||
xPrev--
|
||||
yPrev--
|
||||
piece = b.getPiece(xPrev, yPrev)
|
||||
if piece != nil {
|
||||
if piece.Name == Bishop && piece.Color == b.turn {
|
||||
b.tiles[xPrev][yPrev] = nil
|
||||
b.tiles[x][y] = piece
|
||||
return nil
|
||||
} else {
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return fmt.Errorf("no bishop found that can move to %s", position)
|
||||
}
|
||||
|
||||
func (b *Board) moveKnight(position string) error {
|
||||
|
|
|
@ -109,6 +109,27 @@ func TestBoardMoveKnight(t *testing.T) {
|
|||
assertNoPiece(t, b, "g8")
|
||||
}
|
||||
|
||||
func TestBoardMoveBishop(t *testing.T) {
|
||||
b := chess.NewBoard()
|
||||
|
||||
b.Move("Bc4")
|
||||
|
||||
assertMoveError(t, b, "Bc4", "no bishop found that can move to c4")
|
||||
|
||||
b.Move("e3")
|
||||
b.Move("e6")
|
||||
|
||||
b.Move("Bc4")
|
||||
|
||||
assertPiece(t, b, "c4", chess.Bishop, chess.Light)
|
||||
assertNoPiece(t, b, "f1")
|
||||
|
||||
b.Move("Bc5")
|
||||
|
||||
assertPiece(t, b, "c5", chess.Bishop, chess.Dark)
|
||||
assertNoPiece(t, b, "f8")
|
||||
}
|
||||
|
||||
func assertPiece(t *testing.T, b *chess.Board, position string, name chess.PieceName, color chess.Color) {
|
||||
p := b.At(position)
|
||||
|
||||
|
|
Loading…
Reference in New Issue