java

[JAVA] 야구게임 맞추기

dackyy 2022. 7. 30. 22:49
반응형
package Algorithm;//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by FernFlower decompiler)
//

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Random;

public class Baseball {
    ArrayList<Integer> nCase = new ArrayList();
    ArrayList<Integer> answer = new ArrayList();
    ArrayList<Integer> list = new ArrayList();
    ArrayList<Integer> log = new ArrayList();
    Random random = new Random();
    int rAnswer;
    int myAnswer;
    int count = 1;
    double avg;

    Baseball() {
        String str = "";

        for(int i = 0; i < 3; ++i) {
            int temp = this.random.nextInt(10);
            if (this.answer.contains(temp)) {
                --i;
            } else {
                this.answer.add(temp);
                str = str + temp;
            }
        }

        this.rAnswer = Integer.parseInt(str);
        System.out.println("Answer is..." + this.answer);

        for(int i = 0; i < 10; ++i) {
            for(int j = 0; j < 10; ++j) {               // 모든 경우의 수를 만들어 저장한다.
                for(int k = 0; k < 10; ++k) {
                    if (i != j && j != k && i != k) {
                        String tmp = "";
                        tmp = tmp + Integer.toString(i);
                        tmp = tmp + Integer.toString(j);
                        tmp = tmp + Integer.toString(k);
                        if(Integer.parseInt(tmp) <= 101)
                            continue;
                        this.nCase.add(Integer.parseInt(tmp));
                    }
                }
            }
        }
    }

    public static void main(String[] args) {
        int cnt = 0;
        for(int i = 0; i <1000; i++) {
            Baseball bs = new Baseball();
            bsQuestion(bs);
            cnt += bs.count;
        }
        System.out.println(cnt);
    }

    static void bsQuestion(Baseball bs) {
        bs.list.add(1);
        bs.list.add(2);
        bs.list.add(3);
        bs.log.add(123);
        System.out.println("최대경우의수 : " + bs.nCase.size());
        find(bs);
    }

