コード例 #1
0
ファイル: Board.cs プロジェクト: KMattis/Chess
        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;
            }
        }