예제 #1
0
 // 置ける場所の候補を列挙する
 void enum_possible_placements(Othello::Color color, const Othello::Board & board, SimulatedBoardList & result){
     result.clear();
     
     for(int i = 0; i < board.rows(); ++i){
         for(int j = 0; j < board.cols(); ++j){
             // 盤面のインスタンスを複製しておく
             SimulatedBoard simboard;
             simboard.coord = Othello::Coord(i, j);
             simboard.board = Othello::Board(board);
             
             // 石を置いてみる
             if(simboard.board.put_and_flip(simboard.coord, gi_.my_color()) > 0){
                 // 1か所でも裏返せるとわかったら候補に加える
                 result.push_back(simboard);
             }
         }
     }
 }
 // 指す手を決める。
 Othello::Coord place(const Othello::Board & board){
     // 置ける場所のうち、(各分類において)石を最も多く裏返せるときの
     // 数ならびに場所。
     // [0]: 角のマス(優先度最高)
     // [1]: それ以外
     // [2]: 角に隣接するマス(優先度最低)
     std::size_t max_flipped[3];
     Othello::Coord max_flipped_place[3];
     for(std::size_t i = 0; i < 3; ++i){
         max_flipped[i] = 0;
     }
     
     for(int i = 0; i < board.rows(); ++i){
         for(int j = 0; j < board.cols(); ++j){
             // 盤面のインスタンスを複製しておく
             Othello::Board board_tmp = Othello::Board(board);
             
             // 石を置いてみる
             const std::size_t flipped = board_tmp.put_and_flip(i, j, gi_.my_color());
             
             // 今まで試した中で一番多く石を裏返せていたら、
             // その座標を max_flipped_place に保存しておく
             if((i == 0 || i == board.rows() - 1) && (j == 0 || j == board.cols() - 1)){
                 // 角。優先して置く
                 if(flipped > max_flipped[0]){
                     max_flipped[0] = flipped;
                     max_flipped_place[0] = Othello::Coord(i, j);
                 }
             }else if((i <= 1 || i >= board.rows() - 2) && (j <= 1 || j >= board.cols() - 2)){
                 // 角の隣。優先度最低
                 if(flipped > max_flipped[2]){
                     max_flipped[2] = flipped;
                     max_flipped_place[2] = Othello::Coord(i, j);
                 }
             }else{
                 // その他
                 if(flipped > max_flipped[1]){
                     max_flipped[1] = flipped;
                     max_flipped_place[1] = Othello::Coord(i, j);
                 }
             }
         }
     }
     
     // 置く場所を返す
     if(max_flipped_place[0].is_valid()) return max_flipped_place[0];
     if(max_flipped_place[1].is_valid()) return max_flipped_place[1];
     return max_flipped_place[2];
 }