-
[JAVA/자바] 로또 예제Language/Java 2018. 3. 2. 19:36반응형
배열을 배웠다면 이제 로또 예제를 해보자.
로또는 45개의 숫자 중에 6개가 정답으로 나온다.
그중에 6개가 맞으면 1등 1개 틀릴수록 등수가 낮아진다.
로또 게임
만들고 싶은 기능
1. 45개의 숫자 중 정답은 랜덤으로 6개가 나온다.
2. 중복이 나오지 않게 한다.
3. 정답률이 높을수록 등수를 높게 설정한다.
1. 우선은 만들어보자.
12345678910111213141516171819202122232425262728import 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. 중복을 방지하는 로직을 넣어 보자.
1234567891011121314151617181920212223242526272829303132333435363738import 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. 응용하여 심화단계로 게임으로 만들어보자.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124import 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 ) 알아보기
반응형'Language > Java' 카테고리의 다른 글
[JAVA/자바/TIP2] FileReader ( cmd 창에 txt 파일 읽기/출력하기 ) (2) 2018.03.05 [JAVA/자바/TIP1] substring ( 문자열분리 ) (2) 2018.03.05 [JAVA/자바] 구구단 예제 (0) 2018.03.02 [JAVA/자바] 별 / 피라미드 예제 (0) 2018.02.27 [JAVA/자바] 가위 바위 보 게임 예제 (0) 2018.02.26