    static void find(Baseball bs) {
        int st = 0;
        int ball = 0;

        for(int i = 0; i < 3; ++i) {
            if (bs.list.get(i) == bs.answer.get(i)) {
                ++st;
            } else if (bs.answer.contains(bs.list.get(i))) {
                ++ball;
            }
        }

        System.out.println(st + " Strike " + ball + " ball");
        delete(bs, st, ball);
    }
    static int delete(Baseball bs, int st, int ball) {
        Random random = new Random();
        String str1 = Integer.toString(bs.list.get(0));
        String str2 = Integer.toString(bs.list.get(1));
        String str3 = Integer.toString(bs.list.get(2));
        System.out.println("지금 내가할 답 : " + bs.list + "답이 있나요? : " + bs.nCase.contains(bs.rAnswer));
        int k;
        String str;
            if (st == 0 && ball == 1) {         //볼이 하나 있을때 경우의 수 중 내가 한 답 숫자중 하나도 없는 경우를 지움
                for(k = 0; k < bs.nCase.size(); ++k) {
                    str = Integer.toString(bs.nCase.get(k));
                    if (str.contains(str1)) {
                    } else if (str.contains(str2)) {
                    } else if (str.contains(str3)) {
                    } else {
                        bs.nCase.remove(bs.nCase.get(k));
                        --k;
                    }
                }
                System.out.println("볼이 1개 있을때 경우의 수 : " + bs.nCase.size());

            } else if (st == 1 && ball == 0) {         //스트라이크가 하나 있을때 경우의 수 중 내가 한 답 숫자의 자리와 하나도 안맞는 경우를 지움
                for(k = 0; k < bs.nCase.size(); ++k) {
                    str = Integer.toString(bs.nCase.get(k));
                    String[] strArr = str.split("");
                    if ((strArr[0].equals(str1))){}
                    else if ((strArr[1].equals(str2))) {}
                    else if ((strArr[2].equals(str3))) {}
                    else{
                        bs.nCase.remove(bs.nCase.get(k));
                        --k;
                    }
                }
                System.out.println("스트라이크가 1개 있을 때 경우의  수 : " + bs.nCase.size());

            } else if (st == 0 && ball == 2) {          //볼이 두개 있을때 경우의 수 중 내가 한 답 숫자의 2개가 하나도 없는 경우를 지움
                for(k = 0; k < bs.nCase.size(); ++k) {
                    str = Integer.toString(bs.nCase.get(k));
                    if (str.contains(str1) && str.contains(str2)) {}
                    else if((str.contains(str2) && str.contains(str3))){}
                    else if ((str.contains(str1) && str.contains(str3))) {}
                    else{
                        bs.nCase.remove(bs.nCase.get(k));
                        --k;
                    }
                }
                System.out.println("볼이 2개 있을 때 경우의  수 : " + bs.nCase.size());

            } else if(st == 2 && ball == 0){
                for(k = 0; k < bs.nCase.size(); ++k) {
                    str = Integer.toString(bs.nCase.get(k));
                    String[] strArr = str.split("");
                    if (!(strArr[0].equals(str1) && strArr[1].equals(str2)) && !(strArr[1].equals(str2) && strArr[2].equals(str3)) &&
                            !(strArr[0].equals(str1) && strArr[2].equals(str3))) {
                        bs.nCase.remove(bs.nCase.get(k));
                        --k;
                    }
                }
                System.out.println("스트라이크가 2개 있을 때 경우의  수 : " + bs.nCase.size());
            }else if (ball == 3){
                for(k = 0; k < bs.nCase.size(); ++k) {
                    str = Integer.toString(bs.nCase.get(k));
                    if(!str.contains(str1) && !str.contains(str2) && !str.contains(str3)){
                        bs.nCase.remove(bs.nCase.get(k));
                        --k;
                    }
                }
            }else if(st == 1 && ball == 1){
                for(k = 0; k < bs.nCase.size(); ++k) {
                    str = Integer.toString(bs.nCase.get(k));
                    String[] strArr = str.split("");
                    if (!(strArr[0].equals(str1) && str.contains(str2)) && !(strArr[0].equals(str1) && str.contains(str3))
                    && !(strArr[1].equals(str2) && str.contains(str1)) && !(strArr[1].equals(str2) && str.contains(str3))
                    && !(strArr[2].equals(str3) && str.contains(str1)) && !(strArr[2].equals(str3) && str.contains(str2))){
                        bs.nCase.remove(bs.nCase.get(k));
                        --k;
                    }
                }
                System.out.println("스트라이크가 1개 볼이 1개있을 때 경우의  수 : " + bs.nCase.size());
            }else if(st == 1 && ball == 2){
                for(k = 0; k < bs.nCase.size(); ++k) {
                    str = Integer.toString(bs.nCase.get(k));
                    String[] strArr = str.split("");
                    if (!(strArr[0].equals(str1) && str.contains(str2) && str.contains(str3)) && !(strArr[0].equals(str1) && str.contains(str2)&& str.contains(str3))
                            && !(strArr[1].equals(str2) && str.contains(str1) && str.contains(str3)) && !(strArr[1].equals(str2) && str.contains(str1) && str.contains(str3))
                            && !(strArr[2].equals(str3) && str.contains(str1) && str.contains(str2)) && !(strArr[2].equals(str3) && str.contains(str1)&& str.contains(str2))){
                        bs.nCase.remove(bs.nCase.get(k));
                        --k;
                    }
                }
                System.out.println("스트라이크가 1개 볼이 2개있을 때 경우의 수 : " + bs.nCase.size());

            }else if(st == 2 && ball ==1){
                for(k = 0; k < bs.nCase.size(); ++k) {
                    str = Integer.toString(bs.nCase.get(k));
                    String[] strArr = str.split("");
                    if (!(strArr[0].equals(str1) && strArr[1].equals(str2) && str.contains(str3)) && !(strArr[0].equals(str1) && strArr[2].equals(str3) && str.contains(str2))
                            && !(strArr[1].equals(str2) && strArr[2].equals(str3) && str.contains(str1))){
                        bs.nCase.remove(bs.nCase.get(k));
                        --k;
                    }
                }
                System.out.println("스트라이크가 2개 볼이 1개있을 때 경우의 수 : " + bs.nCase.size());

            } else if (st  == 0 && ball == 0) {
                for(k = 0; k < bs.nCase.size(); ++k) {
                    str = Integer.toString(bs.nCase.get(k));
                    if (str.contains(str1)) {
                        bs.nCase.remove(bs.nCase.get(k));
                        --k;
                    }
                    else if (str.contains(str2)) {
                        bs.nCase.remove(bs.nCase.get(k));
                        --k;
                    }
                    else if (str.contains(str3)) {
                        bs.nCase.remove(bs.nCase.get(k));
                                --k;
                    }
            }System.out.println("out 일 때 경우의 수 : " + bs.nCase.size());
        }

        bs.myAnswer = bs.nCase.get(random.nextInt(bs.nCase.size()));
        System.out.println("다음에 내가 할 답 : " + bs.myAnswer);
        if (bs.rAnswer != bs.myAnswer && st != 3) {
            bs.list.clear();
            str = Integer.toString(bs.myAnswer);
            String[] strArr = str.split("");
            bs.list.add(Integer.parseInt(strArr[0]));
            bs.list.add(Integer.parseInt(strArr[1]));
            bs.list.add(Integer.parseInt(strArr[2]));
            bs.nCase.remove(bs.nCase.indexOf(Integer.parseInt(str)));
            System.out.println("현재 경우의 수 : " + bs.nCase.size() + "\n" + bs.count++ + "회째...");
            find(bs);
        } else {
            System.out.println("총 카운트 : " + bs.count);
            bs.avg += bs.count;
        }

        return -1;
    }
}
반응형