Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

eeungji 야구게임 연습 #2804

Open
wants to merge 1 commit into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion src/main/java/baseball/Application.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

public class Application {
public static void main(String[] args) {
// TODO: 프로그램 구현
BaseBallGame baseBallGame = new BaseBallGame();
baseBallGame.play();
}
}
28 changes: 28 additions & 0 deletions src/main/java/baseball/BallStrikeEvaluator.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package baseball;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class BallStrikeEvaluator {
public Map<String, Integer> evaluate(List<Integer> answer, List<Integer> userBalls){

int strike = 0;
int ball = 0;

for (int i = 0; i < answer.size(); i++) {
for (int j = 0; j < userBalls.size(); j++) {
if (answer.get(i) == userBalls.get(j) && i == j ) { // 인덱스 위치가 같고, 숫자가 같으면 스트라이크
strike++;
} else if(answer.get(i) == userBalls.get(j) && i != j) { // 숫자만 같으면 볼
ball++;
}
}
}

Map<String, Integer> result = new HashMap<>();
result.put("strike", strike);
result.put("ball", ball);
return result;
}
}
42 changes: 42 additions & 0 deletions src/main/java/baseball/BaseBallGame.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
package baseball;

import java.util.List;
import java.util.Map;

public class BaseBallGame {

void play() {

OutputView outputView1 = new OutputView();
outputView1.startMessage();

// 컴퓨터 세자리 숫자 랜덤 생성
NumberGenerator playComputer = new NumberGenerator();
List<Integer> randomNumber = playComputer.makeThreeRandomNumber();

int replay = 0;

while(replay != 2) {

if(replay == 1) {
playComputer = new NumberGenerator();
randomNumber = playComputer.makeThreeRandomNumber();
}

InputView inputView = new InputView();
List<Integer> inputNumbers = inputView.inputNumbers();

BallStrikeEvaluator evaluator = new BallStrikeEvaluator();
Map<String, Integer> evaluate = evaluator.evaluate(randomNumber, inputNumbers);// 볼, 스트라이크 판단

OutputView outputView = new OutputView(); // strike, ball 개수 판단
outputView.printResult(evaluate);

//3스트라이크가 아니면 다시 입력해 주세요
if(evaluate.get("strike") == 3) {
replay = inputView.selectNewGameOrQuitGame();

}
}
}
}
59 changes: 59 additions & 0 deletions src/main/java/baseball/InputView.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
package baseball;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import static camp.nextstep.edu.missionutils.Console.readLine;

public class InputView {
public List<Integer> inputNumbers() {

System.out.print("숫자를 입력해주세요 : ");

String inputNumber = readLine();
// 입력된 값이 숫자로 변환 가능한지 확인
try {
Integer.parseInt(inputNumber);
} catch (NumberFormatException e) {
throw new IllegalArgumentException("유효한 숫자를 입력해주세요.");
}

// 입력된 숫자 중복 확인
Set<Integer> nonDuplicatedNumbers = new HashSet<>();
for (char number : inputNumber.toCharArray()) {
if (!Character.isDigit(number)) {
throw new IllegalArgumentException("숫자만 입력해주세요.");
}
nonDuplicatedNumbers.add(Character.getNumericValue(number));
}

// 중복된 숫자가 없고 3개의 숫자인지 확인
if (nonDuplicatedNumbers.size() != 3) {
throw new IllegalArgumentException("3개의 중복되지 않는 숫자를 입력해주세요.");
}

return new ArrayList<>(nonDuplicatedNumbers);
}


//역할: 사용자로 부터 게임을 새로 시작하려면 1, 종료하려면 2를 입력받는 기능 구현
public int selectNewGameOrQuitGame() {
System.out.println();
System.out.println("게임을 새로 시작하려면 1, 종료하려면 2를 입력하세요.");
String inputNumber = readLine();
try {
int number = Integer.parseInt(inputNumber);
if(number != 1 && number != 2) {
throw new IllegalArgumentException("1 또는 2를 입력해주세요.");
}
return number;
} catch (NumberFormatException e) {
throw new IllegalArgumentException("유효한 숫자를 입력해주세요.");
}
// //정수값으로 반환
// int number = Integer.parseInt(inputNumber);
// return number;
}
}
23 changes: 23 additions & 0 deletions src/main/java/baseball/NumberGenerator.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package baseball;

import camp.nextstep.edu.missionutils.Randoms;

import java.util.ArrayList;
import java.util.List;

public class NumberGenerator {
// 기능: 컴퓨터의 서로 다른 세자리 숫자 선택
public List<Integer> makeThreeRandomNumber() {

List<Integer> randomNumbers = new ArrayList<>();

while (randomNumbers.size() < 3) {
int randomNumber = Randoms.pickNumberInRange(1, 9);
if (!randomNumbers.contains(randomNumber)) {
randomNumbers.add(randomNumber);
}
}
System.out.println(randomNumbers);
return randomNumbers;
}
}
32 changes: 32 additions & 0 deletions src/main/java/baseball/OutputView.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package baseball;

import java.util.Map;

public class OutputView {
public void startMessage() {
System.out.println("숫자 야구 게임을 시작합니다.");
}

//역할: 스트라이크, 볼, 낫싱을 반환하는 역할
public void printResult(Map<String, Integer> result) {
Integer strike = result.getOrDefault("strike", 0);
Integer ball = result.getOrDefault("ball", 0);

if (strike == 0 && ball == 0) {
System.out.print("낫싱");
}
if (ball != 0 && strike == 0) {
System.out.print(ball + "볼");
}
if (strike != 0 && ball == 0) {
System.out.print(strike + "스트라이크");
}
System.out.println();

if (strike == 3) {
System.out.println();
System.out.print("3개의 숫자를 모두 맞히셨습니다! 게임 종료");
System.out.println();
}
}
}