로또 프로그램 만들기
※ 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 |