https://beastit.tistory.com/77
👆👆👆이전에 작성한 버전을 구조화해서 메서드(Method)로 구현한 버전이다.👆👆👆
✅ 문제
// 1. 로또 자동 생성 만들기!
// 2. 로도 수동 생성 만들기!
// 3. 내 로또 번호 보기 (Load)
// 4. 종료!
✅ 해결방법
- 번호 자동으로 받기를 선택하면 중복값이 나오게 되는데, 중복되지 않는 수를 받기!
- 사용자로부터 수동으로 번호를 입력받게 되면 , " 1~45 숫자 범위 & 중복 값 "이 나오면 다시 입력받게 하기
- 자동, 수동으로 로또번호를 받고 데이터로 따로 저장한 후 불러오기하면 보일 것!
✅ 코드
package 방과후연습용.Jin;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.PrintWriter;
import java.nio.charset.Charset;
import java.util.Random;
import java.util.Scanner;
public class EX_0628_Program_Structured {
public static void main(String[] args) throws IOException {
//lottos[0][] -> 번호 자동생성, lottos[1][] -> 번호 수동생성
//상수(constant) final을 이용해서 auto, manual을 구분하였음.
final int auto = 0;
final int manual = 1;
int[][] lottos = new int[2][6];
QUIT:
while (true) {
//메뉴 출력 & 번호 입력
int menu = inputMeun();
switch (menu) {
case 1: {
//자동 로또 출력 메서드
autoOutputLotto(lottos,auto);
break;
}
case 2: {
//수동 로또 출력 메서드
manualOutputLotto(lottos,manual);
break;
}
case 3: {
//로또 불러오기
loadLotto();
break;
}
case 4: {
System.out.println("종료");
break QUIT;
}
default:
System.out.println("1~4값만 입력하세요.");
}
}//end while
}
private static void loadLotto() throws IOException{
FileInputStream fis = new FileInputStream("JavaPrj/res/ALottos_save.txt");
FileInputStream fis1 = new FileInputStream("JavaPrj/res/MLottos_save.txt");
Scanner sc = new Scanner(fis);
Scanner sc1 = new Scanner(fis1);
System.out.println("┌───────────────────────────┐");
System.out.println(" 로또를 불러옵니다... ");
System.out.println("└───────────────────────────┘");
System.out.println();
//nextLine으로 한번에 받아옴. (정수형으로 연산작업하는 일이 없어서 String으로 받아옴)
String autoLotto = sc.nextLine();
String manualLotto = sc1.nextLine();
sc1.close();
sc.close();
fis1.close();
fis.close();
System.out.printf("자동 로또번호 %s\n", autoLotto);
System.out.printf("수동 로또번호 %s\n", manualLotto);
}
private static void manualOutputLotto(int[][] lottos, int manual) throws IOException{
Scanner scan = new Scanner(System.in);
System.out.println("┌───────────────────────────┐");
System.out.println(" Lotto 번호 수동 생성 ");
System.out.println("└───────────────────────────┘");
Scanner scan1 = new Scanner(System.in);
boolean onOff = true;
AGAIN:
do {
//사용자의 입력값을 한줄로 받아옴.
System.out.println("┌───────────────────────────┐");
System.out.println(" 1 ~ 45 숫자를 입력하세요 ");
System.out.println(" 예) 1 2 23 24 28 45 ");
System.out.println("└───────────────────────────┘");
System.out.print("입력 > ");
//문자열로 한번에 받아옴.
String input = scan1.nextLine();
String[] arr = input.split(" ");
//문자열로 받아온 숫자를 정수로 변환해줌.
for (int i = 0; i < 6; i++)
lottos[manual][i] = Integer.valueOf(arr[i]);
//입력범위 설정
for (int j = 0; j < 6; j++)
if ((lottos[manual][j] < 1 || 45 < lottos[manual][j])) {
System.out.println("┌──────────────────────────────────┐");
System.out.println( " ★ 1~ 45 범위의 숫자를 입력하세요.★ ");
System.out.println("└──────────────────────────────────┘");
System.out.println("\n ");
continue AGAIN;
}
//중복제거
{
for (int i = 0; i < 6; i++) {
for (int j = 0; j < i; j++) {
if (lottos[manual][i] == lottos[manual][j]) { // 중복 검사
System.out.println("\n ♨ 중복된 요소가 있습니다! ♨\n");
continue AGAIN;
}
}
}
//i 0 | 1 | 2 | 3 | 4 | 5
//j - | 0 | 0 1 | 0 1 2 | 0 1 2 3 | 0 1 2 3 4
}
//로또 저장
System.out.println("┌───────────────────────────┐");
System.out.println(" 저장하실? ");
System.out.println("└───────────────────────────┘");
System.out.println();
System.out.println("\n1. 저장하고 메인메뉴로 가기");
System.out.println("2. 취소하고 메인메뉴로 가기");
System.out.print(">_ ");
int meun2 = scan.nextInt();
switch (meun2) {
case 1: {
System.out.print("\n저장했습니다.");
FileOutputStream fos = new FileOutputStream("JavaPrj/res/MLottos_save.txt");
PrintWriter fout = new PrintWriter(fos, true, Charset.forName("UTF-8"));
for (int i = 0; i < 6; i++)
fout.printf("%d ", lottos[manual][i]);
fout.println();
fout.close();
fos.close();
System.out.println();
break;
}
case 2: {
System.out.println("♨ 저장하지 않고 메인 메뉴로 돌아갑니다. ♨");
break;
}
}
onOff = false;
} while (onOff);
}
private static void autoOutputLotto(int[][] lottos, int auto) throws IOException {
Scanner scan = new Scanner(System.in);
Random rand = new Random();
System.out.println("┌───────────────────────────┐");
System.out.println(" Lotto 번호 자동 생성 ");
System.out.println("└───────────────────────────┘");
System.out.println("┌───────────────────────────┐");
System.out.println(" ↓ ★☆ 로또 번호 ★☆ ↓ ");
System.out.println("└───────────────────────────┘");
//랜덤한 값 추출 & 중복제거
{
for (int i = 0; i < 6; i++) {
lottos[auto][i] = rand.nextInt(45) + 1;//Random(45)는 0~44까지의 범위를 만든다. 그래서 +1
for (int j = 0; j < i; j++) {
if (lottos[auto][i] == lottos[auto][j])
i--;
}
}
}
//추출한 값 작은 숫자부터 정렬(선택정렬)
{
for (int i = 0; i < 6 - 1; i++) {
int minIndex = i;
for (int j = 0; j < (6 - 1) - i; j++) {
if (lottos[auto][minIndex] > lottos[auto][j + 1 + i])
minIndex = i + j + 1;
}
int temp = lottos[auto][i];
lottos[auto][i] = lottos[auto][minIndex];
lottos[auto][minIndex] = temp;
}
}
//로또 출력
{
for (int j = 0; j < 6; j++)
System.out.printf("(%d) ", lottos[auto][j]);
}
System.out.println();
System.out.println("\n1. 저장하고 메인메뉴로 가기");
System.out.println("2. 취소하고 메인메뉴로 가기");
System.out.print(">_ ");
int meun2 = scan.nextInt();
switch (meun2) {
case 1: {
System.out.print("\n ☆★저장했습니다.☆★ ");
FileOutputStream fos = new FileOutputStream("JavaPrj/res/ALottos_save.txt");
PrintWriter fout = new PrintWriter(fos, true, Charset.forName("UTF-8"));
for (int i = 0; i < 6; i++)
fout.printf("%d ", lottos[auto][i]);
fout.println();
fout.close();
fos.close();
System.out.println();
break;
}
case 2: {
System.out.println("저장하지 않고 메인 메뉴로 돌아갑니다.");
break;
}
}
}
private static int inputMeun() {
Scanner scan = new Scanner(System.in);
System.out.println("┌───────────────────────────┐");
System.out.println(" ★\"★ ");
System.out.println(" ★Lotto★ ");
System.out.println(" ★^o^★ ");
System.out.println("└───────────────────────────┘");
System.out.println();
System.out.println("1. 번호 자동 생성");
System.out.println("2. 번호 수동 생성");
System.out.println("3. 내 로또 번호 보기");
System.out.println("4. 종료");
System.out.print("선택 >");
int menu = scan.nextInt();
return menu;
}
}
👍좋았던 점👍
- 메서드로 큰 구성단위들을 묶어놓으니 main함수 부분에서 흐름을 이해하기 편했다.
- 앞으로 추가될 내용이 있으면 메서드 부분만 수정해야 하니 유지보수가 편리할 거 같았다.
🔥어려웠던 점🔥
- 사용자로부터 입력값을 "nextLine();"으로 받아오면 String 배열에 split(메서드)로 하나씩 담아주는 작업
- String으로 받아온 값을 int형으로 변환해주는 작업.
//중복제거
{
for (int i = 0; i < 6; i++) {
for (int j = 0; j < i; j++) {
if (lottos[manual][i] == lottos[manual][j]) { // 중복 검사
System.out.println("\n 중복된 요소가 있습니다! ");
continue AGAIN;
}
}
}
//i 0 | 1 | 2 | 3 | 4 | 5
//j - | 0 | 0 1 | 0 1 2 | 0 1 2 3 | 0 1 2 3 4
}
- 사용자로부터 입력 받은 값에 중복 제거 해주는 작업이 제일 어려웠다.
'IT > 뚝딱뚝딱' 카테고리의 다른 글
[JAVA] ✏️ 이상한 네모(?) 넣기! (0) | 2023.07.02 |
---|---|
[JAVA] ✏️ 숫자 뒤집기! (1) | 2023.07.02 |
[JAVA] ✏️ 로또 프로그램 만들기! (Bottom-Up) (0) | 2023.06.29 |
[JAVA] ✏️ 오목 게임 프로그램을 만들어보자!(데이터 저장및 불러오기) (0) | 2023.06.26 |
[JAVA] ✏️ 오목 게임 프로그램을 만들어보자!(2차원 배열) (6) | 2023.06.25 |