Esempio n. 1
0
 // bbの中で最も左にあるSquareを検出する。全く無かったり左に複数あったりすればSquare.NBを返す。
 private static Square leftMost(Bitboard bb)
 {
     for (File f = File.FILE_9; f >= File.FILE_1; --f)
     {
         Bitboard bbF = (bb & Bitboard.FileBB(f));
         if (bbF.IsZero())
         {
             continue;
         }
         if (bbF.IsOne())
         {
             return(bbF.Pop());
         }
         return(Square.NB);
     }
     return(Square.NB);
 }
Esempio n. 2
0
        static Bitboard dirBB_(Color color, Square sq, Direct dir, bool or_flag)
        {
            // color == Color.White ならば逆の方角にする
            dir = (color != Color.WHITE) ? dir : (7 - dir);
            int      offset = or_flag ? 0 : 1;
            Bitboard bb     = Bitboard.ZeroBB();

            switch (dir)
            {
            case Direct.R: for (File f = sq.ToFile() - offset; f >= File.FILE_1; f--)
                {
                    bb |= Bitboard.FileBB(f);
                }
                break;

            case Direct.L: for (File f = sq.ToFile() + offset; f <= File.FILE_9; f++)
                {
                    bb |= Bitboard.FileBB(f);
                }
                break;

            case Direct.U: for (Rank r = sq.ToRank() - offset; r >= Rank.RANK_1; r--)
                {
                    bb |= Bitboard.RankBB(r);
                }
                break;

            case Direct.D: for (Rank r = sq.ToRank() + offset; r <= Rank.RANK_9; r++)
                {
                    bb |= Bitboard.RankBB(r);
                }
                break;

            default: throw new ConverterException("不適切な方向が指定されました");
            }
            return(bb);
        }