JAVA/HIGH JAVA

4/23 Homework - 야구게임, 로또생성기

아잠만_ 2024. 4. 24. 09:04

야구게임

package kr.or.ddit.basic;

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.Scanner;

/**
 * 숫자 야구 게임 프로그램 만들기
 * 컴퓨터의 숫자는 난수를 이용하여 구한다. (1~9사이는 중복되지 않은 난수 3개)
 * (스트라이크는 S, 볼은 B로 나타낸다.)
 */
public class BaseBallTest {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		HashSet<Integer> set = new HashSet<Integer>();
		while(set.size()<3) {
			set.add((int) (Math.random()*9)+1);
		}
		ArrayList<Integer> num = new ArrayList<Integer>(set);
		Collections.shuffle(num);
		int count = 0;
		while(true) {
			count++;
			int s = 0;
			int b = 0;
			System.out.print("숫자 입력 >> ");
			int input = sc.nextInt();
			int num1 = (input%100)%10; //1
			int num2 = (input%100)/10; //10
			int num3 = input/100; //
			if(!set.add(num1)) {
				if(num.get(2)==num1) {
					s++;
				} else {
					b++;
				}
			} else {
				// 만약 없는경우 추가되었으니 제거
				set.remove(num1);
			}
			if(!set.add(num2)) {
				if(num.get(1)==num2) {
					s++;
				} else {
					b++;
				}
			}else {
				set.remove(num2);
			}
			if(!set.add(num3)) {
				if(num.get(0)==num3) {
					s++;
				} else {
					b++;
				}
			}else {
				set.remove(num3);
			}
			if(s==3) {
				System.out.println("축하합니다.");
				System.out.println("당신은 "+count+"번째만에 맞췄습니다");
				break;
			} else {
				System.out.println(input+" ==> "+s+"S "+b+"B");
				continue;
			}
			
		}
		
	}
}
더보기

메서드를 나눠서 하기

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.Scanner;
import java.util.Set;

/**
 * 숫자 야구 게임 프로그램 만들기 컴퓨터의 숫자는 난수를 이용하여 구한다. (1~9사이는 중복되지 않은 난수 3개) (스트라이크는 S, 볼은
 * B로 나타낸다.)
 */
public class BaseBallTest {
	private ArrayList<Integer> numList; // 난수 저장할 List
	private ArrayList<Integer> userList; // 사용자가 입력한 값을 저장

	private Scanner scan;

	private int strike, ball; // 스트라이크와 볼의 개수가 저장될 변수 선언

	// 생성자
	public BaseBallTest() {
		scan = new Scanner(System.in);
	}

	public static void main(String[] args) {
		new BaseBallTest().gameStart(); // main은 static이기 때문에 객체 생성을 해야함
	}

	// 시작 메서드
	public void gameStart() {
		int count = 0;
		// 난수를 만드는 메서드 호출
		createNum();
		// 확인용 출력
//		System.out.println("컴퓨터의 난수 ==> " + numList);

		do {
			count++;
			// 사용자 입력 메서드 호출
			inputNum();
			
			// 볼카운트하는 메서드 호출
			ballCount();

		} while(strike!=3);
		System.out.println("축하합니다.");
		System.out.println("당신은 " + count + "번째 만에 맞췄습니다");

	}

	// 1~9 사이의 중복되지 않는 난수 3개를 만들어서 List에 저장하는 메서드 (Set)
	private void createNum() {
		Set<Integer> numSet = new HashSet<Integer>();

		// 3개의 난수 만들기
		while (numSet.size() < 3) {
			numSet.add((int) (Math.random() * 9) + 1);
		}

		// 만들어진 난수를 List에 저장하기
		numList = new ArrayList<Integer>(numSet);

		// 데이터 섞기
		Collections.shuffle(numList);
	}

	// 사용자로부터 3개의 정수를 입력 받아 List에 저장하는 메서드
	// 입력한 값들은 중복되지 않게 한다.
	private void inputNum() {
		int n1, n2, n3; // 입력한 값이 저장될 변수

		do {
			System.out.print("숫자 입력 >> ");
			int input = scan.nextInt();
			n1 = scan.nextInt();
			n2 = scan.nextInt();
			n3 = scan.nextInt();
			
//			n3 = (input % 100) % 10; // 1
//			n2 = (input % 100) / 10; // 10
//			n1 = input / 100; //
			if (n1 == n2 || n1 == n3 || n2 == n3) {
				System.out.println("중복되는 숫자는 입력할 수 없습니다. 다시 입력하세요");
			}
		} while (n1 == n2 || n1 == n3 || n2 == n3);

		// 입력한 값을 List에 저장한다
		userList = new ArrayList<Integer>();
		userList.add(n1);
		userList.add(n2);
		userList.add(n3);
	}

