Re: Complicating code in C#
Posted: Fri Feb 05, 2021 12:05 pm
A board (or squares) in its simplest form is just an array of 64 bytes holding a number that represents the piece that is in there.
Don't know if you are going to implement bitboards by the way. Bitboards start of all misery. Means much more code to maintain.
Code: Select all
public class Squares<T> : ISquares<T> where T : ISquare
{
..
public IList<T> BuildSquares(ISquareBuilder<T> squareBuilder)
{
var board = new List<T>();
for (int i = 0; i <= NSQUARES -1; i++)
{
var square = squareBuilder.BuildSquare();
board.Add(square);
square.Init((coord)i);
}
return board;
}
Code: Select all
public class BoardSquaresMoveGen : Squares<ISquareMoveGen>
{
public BoardSquaresMoveGen(): base(new SquareMoveGenBuilder(), 8, 8)
{
InitAllMoves();
}
/// <summary>
/// Assumes all squares are initialized
/// </summary>
public void InitAllMoves()
{
for (int i = 0; i <= NSQUARES - 1; i++)
{
var field = this[i];
field.InitMoves(this);
}
}
}
Code: Select all
public static IImmutableList<IMoveBase> ComputePawnDirectionMoves(ICoord coord, IPieceColor color,
IMoveFactory mvFactory, ISquares<ISquareMoveGen> boardSquares, PawnDirection dir)
{
var nColumns = boardSquares.nColumns;
var pieceSort = ConvertToPieceSort(Kind.Pawn_Kind, color);
var firstRow = color == White() ? 0 : LASTROW;
var lastRow = color == White() ? LASTROW : 0;
var epRow = color == White() ? 4 : 3;
var square = boardSquares[coord];
int rowNr2 = square.RowNr;
if (rowNr2 == 0 || rowNr2 == lastRow)
return null;
var dirMoves = CreateBuilder<IMoveBase>();
var colorValue = ABSearch.Eval(color);
if (dir == LEFT || dir == EP_LEFT)
{
if (square.ColNr > 0 &&
Less(color, square.RowNr, lastRow)
)
{
int newPos = (int)square.Coord + colorValue * nColumns - 1;
if (dir == LEFT)
{
if (Less(color, square.RowNr, lastRow - ABSearch.Eval(color)))
{
var mv = mvFactory.BuildMove(square.Coord2, boardSquares[(int)newPos].Coord2, pieceSort);
dirMoves.Add(mv);
}
else
{
AddPromotionMoves(square, mvFactory, pieceSort, boardSquares, dirMoves, newPos);
}
}
else
{
Debug.Assert(dir == EP_LEFT);
if (square.RowNr == epRow)
{
var mv = mvFactory.BuildEPMove(square.Coord2, boardSquares[(int)newPos].Coord2, pieceSort);
dirMoves.Add(mv);
}
}
}
}
else if (dir == FRONT)
{
int rowNr = square.RowNr;
if (rowNr == lastRow - colorValue
)
{
int newPos = (int)square.Coord + colorValue * nColumns;
AddPromotionMoves(square, mvFactory, pieceSort, boardSquares, dirMoves, newPos);
}
else
{
int nSteps = 1;
if (rowNr == firstRow + colorValue)
{
nSteps = 2;
}
for (int i = 1; i <= nSteps; i++)
{
int newPos = (int)square.Coord + i * colorValue * nColumns;
var field = boardSquares[newPos];
dirMoves.Add(PawnFrontMove(boardSquares, mvFactory, pieceSort, square.Coord2, field.Coord2));
}
}
}
else if (dir == RIGHT || dir == EP_RIGHT)
{
if (square.ColNr < LASTCOLUMN
&& Less(color, square.RowNr, lastRow))
{
int newPos = (int)square.Coord + colorValue * nColumns + 1;
if (dir == RIGHT)
{
if (Less(color, square.RowNr, lastRow - colorValue))
dirMoves.Add(mvFactory.BuildMove(square.Coord2, boardSquares[(int)newPos].Coord2, pieceSort));
else
{
AddPromotionMoves(square, mvFactory, pieceSort, boardSquares, dirMoves, newPos);
}
}
else if (square.RowNr == epRow)
{
var mv = mvFactory.BuildEPMove(square.Coord2, boardSquares[(int)newPos].Coord2, pieceSort);
dirMoves.Add(mv);
}
}
}
return dirMoves.ToImmutableList();
bool Less(IPieceColor color2, int x, int y)
=>
color2 == White() ? x < y : x > y;
}