ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [JAVA/자바] 로또 예제
    Language/Java 2018. 3. 2. 19:36
    반응형


    배열을 배웠다면 이제 로또 예제를 해보자.

         


    로또는 45개의 숫자 중에 6개가 정답으로 나온다.

    그중에 6개가 맞으면 1등 1개 틀릴수록 등수가 낮아진다.


    로또 게임

    만들고 싶은 기능

    1. 45개의 숫자 중 정답은 랜덤으로 6개가 나온다.

    2. 중복이 나오지 않게 한다.

    3. 정답률이 높을수록 등수를 높게 설정한다.


    1. 우선은 만들어보자.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    import java.util.*;
     
    class Lotto{
        Random random = new Random();
        int com[] = new int[6];
     
        void in(){
            for (int i = 0 ; i < 6 ; i++){
                com[i] = random.nextInt(45+ 1;
                System.out.print(com[i] + "\t");
            }
            /*
            com[0] = random.nextInt(45) + 1;
            com[1] = random.nextInt(45) + 1;
            com[2] = random.nextInt(45) + 1;
            com[3] = random.nextInt(45) + 1;
            com[4] = random.nextInt(45) + 1;
            com[5] = random.nextInt(45) + 1;
            */
        }
     
        public static void main(String[] args){
            Lotto lt = new Lotto();
            System.out.print("[\t");
            lt.in();
            System.out.println("]");
        }
    }
    cs


    5번줄 int com[] = new int[6]; 은 정답 6개를 집어 넣을 공간이다.

    9번줄 

    우리가 원하는 랜덤값은 1 ~ 45 이다.

    com[i] = random.nextInt(45) + 1; 은 

    (0~44) + 1 → 즉 1 ~ 45 ( = 45개 ) 이다.

    com[i] = random.nextInt(45); 로 하지 않은 이유는 

    0 ~ 44 ( = 45개 ) 의 값이기 때문이다.


    /*주석처리*/ 한 부분과 반복문 부분은 같은 것이다.

    10번줄 "\t" 는 탭 한번 만큼의 거리를 띄운다 라는 의미이다.


    아직 중복을 방지하는 로직을 넣지 않았기 때문에 

    중복값이 나오는것을 확인할 수 있다.


    2. 중복을 방지하는 로직을 넣어 보자.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    import java.util.*;
     
    class Lotto{
        Random random = new Random();
        int com[] = new int[6];
     
        void comIn(){
            for (int i = 0 ; i < 6 ; i++){
                com[i] = random.nextInt(45+ 1;
                for(int j = 0 ; j < i ; j++){    // 중복 제거
                    if(com[i] == com[j]){
                        i--;
                    }
                }
                for(int j = 0 ; j < 6 ; j++){    // 오름 차순
                    if(com[i] < com[j]){
                        int empty = com[i];
                        com[i] = com[j];
                        com[j] = empty;
                    }
                }
            }
        }
     
        void comOut(){
            for(int i = 0 ; i < com.length ; i++){
                System.out.print(com[i] + "\t");
            }
        }
     
        public static void main(String[] args){
            Lotto lt = new Lotto();
            lt.comIn();
            System.out.print("[\t");
            lt.comOut();
            System.out.println("]");
        }
    }
    cs


    10번줄은 중복을 방지하는 로직이다.

    15번줄은 오름차순으로 정리를 하는 로직이다.

    만약 버블정렬을 해라 라는 말이 있다면

    오름차순이나 내림차순으로 바꾸라는 의미인데

    현재 로직에서 부호만 반대로 바꿔주면 내림차순이 된다.

    사실상 이부분에서 로또 예제는 마무리가 된다.



    3. 응용하여 심화단계로 게임으로 만들어보자.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    import java.util.*;
    import java.io.*;
     
    class Lotto{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        Random random = new Random();
        int user[] = new int[6];
        int com[] = new int[6];
        
        Lotto(){
            userIn();
            userOut();
            System.out.println("]");
            comIn();
            System.out.print("LOTTO >> [\t");
            comOut();
            System.out.println("]");
            result();
            replay();
        }
     
        void userIn(){
            try{
                for(int i = 0 ; i < user.length ; i++){
                    System.out.print((i+1)+"번째 >> ");
                    String number = br.readLine();
                    number = number.trim();
                    user[i] = Integer.parseInt(number);
                    if(user[i] <= 0 || user[i] > 45){
                        System.out.println("입력 범위는 1 ~ 45 입니다.");
                        i--;
                    }
                    for(int j = 0 ; j < i ; j++){
                        if(user[i] == user[j]){
                            System.out.println("중복 값 : 다시 입력해 주세요.");
                            i--;
                        }
                        if(user[i] < user[j]){
                            int empty = user[i];
                            user[i] = user[j];
                            user[j] = empty;
                        }
                    }
                }
                System.out.println("");
            }catch(IOException ioe){
            }catch(NumberFormatException nfe){
                System.out.println("숫자값을 입력해주세요. 처음부터 다시 입력합니다.\n");
                userIn();
            }
        }
     
        void userOut(){
            System.out.print("USER  >> [\t");
            for(int i = 0 ; i < user.length ; i++){
                System.out.print(user[i] + "\t");
            }
        }
     
        void comIn(){
            for (int i = 0 ; i < com.length ; i++){
                com[i] = random.nextInt(45+ 1;
                for(int j = 0 ; j < i ; j++){    // 중복 제거
                    if(com[i] == com[j]){
                        i--;
                    }
                }
                for(int j = 0 ; j < 6 ; j++){    // 오름 차순
                    if(com[i] < com[j]){
                        int empty = com[i];
                        com[i] = com[j];
                        com[j] = empty;
                    }
                }
            }
        }
     
        void comOut(){
            for(int i = 0 ; i < com.length ; i++){
                System.out.print(com[i] + "\t");
            }
        }
     
        void result(){
            int count = 0;
            for (int u = 0 ; u < 6 ; u++){
                for(int c = 0 ; c < 6 ; c++){
                    if(user[u] == com[c]) count++;
                }
            }
            switch(count){
            case 0 : System.out.println("미당첨 : " + count + " 개 당첨"); break;
            case 1 : System.out.println("6등 : " + count + " 개 당첨"); break;
            case 2 : System.out.println("5등 : " + count + " 개 당첨"); break;
            case 3 : System.out.println("4등 : " + count + " 개 당첨"); break;
            case 4 : System.out.println("3등 : " + count + " 개 당첨"); break;
            case 5 : System.out.println("2등 : " + count + " 개 당첨"); break;
            case 6 : System.out.println("1등 : " + count + " 개 당첨"); 
            }
            System.out.println("");
        }
     
        void replay(){
            System.out.print("다시 하시겠습니까? ( Y / N ) >> ");
            try{
                String msg = br.readLine();
                if(msg.equalsIgnoreCase("y")){
                    System.out.println("\n[ LOTTO GAME RE-START ]\n");
                    new Lotto();
                }else if(msg.equalsIgnoreCase("n")){
                    System.out.println("프로그램을 종료합니다.");
                    System.exit(0);
                }else{
                    System.out.println("잘못 입력 하였습니다. 다시 입력해주세요.");
                    replay();
                }
            }catch(IOException ioe){}
        }
     
        public static void main(String[] args){
            System.out.println("[ LOTTO GAME START ]\n");
            Lotto lt = new Lotto();
        }
    }
    cs

    String number = br.readLine(); 

    은 cmd 에서 입력받은 내용을 number 변수에 넣는 것이다.

    number = number.trim(); 

    은 내용에 공백이 있더라도 공백을 제외하는 의미이다.

    user[i] = Integer.parseInt(number); 

    은 String number 을 int 값으로 파싱하는 것이다.

    msg.equalsIgnoreCase("y") 

    는 (msg.equals("y") || msg.equals("Y")) 와 같은 의미로 

    대소문자를 구분하지 않고 인식하는 것이다.


    블로그장 (= 시빅) 이 게임을 너무나도 좋아하기 때문에 , 

    예제는 괜시리 게임 형식으로 만들어 버리는게 아닌가 싶다.

    사실상 로또 랜덤 출력 부분에 대해서는 2번부분에서 끝났다.

    하다보니 추가하고 싶은 기능이 많아져서 , 

    길이가 길어지게 되었습니다. 죄송합니다.

    근데 아무리 해보아도 1등이 안나온다 ..


    1. IO 입출력 ( BufferedReader ) 알아보기

    2. Random 함수 알아보기

    3. Array 배열 알아보기

    4. 반복문 for(;;){} 알아보기

    5. 조건문 if(){}else if(){}else{} / switch(){ case: } 알아보기

    6. break; 알아보기

    7. 예외처리 try{}catch(){} 알아보기

    반응형
Designed by Tistory.