로또 번호 생성기

김민혁·2021년 11월 22일
1

Java 코드뭉치

목록 보기
1/5

콘솔창에서 구현한 로또 번호 생성기입니다.
총 3가지 모드가 존재하며 3번모드는 1등이
당첨될때까지 무한반복됩니다.
보너스볼은 미구현입니다.
제작일시는 21.9.20~21.9.23 소요시간은 5시간입니다.

소스코드

Lotto3

package lotto_method;
import java.util.Scanner;
import java.util.Arrays;
public class Lotto3 
{   
	
  	
	public static void main(String[] args)
	{   Scanner sc = new Scanner(System.in);
	    Lotto3_fuc lo = new Lotto3_fuc();
		int mode;
	 	while(true) {
		int[] in_num = new int[6];
	 	int[] out_num = new int[6];
	 	int cor=0;
	 	
	 	System.out.println("★☆★★☆☆로또추첨기★☆★☆★☆");
	    System.out.println("모드선택 1=자동 2=수동 3=1등될때까지한다! 0=종료");
	    mode = sc.nextInt();
	if(mode==1)
	{
		lo.generate_nonDup(out_num);
		lo.align(out_num);		
		
		lo.generate_nonDup(in_num);
		lo.align(in_num);
		
		lo.grade(in_num,out_num,cor);      
		} //mode 1
	else if(mode==2) 
	{
	    System.out.println("번호를 입력해주세요");	    
	    for(int i=0;i<in_num.length;i++)
	    {   
	    	System.out.printf("%d번째 번호 입력",i+1);	        
	    	in_num[i] = sc.nextInt();	
	    	if(!(in_num[i]<=45&&in_num[i]>0))
	    	{i--; System.out.println("로또 번호는 1~45입니다");}
	    	for(int j=0; j<i; j++)
	        {
	        	if(in_num[i]==in_num[j]) 
	        	{i--;
	        	System.out.println("중복되었습니다. 다시입력해주세요");
	        	break;
	        	}		        	
	        }
	    }
	    lo.align(in_num);
	    lo.generate_nonDup(out_num);
	    lo.align(out_num);	
    
	    lo.grade(in_num,out_num,cor);
	}//mode 2
	
	else if(mode==3)
	{   int mode3_A=1;
		lo.generate_nonDup(out_num);
		lo.align(out_num);	
		
		while(true) {
			cor = 0;
			lo.generate_nonDup(in_num);
			lo.align(in_num);
	    for(int i=0;i<in_num.length;i++)
	    {
	    	for(int j=0;j<i+1;j++)
	    	{
	    	if(in_num[i]==out_num[j]) 	    	
	    	cor++;  
	    	}
	    }
	    System.out.println(mode3_A+"번째시도");
	    System.out.println("당첨번호는"+Arrays.toString(out_num)+"입니다.");
	    System.out.println("입력번호는"+Arrays.toString(in_num)+"입니다.");
        if(cor==6) {System.out.println("1등당첨!!!!!!!!!"); break;}    
        mode3_A++;
		}//mode3_while		
		System.out.println("사용금액은"+mode3_A/100000+"억원입니다.");
	}//mode 3
	else if (mode==0) {System.out.println("프로그램을 종료합니다.");break;}
	else System.out.println("올바른숫자를입력해주세요");	
   }//while	
	 	sc.close();
  } //main
}//class

Lotto3_fuc

package lotto_method;

import java.util.Arrays;
import java.util.Random;

public class Lotto3_fuc 
{
    
	void generate_nonDup(int num[]) // 생성 및 중복제거
	{ Random random = new Random();
	  for(int i=0;i<num.length;i++)
      { num[i] = random.nextInt(45)+1;
         for(int j=0; j<i; j++)
         {
        	if(num[i]==num[j]) {i--; break;}	        	
         }	    	
      }
	}
  	
	void align(int num[]) // 정렬
  	{ int temp;
	  for(int i=0; i<num.length;i++) 
	  {    
    	for(int j=0; j<i; j++)
    	{  
    		if(num[i]<num[j]) 
    		{ temp = num[i];
    	    num[i] = num[j];
         	num[j] = temp;
    		} 	
    	}    	 
	  } 
  	}
  	
	void grade(int numin[],int numout[],int num_cor) // 등수
    {
   	 for(int i=0;i<numin.length;i++)
	    {
	    	for(int j=0;j<numin.length;j++)
	    	{
	    	if(numin[i]==numout[j]) 	    	
	    	num_cor++;  
	    	}
	    }
	    System.out.println("당첨번호는"+Arrays.toString(numout)+"입니다.");
	    System.out.println("입력번호는"+Arrays.toString(numin)+"입니다.");
	    System.out.printf("%d개맞았습니다.",num_cor);
        if(num_cor==6) {System.out.println("1등당첨!!!!!!!!!");}
        else if(num_cor==5) {System.out.println("3등입니다.");}
        else if(num_cor==4) {System.out.println("4등입니다.");}
        else if(num_cor==3) {System.out.println("5등입니다.");}
        else {System.out.println("꽝 ㅋ");}
    }
}

설명

generate_nonDup()

->정수 배열을 파라미터로 받아와 1~45범위의 정수값을 중복없이 할당하는 메소드

void generate_nonDup(int num[]) { 
      Random random = new Random();
	  for(int i=0;i<num.length;i++){ 
      num[i] = random.nextInt(45)+1;
         for(int j=0; j<i; j++){
        	if(num[i]==num[j]) {i--; break;}	        	
         }	    	
      }
	}

1.Random 클래스의 nextInt() 메소드는 0 ~ (파라미터의 값-1) 범위의 무작위 정수를 리턴합니다.
즉 random.nextInt(45)+1 은 1~45의 무작위 정수를 리턴
2. 'j' for문 에서는 새로 할당한 값과 이전에 할당된 값들과 비교해 같다면 i를 감소시켜 다시 번호를 할당합니다.
3. 'i' for문을 모두 통과하면 파라미터로 받은 배열에 중복이 없는 1~45의 값이 할당됩니다.

★ 해당 메소드에서 리턴을 하지 않아도 호출부에서 넘긴 배열에 값이 잘 할당되는 이유는
배열을 파라미터로 전달할때는 주소값을 넘겨주기 때문에 그렇다고 생각합니다.

void align()

->정수 배열을 파라미터로 받아와 오름차순으로 정렬하는 메소드

void align(int num[]) 	{ 
 		int temp;
	  for(int i=0; i<num.length;i++) {    
    	for(int j=0; j<i; j++) 	{  
    		if(num[i]<num[j]) { 
            temp = num[i];
    	    num[i] = num[j];
         	num[j] = temp;
    		} 	
    	}    	 
	  } 
  	}
  1. 2중 for문을 이용하여 앞선 값이 뒤에 오는 값보다 클경우 두 값을 서로 바꿉니다.
  2. 'i' for문을 모두 통과하면 해당 배열이 오름차순으로 정렬됩니다.

실행 화면

모드 1

모드 2

모드3


-> (.gif 용량을 줄이기 위해 중간 프레임을 삭제했습니다)

후기

코딩 공부를 시작한지 2~3주정도 되었을때 짰던 코드라서 그런지 지금 다시 봤을때 고쳐야 할 부분이 많은 것 같다
ArrayList를 사용하면 좀 더 쉽고 깔끔하게 짤 수 있을것 같다.

profile
안녕하세요 김민혁입니다.

0개의 댓글