public Board(string fen = STARTING_POSITION) { foreach (var pieceType in Piece.PIECE_TYPES) { pieceList[pieceType] = new List <int>(); } var fenData = fen.Split(' '); var rankDataArray = fenData[0].Split('/'); for (int rank = 0; rank < 8; rank++) //rank { var rankData = rankDataArray[7 - rank]; //Ranks are stored backwards in fen int file = 0; foreach (char datapoint in rankData) { if (char.IsNumber(datapoint)) { file += int.Parse(datapoint.ToString()); } else { var piece = Piece.FromFenString(datapoint); var pos = rank * 8 + file; board[pos] = piece; if (piece != Piece.NONE) { MaterialKey.AddPiece(piece, ref materialKey); pieceList[piece].Add(pos); if (piece == (Piece.PAWN | Piece.WHITE)) { WhitePawnBitboard |= 1ul << pos; } else if (piece == (Piece.PAWN | Piece.BLACK)) { BlackPawnBitboard |= 1ul << pos; } else if ((piece & Piece.COLOR_MASK) == Piece.WHITE) //White and not a pawn { WhitePiecesBitboard |= 1ul << pos; } else //Black and not a pawn { BlackPiecesBitboard |= 1ul << pos; } } file++; } } } Us = fenData[1] == "w" ? Piece.WHITE : Piece.BLACK; Them = Piece.OtherColor(Us); var castelingRightsString = fenData[2]; if (castelingRightsString.Contains("Q")) { CastelingRights |= WHITE_QUEENSIDE_CASTLE; } if (castelingRightsString.Contains("K")) { CastelingRights |= WHITE_KINGSIDE_CASTLE; } if (castelingRightsString.Contains("q")) { CastelingRights |= BLACK_QUEENSIDE_CASTLE; } if (castelingRightsString.Contains("k")) { CastelingRights |= BLACK_KINGSIDE_CASTLE; } }