본문 바로가기

자바 수업 정리

수업정리 11일차.

로또 프로그램 만들기

※ menu
 * 1. 로또 번호 생성 (수동) : 사용자가 직접 번호 입력
 * 2. 로또 번호 생성 (자동) : Random
 * 3. 당첨번호 입력(수동,자동) : 사용자가 직접 입력
 * 4. 당첨확인 : 가장 마지막에 발행한 당첨번호로 확인
 * 5. 역대 당첨번호 목록 확인
 * 6. 종료

 

로또는 상속을 하여 사용
Lotto class => 사용자의 번호를 저장하는 클래스
LottoExtend class => 당첨번호 클래스 Lotto를 상속 + 보너스번호
LottoController => 처리
LottoMain => 실행

 


 

Lotto 클래스

 

상속을 위해 protected로 선언

	protected int numbers[] = new int[6];
	protected int st; //회차
	
	//유지보수를 편리하게 하기위해
	protected int random() {
		return new Random().nextInt(45)+1;
	}

 

사용자번호 + 당첨번호 같이 사용하는 배열을 선언과 몇회차인지 알 수 있게 회차를 선언.

 

번호 생성을 위해 배열초기화와 중복제거 메서드를 먼저 만들어줘야함.

 

배열 초기화 메서드

 

	protected void init() {
		numbers = new int[6]; //기존 배열 버리고 새배열로 추가
	}

 

중복제거 메서드

 

	protected boolean isContain(int num) {
		if(num <0 || num >45) {
			//오류발생
			throw new RuntimeException("숫자의 범위는 1~45까지 입니다.");
		}
		for(int tmp : numbers) {
			if(tmp == num) {
				return true;
			}
		}
		return false;
	}

 

 

랜덤번호 6개를 numbers[]에 채우는 메서드 (중복제거)  [ 자동 ]

 

	protected void randomLotto() {
		//배열초기화
		init();
		int cnt=0;
		while(cnt < numbers.length) {
			int r = random();
			if(!isContain(r)) {
				numbers[cnt] = r;
				cnt++;
			}
		}
	}

 

 

번호를 수동으로 생성하는 메서드( (이미 중복제거 확인 후 넘어오는 배열)을 numbers[] 에 배열복사)

 

protected void insertNumbers(int arr[]) {
		if(arr.length > numbers.length) { // 7자리는 허용
			throw new RuntimeException("배열의 길이를 확인하세요.");
		}
		// 만약 7자리의 값을 가져오면 마지막 1자리를 버리겠다.
		System.arraycopy(arr, 0, numbers, 0, numbers.length);
	}

 

throw new RuntimeException은  잘못됐을때 일부로 오류를 발생시켜줌.

7자리는 보너스넘버로 쓰기위해 허용

 

번호확인 메서드 toString 사용

 

	@Override
	public String toString() {
		return st+"회차 "+Arrays.toString(numbers);
	}

 

LottoExtend 클래스

 

public class LottoExtend extends Lotto {
	private int bonus; //보너스 번호만 있으면 됨.

	@Override
	protected void randomLotto() {
		super.randomLotto();
		while(true) {
			int r = random();
			if(!isContain(r)) {
				bonus= r;
				break;
			}
		}
	}

	@Override
	protected void init() {
		// 배열 초기화
		super.init(); //numbers 배열을 새로만들어 놓은 상태
		bonus = 0;
	}

 

상속해주고 Extend 에는 필요한 보너스번호만 선언.

기존 numbers 6자리 배열 채우기는 이미 완성돼 있으므로 

기존 번호에 중복없이 보너스 번호 생성이 가능하도록 작성.

 

초기화도 상속받고 bonus = 0; 추가해줌.

 

@Override
	protected void insertNumbers(int[] arr) {
		// 가져온 번호가 7자리일 경우...
		super.insertNumbers(arr); //6자리만 넣기
		this.bonus = arr[numbers.length]; //6번지 채우기 나머지는 버리기
	}
	
	protected void insertNumbers(int[] arr, int bonus) {
		// 가져온 번호는 6자리, 보너스를 별도로 가져오는 경우...
		super.insertNumbers(arr);
		this.bonus = bonus;
	}

	@Override
	public String toString() {
		// TODO Auto-generated method stub
		return super.toString()+"["+bonus+"]";
	}

 

인서트 넘버를 상속받아  보너스 넘버를 받을 수 있도록 만들어줌.

 

LottoController 클래스

 

public class LottoController {
	//당첨번호는 여러개 배열로 저장
	private LottoExtend lotto[] = new LottoExtend[5];
	private int lCount=0;
 	//사용자 번호는 1개
	private Lotto user = new Lotto();
	
	private int st = 0; //회차 값
	
	public void createLotto(Scanner scan) {
		// 수동 로또번호 입력
		System.out.println("로또번호입력(중복X, 1~45, 숫자6개)>");
		int tmp[] = new int[6];
		for(int i=0; i<tmp.length; i++) {
			tmp[i] = scan.nextInt();
		}
		if(isDuplicated(tmp)) {
			System.out.println("오류발생. 다시입력하세요!!");
		}else {
			user.insertNumbers(tmp);
			user.st = this.st+1;
			System.out.println(user);
		}		
	}
	
