package controls; import interfaces.IAttack; import interfaces.IBotBehavior; import java.util.AbstractMap; import java.util.ArrayList; import java.util.List; import java.util.Map; import static views.Constants.DECK_COUNT; public class BotIntelligence implements IBotBehavior { BotIntelligence(){ } /** 未確定の数字を列挙する */ List<Integer> calculateCandidate(IAttack iAttack){ //候補の初期化 var candidates = new ArrayList<Integer>(); for(int i=0;i<DECK_COUNT;i++)candidates.add(i); candidates.removeAll(iAttack.getMyHands().stream().map(x -> x.getKey()).toList()); candidates.removeAll(iAttack.getOpponentHands().stream().filter(x -> x.getValue()).map(x -> x.getKey()).toList()); return candidates; } /** * 相手の手札に対して、候補となる数字を割り当てる */ void assignCandidateNumberEachHand(IAttack iAttack){ var opponentsHands=iAttack.getOpponentHands(); var targetList=new ArrayList<>(); for(var card:opponentsHands){//ユーザーの手札を左から見ていく var index=opponentsHands.indexOf(card);//左からindex番目に var candidateList = calculateCandidate(iAttack);//確認するカード if(card.getValue()) { candidateList.clear(); }else{ //裏の場合 //そのカードから右隣のカードを確認していく for(int i=0;i<opponentsHands.size()-index-1;i++){ //今確認していっているカード var currentCard = opponentsHands.get(i+index+1); if(currentCard.getValue()){//確認しているカードが表なら、(YES) candidateList.removeIf(x -> x > currentCard.getKey());//その確認したカードの数字より大きい数字を除外する。 for(int j=1;j<i;j++){//そして、その確認したカードよりjだけ小さいそのカードからj番目の数字を除外する。 candidateList.remove(candidateList.size()-1); } // candidateList.removeAll(candidateList.subList(candidateList.size()-index-1,candidateList.size()-1)); break; } } //そのカードから左隣のカードを確認していく for(int i=1;i<=index;i++){ //今確認していっているカード var currentCard = opponentsHands.get(index-i); if(currentCard.getValue()){//表があれば、それより小さい数字を候補から削除する candidateList.removeIf(x-> x<currentCard.getKey()); // candidateList.removeAll(candidateList.subList(index-i,index)); } } } var s=(card.getValue()?"+":"-")+card.getKey()+":["; for (var i:candidateList)s+=i+" "; s+="]\n"; System.out.println(s); } } //公開されていないカードのインデックスを選ぶ(カードにかかれている番号ではない) @Override public int selectAttacker(IAttack iAttack) { var botsHands = iAttack.getMyHands(); for(var i:botsHands){ if(!i.getValue())return botsHands.indexOf(i); } return 0; } @Override public int selectTarget(IAttack iAttack) { return 0; } @Override public int declareNumber(IAttack iAttack) { var list = new ArrayList<>(); for(int i=0;i<DECK_COUNT;i++)list.add(i); return 0; } }