// 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); }
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); }