	//수동으로 입력되는 로또번호의 중복체크, 범위체크
	public boolean isDuplicated(int arr[]) {
		//중복확인
		for(int i=0; i<arr.length; i++) {
			for(int j=i+1; j<arr.length; j++) {
				if(arr[i] == arr[j]) {
					return true;
				}
			}
		}
		
		//범위확인
		for(int i=0; i<arr.length; i++) {
			if(arr[i]<0 || arr[i]>45) {
				return true;
			}
		}
		return false;
	}

	public void createLottoAuto() {
		// 자동 로또번호 입력
		user.randomLotto();
		user.st = this.st+1;
		System.out.println(user);
	}

	public void insertLotto(Scanner scan) {
		// 당첨번호 수동생성
		System.out.println("당첨번호입력(중복X, 1~45, 숫자7개)>");
		int tmp[] = new int[6];
		
		for(int i=0; i<tmp.length; i++) {
			tmp[i] = scan.nextInt();
		}
		int bonus = scan.nextInt();
		
		if(isDuplicated(tmp)) {
			System.out.println("오류발생. 다시입력하세요!!");
		}else {
			LottoExtend tmpLotto = new LottoExtend();
			tmpLotto.insertNumbers(tmp, bonus);
			this.st++;
			tmpLotto.st = st;
			lotto[lCount] = tmpLotto;
			lCount++;
			System.out.println(tmpLotto);
		}		
		
	}

	public void checkLotto() {
    
		if(user.isContain(0)) { // 모든값이 다 채워지지않았거나 하나도 채워지지 않을경우
		System.out.println("체크할 번호가 없습니다.");
		return;
		}
        
		// 당첨번호가 없을 경우
		if(lCount == 0) {
			System.out.println("당첨 번호가 없습니다.");
			return;
		}
		
		
		int cnt = 0;
		// 가장 마지막 당첨번호 저장
		LottoExtend tmp = lotto[lCount-1];
		
		
		//회차 일치여부 확인
		if(tmp.getSt() != user.getSt()) {
			System.out.println("회차가 맞지 않습니다.");
			return;
		}
		
		
		// for문으로 일치하는 개수 확인
		for(int i=0; i < user.getNumbers().length; i++) {
			int num = tmp.getNumbers()[i];
			if(user.isContain(num)) {
				cnt++;
			}
		}
		int rank = -1;
		
		switch(cnt) {
		case 6: rank = 1; break;
		case 5: 
			if(user.isContain(tmp.getBonus())) {
				rank = 2;
			} else {
				rank = 3;
			}
			
			break;
		case 4: rank = 4; break;
		case 3: rank = 5; break;
		default:
			System.out.println("꽝~!!!");
		}
		if(rank != -1) {			
			System.out.println(rank + "등 당첨~!!");
		}
	
		
	}

	public void printLotto() {
		// 역대 당첨번호 리스트 확인
		System.out.println("--당첨번호리스트--");
		for(int i=0; i<lCount; i++) {
			System.out.println(lotto[i]);
		}
		
	}

}

 

당첨번호는 LottoExtend로 객체를 만들어 lotto[] 배열에 저장 할 수 있도록하고

사용자의 수동, 자동번호는 Lotto로 객체를만들어 lotto에 저장 할 수 있도록하여 

 

사용자의 lotto한장을 lotto[] 배열안에 당첨번호와 비교해서 결과를 확인 할 수있도록 함.

lotto[] 의 당첨 로또번호 개수를 추적하는 역할을하는 lCount도 선언.

 

만들어놨던 메서드들을 이용해서 처리할 수 있도록 구현함.

 

LottoMain 클래스

 

package Lotto;

import java.util.Scanner;

public class LottoMain {

	public static void main(String[] args) {


		Scanner scan = new Scanner(System.in);
		
		LottoController lc = new LottoController();
		int menu = 0;
		do {
			System.out.println("--menu--");
			System.out.println("1. 로또 번호 생성 (수동)|2. 로또 번호 생성 (자동)");
			System.out.println("3. 당첨번호 입력(수동,자동)|4. 당첨확인|5. 역대 당첨번호확인|6. 종료");
			System.out.println("menu>");
			menu = scan.nextInt();
			switch(menu) {
			case 1: lc.createLotto(scan); break;
			case 2: lc.createLottoAuto(); break;
			case 3: lc.insertLotto(scan); break;
			case 4: lc.checkLotto(); break;
			case 5: lc.printLotto(); break;
			case 6: System.out.println("종료"); break;
			default: System.out.println("잘못된 메뉴~!!");
			}
		}while(menu != 6);
		scan.close();

	}

}

 

do while 문을 써서 6번을 고르지않으면 계속 돌아가게하고, 컨트롤러에서 만들어놨던걸 가져와서 로또 프로그램이 정상적으로 돌아가도록 구현.

'자바 수업 정리' 카테고리의 다른 글

수업정리 13일차.  (2) 2024.10.08
수업정리 12일차.  (5) 2024.10.07
수업정리 10일차.  (1) 2024.10.02
수업정리 9일차.  (1) 2024.09.30
자바 설정 관련  (1) 2024.09.25