[Java] Lotto 당첨 프로그램 만들기

Jeini·2022년 11월 29일
0

📌 Code list

목록 보기
33/55
post-thumbnail

상속 / Collection / Random() / Scanner

import java.util.*;

class MyNums {
    private Integer[] nums;

    public MyNums() {
        nums = autoSelect(6); // 자동: 나는 6개 뽑음
    }
    public MyNums(Integer... nums) { // 수동
        Arrays.sort(nums);
        this.nums = nums;
    }
    //번호 자동선택
    protected Integer[] autoSelect(int count) {
        Random r = new Random();
        HashSet<Integer> set = new HashSet<Integer>();

        while(set.size() < count) {
            //(int)(Math.random() * 45) + 1
            set.add(r.nextInt(45) + 1);
        }
        //일반 배열로 바꿈
        Integer[] nums = set.toArray(new Integer[0]);
        Arrays.sort(nums, 0, 6);// 0 ~ 6까지만 정렬 마지막은 보너스 숫자
        return nums;
    }
    @Override
    public String toString() {
        return Arrays.toString(nums);
    }

    public Integer[] getNums() {
        return nums;
    }
    public void setNums(Integer...nums) {
        this.nums = nums;
    }
}
//당첨번호
class LottoNums extends MyNums {
    //Bonus 번호 INDEX
    public static final int BONUS = 6;

    public LottoNums() {
        setNums(autoSelect(7));// 보너스 숫자까지
    }
    public LottoNums(Integer...nums) {
        super(nums);
    }
    public Integer getBonusNum() {
        return getNums()[BONUS]; //보너스 번호 뽑을 수 있는 메서드
    }
    @Override
    public String toString() {
        return super.toString() + "\n*마지막 번호가 보너스 번호입니다.";
    }
}
class LottoProgram {
    private Scanner sc;
    private MyNums[] nums; // 게임하는 숫자 얼마나 할껀지(마이넘즈 하나가 게임 한판)
    private LottoNums goal;
    //test
    private int[] count = new int[5];

    public LottoProgram() {
        sc = new Scanner(System.in);
        howManyPlay();
        getGoal();
        showResult();
    }
    private void howManyPlay() {
        System.out.print("몇개를 살까요? : ");
        int count = sc.nextInt();
        nums = new MyNums[count];
        for(int idx = 0; idx < count; idx++) {
            nums[idx] = new MyNums(); // 자동번호가 들어감
            //System.out.println(idx + 1 + "회 번호 : " + nums[idx]);
        }
    }
    //당첨번호 뽑음
    private void getGoal() {
        goal = new LottoNums();
        System.out.println("당첨번호를 추첨 합니다.");
        System.out.println("당첨번호 : " + goal);
    }
    private void addCount(int rank) {
        int idx = rank - 1;
        int num = count[idx]; // 1등 인덱스는 0을 증가시키고 ...
        num++;
        count[idx] = num;
    }


    private void showResult() {
        //배열 복사
        Integer[] excBonus = Arrays.copyOfRange(
                //0 ~ 5까지, 6개뽑기
                goal.getNums(), 0, LottoNums.BONUS
        );
        //배열을 이용하여 ArrayList를 만든다.
        List<Integer> goalList = new ArrayList<>(
                Arrays.asList(excBonus)
        );
        int no = 1;
        for(MyNums temp : nums) {
            List<Integer> myList =
                    new Vector<Integer>(Arrays.asList(temp.getNums()));
			/*
				temp -> [1,2,3,7,8,10]
				myList -> [1,2,3,7,8]
				goalList -> [1,2,3,7,8,9][10]
			*/
            myList.retainAll(goalList); // 안에 인자 싹다 제거할려고 list만든거임 (교집합)
            int count = myList.size(); // 당첨번호가 몇개 같은지 알 수 있음
            int rank = 0;

            switch (count) {
                case 6 :
                    rank = 1;
                    System.out.println(myList);
                    break;

                case 5 :
                    // 5개 맞을경우 보너스 번호 비교
                    int indexOfBonus = Arrays.binarySearch(
                            temp.getNums(), goal.getBonusNum()
                    );
                    if(indexOfBonus >= 0) {
                        rank = 2;
                    } else {
                        rank = 3;
                    }
                    break;

                case 4 :
                    rank = 4;
                    break;

                case 3 :
                    rank = 5;
                    break;
            }
            String result;
            if(rank == 0) {
                result = "꽝";
            } else {
                addCount(rank); // 1등 몇개 2등몇개 이런거 나타내는 것
                result = rank + "등";
            }
            System.out.println((no) + ": 회 게임 결과");
            System.out.println("\t일치번호 -> " + myList);
            no++;
        }
        System.out.println((no - 1) + ": 회 게임 결과\n");
        for(int i = 0; i < count.length; i++) {
            System.out.println((i + 1) + "등 당첨횟수 : " + count[i]);
        }
    }
}

public class LottoGame {
    public static void main(String[] args) {
        new LottoProgram();
    }
}
profile
Fill in my own colorful colors🎨

0개의 댓글