// TODO: Include option to update board in-place (only rows of start, end of move) public static void PrintBoard(Game game, IEnumerable <Square> highlighted) { const string rankDivider = " -----------------"; Span <bool> highlightSquares = stackalloc bool[64]; foreach (var sq in highlighted) { highlightSquares[BitTranslator.GetSquareIndex(sq.File, sq.Rank)] = true; } Console.WriteLine(rankDivider); for (var rank = 8; rank > 0; rank--) { Console.Write((char)(rank + '0')); Console.Write(" |"); for (var file = 'a'; file <= 'h'; file++) { var contents = game.GetSquareContents(file, rank); var representation = PiecesAsLetters[contents]; var currentIndex = BitTranslator.GetSquareIndex(file, rank); if (highlightSquares[currentIndex]) { Console.BackgroundColor = ConsoleColor.Yellow; Console.ForegroundColor = ConsoleColor.Black; Console.Write(representation); Console.ResetColor(); } else { Console.Write(representation); } Console.Write('|'); } Console.WriteLine(); Console.WriteLine(rankDivider); } Console.Write(" "); for (var file = 'A'; file <= 'H'; file++) { Console.Write(' '); Console.Write(file); } Console.WriteLine(); Console.WriteLine(); }
public void GeneratesExpectedSquares_MatchesCount(string sq, SquareContents piece, int expectedSquares) { var square = MoveParser.ParseSquare(sq); ulong bitSquare = BitTranslator.TranslateToBit(square.File, square.Rank); var board = BoardState.Empty.SetPiece(bitSquare, piece); var game = new Game(board); var validMoves = game.GetValidMoves(square.File, square.Rank); Assert.That(validMoves.Count, Is.EqualTo(expectedSquares)); }
public void GeneratesExpectedSquares_OmitsUnexpected(string sq, SquareContents piece, string expectedSquares) { var expected = expectedSquares.Split(',').Select(MoveParser.ParseSquare).ToArray(); var square = MoveParser.ParseSquare(sq); ulong bitSquare = BitTranslator.TranslateToBit(square.File, square.Rank); var board = BoardState.Empty.SetPiece(bitSquare, piece); var game = new Game(board); var validMoves = game.GetValidMoves(square.File, square.Rank).ToArray(); Assert.That(validMoves, Does.Not.Contain(expected[0])); }
public void GetValidMoves_DetectsWhenOnEdge(string position, string targetSq, string expectedSq) { var fen = new FenSerializer(); var board = fen.Deserialize(position); var target = MoveParser.ParseSquare(targetSq); var targetMask = BitTranslator.TranslateToBit(target.File, target.Rank); var validMovesMask = MoveGenerator.GetBishopMovements(targetMask, board); var validMoves = BitTranslator.TranslateToSquares(validMovesMask); var expected = MoveParser.ParseSquare(expectedSq); Assert.That(validMoves, Does.Contain(expected)); }
public void PawnPromotion_WillClearPawnFromFinalSquare() { const string fen = "rnb1kbnr/pppp1ppp/8/8/4q3/1P5P/P1PP1Kp1/RNBQ1BNR"; const string move = "gxh1=N#"; var fenBoard = new FenSerializer().Deserialize(fen); var game = new Game(fenBoard, PieceColor.Black); var result = game.Move(move); var board = game.CurrentState.Board; var targetSquare = BitTranslator.TranslateToBit('h', 1); Assert.That(board.Pawns & targetSquare, Is.EqualTo(0)); Assert.That(board.Knights & targetSquare, Is.EqualTo(targetSquare)); Assert.That(board.WhitePieces & targetSquare, Is.EqualTo(0)); Assert.That(board.BlackPieces & targetSquare, Is.EqualTo(targetSquare)); }
internal BoardState SetPiece(Square square, SquareContents contents) { return(BoardStateMutator.SetPiece(this, BitTranslator.TranslateToBit(square.File, square.Rank), contents)); }