	// 스크라이트와 볼판정 및 판정 결과를 출력하는 메서드
	private void ballCount() {
		strike = 0;
		ball = 0;
		for (int i = 0; i < userList.size(); i++) {
			for (int j = 0; j < numList.size(); j++) {
				if (userList.get(i) == numList.get(j)) {
					if (i == j) {
						strike++;
					} else {
						ball++;
					}
				}
			}
		}

		// 볼카운트 결과 출력하기
		System.out.println(
				userList.get(0) + " " + userList.get(1) + " " + userList.get(2) + " ==> " + strike + "S " + ball + "B");
	}
}

 로또생성기

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.Scanner;

public class LottoStore {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		while (true) {
			System.out.println("==========================");
			System.out.println("Lotto 프로그램");
			System.out.println("--------------------------");
			System.out.println("1. Lotto 구입");
			System.out.println("2. 프로그램 종료");
			System.out.println("==========================");
			System.out.print("메뉴선택 : ");
			int sel = sc.nextInt();
			if (sel != 1) {
				System.out.println("감사합니다");
				break;
			}
			System.out.println();
			System.out.println("Lotto 구입 시작");
			System.out.println();
			System.out.println("(1000원에 로또번호 하나입니다.)");
			System.out.print("금액 입력 : ");
			int money = sc.nextInt();
			if(money<1000) {
				System.out.println("입력급액이 너무 적습니다. 로또번호 구입실패!!!");
				continue;
			} else if(money>100000){
				System.out.println("입력 금액이 너무 많습니다. 로또번호 구입실패!!!");
				continue;
			}			
			int count = money / 1000;
			System.out.println("행운의 로또 번호는 아래와 같습니다.");
			for (int i = 0; i < count; i++) {
				int no = i+1;
				System.out.print("로또번호"+no+" : ");
				HashSet<Integer> lotto = new HashSet<Integer>();
				while (lotto.size() < 6) {
					lotto.add((int) (Math.random() * 45 + 1));
				}
				ArrayList<Integer> list = new ArrayList<Integer>(lotto);
				Collections.sort(list);
				System.out.println(list);
			}
			System.out.println();
			int a = money%1000;
			System.out.println("받은 금액은 "+money+"원이고 거스름돈은 "+a+"원입니다.");
			System.out.println();
			continue;
		}
	}

}
더보기

메서드를 나눠서 하기

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.Scanner;

public class LottoStore {
	private Scanner scan = new Scanner(System.in);

	public static void main(String[] args) {
		new LottoStore().lottoStart();
	}

	// 시작 메서드
	public void lottoStart() {
		while (true) {
			int choice = displayMenu();
			switch (choice) {
			case 1:
				int money = buyLotto();
				printLotto(money);
				continue;
			case 2:
				System.out.println("감사합니다");
				return;
			default:
				System.out.println("작업 번호를 잘못 입력했습니다.");
				System.out.println("'1'또는 '2'를 입력하세요.");
			}

		}
	}

	// 메뉴를 출력하고 작업 번호를 입력 받아 반환하는 메서드
	private int displayMenu() {
		System.out.println();
		System.out.println("==========================");
		System.out.println("    Lotto 프로그램");
		System.out.println("--------------------------");
		System.out.println("  1. Lotto 구입");
		System.out.println("  2. 프로그램 종료");
		System.out.println("==========================");
		System.out.print("메뉴선택 : ");
		return scan.nextInt();
	}

	// 로또 구매를 처리하는 메서드
	private int buyLotto() {
		while (true) {
			System.out.println();
			System.out.println("Lotto 구입 시작");
			System.out.println();
			System.out.println("(1000원에 로또번호 하나입니다.)");
			System.out.print("금액 입력 : ");
			int money = scan.nextInt();
			if (money < 1000) {
				System.out.println("입력급액이 너무 적습니다. 로또번호 구입실패!!!");
				continue;
			} else if (money > 100000) {
				System.out.println("입력 금액이 너무 많습니다. 로또번호 구입실패!!!");
				continue;
			}
			return money;
		}
	}
	
	private void printLotto(int money) {
		int count = money / 1000;
		System.out.println("행운의 로또 번호는 아래와 같습니다.");
		for (int i = 0; i < count; i++) {
			int no = i+1;
			System.out.print("로또번호"+no+" : ");
			HashSet<Integer> lotto = new HashSet<Integer>();
			while (lotto.size() < 6) {
				lotto.add((int) (Math.random() * 45 + 1));
			}
			ArrayList<Integer> list = new ArrayList<Integer>(lotto);
			Collections.sort(list);
			System.out.println(list);
		}
		System.out.println();
		int a = money%1000;
		System.out.println("받은 금액은 "+money+"원이고 거스름돈은 "+a+"원입니다.");
		System.out.println();
	}
}

메서드를 나눠서 쓰는 연습할 것