romworld

컬랙션 프레임워크 연습 문제 1(베이스볼게임) 본문

JAVA/문제풀이

컬랙션 프레임워크 연습 문제 1(베이스볼게임)

inderrom 2022. 10. 28. 01:24

 

베이스볼

 

package kr.or.ddit.basic;

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

/*
	문제) 숫자 야구 게임 프로그램을 작성하시오.
		컴퓨터의 숫자는 난수를 이용하여 구한다. (이 때 Set을 이용한다.)
		(스트라이크는 S, 볼은 B로 나타낸다.)
		
	예시)
		컴퓨터의 난수 ==> 9 5 7 
		
	실행예시)  숫자랑 자리가 같으면 스트라이크 자리가 다르지만 숫자가 같으면 볼
		숫자입력 => 3 5 9
		3 5 9 => 1S 1B
		숫자입력 => 7 8 9
		7 8 9 => 0S 2B
		숫자입력 => 9 7 5
		9 7 5 => 1S 2B
		숫자입력 => 9 5 7
		9 5 7 => 3S 0B
		
		축하합니다...
		당신은 4번째만에 맞췄습니다.

 */
public class BaseBallTest {

	private List<Integer> comList; // 컴퓨터의 난수가 저장될 List변수
	private List<Integer> userList; // 사용자가 입력한 값이 저장될 List변수
	private int strike; // 스트라이크 갯수
	private int ball; // 볼의 갯수

	private Scanner scan = new Scanner(System.in);

	// 1 ~ 9 사이의 중복되지 않는 난수 3개를 만드는 메서드 (Set 이용한다.)
	public void createNum() {
		Set<Integer> numSet = new HashSet<Integer>();

		// 1 ~ 9사이의 난수 3개 만들기
		Random rnd = new Random();
		while (numSet.size() < 3) {
			numSet.add(rnd.nextInt(9) + 1);
		}

		// 만들어진 난수를 List에 저장한다.
		comList = new ArrayList<Integer>(numSet);

		// List의 데이터를 섞어준다. (set이 이상한게 알아서 지들이 정렬되는 거 같음)
		Collections.shuffle(comList);

	}

	// 사용자로부터 서로 다른 정수 3개를 입력받아서 List에 저장하는 메서드
	public void inputUserNum() {
		int n1, n2, n3; // 입력한 정수가 저장될 변수 선언

		do { // 숫자 세개가 떨어져서 나오게 하려구
			System.out.println("숫자 입력 => ");
			n1 = scan.nextInt();
			n2 = scan.nextInt();
			n3 = scan.nextInt();

			// scan.nextLine() 빼놓고 next~()는 띄어쓰기, 탭,엔터로 데이터를 구분한다.
			// 그래서 띄어쓰기, 탭,엔터 값을 빼고 데이터만 가져가게 된다
			// 키 - 입력버퍼- 컴
			// nextLine()의 경우는 마지막에 엔터키도 데이터로 보고 같이 가져간다.

			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);
	}

	// 스트라이크와 볼을 판정하고 결과를 출력하는 메서드
	public void ballCount() {
		strike = ball = 0; // 스트라이크와 볼의 개수 초기화

		for (int i = 0; i < userList.size(); i++) {
			for (int j = 0; j < comList.size(); j++) {
				if (userList.get(i) == comList.get(j)) { // 값이 같은지 비교...
					if (i == j) {
						strike++;
					} else {
						ball++;
					}
				}
			}
		}

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

	// 게임 시작 메서드
	public void startGame() {

		System.out.println(" **숫자 야구 게임 **");
		System.out.println();

		// 컴퓨터의 난수 만들기
		createNum();
		// System.out.println("확인용 ==> " + comList);

		int cnt = 0; // 몇번만에 맞췄는지를 저장하는 변수

		do {
			cnt++;

			inputUserNum(); // 값 입력
			ballCount(); // 볼카운트 처리

		} while (strike != 3); // 3 스트라이크가 될 때까지 반복처리..

		System.out.println();
		System.out.println("축하합니다...");
		System.out.println("당신은 " + cnt + "번째만에 맞췄습니다...");
	}

	public static void main(String[] args) {
		new BaseBallTest().startGame();

	}
}

 

 

Comments