Skip to content
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
4 changes: 2 additions & 2 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ version '1.0-SNAPSHOT'

repositories {
mavenCentral()
maven { url 'https://jitpack.io' }
maven { url 'https://jitpack.io/' }
}

dependencies {
Expand All @@ -22,4 +22,4 @@ java {

test {
useJUnitPlatform()
}
}
54 changes: 53 additions & 1 deletion src/main/java/baseball/Application.java
Original file line number Diff line number Diff line change
@@ -1,7 +1,59 @@
package baseball;

import baseball.rule.CountNums;
import baseball.rule.CreateRandomNum;
import baseball.rule.*;
import camp.nextstep.edu.missionutils.Console;

import java.util.*;

public class Application {
public static void main(String[] args) {
// TODO: 프로그램 구현
boolean playAgain = true;

View.PrintGameStart();

while (playAgain) {
//난수 생성
List<Integer> computerNumbers = CreateRandomNum.ComputerRandomNumbers();
boolean gameWon = true;

//사용자 입력 및 게임 실행
while (gameWon) {
String userInput = View.readUserNumbers();

InputValidator.validate(userInput);

List<Integer> userNumbers = Conversion.convertToIntegerList(userInput); // 입력값 -> 정수
Result result = CountNums.getResult(computerNumbers, userNumbers); // strike, ball 계산

if (result.isAllStrike()) { // result.isAllStrike()
System.out.println("3스트라이크");
System.out.println("3개의 숫자를 모두 맞히셨습니다! 게임 종료");
gameWon = false;
} else if (!result.isNothing()) {
System.out.printf("%d볼 %d스트라이크\n", result.balls, result.strikes);
} else {
System.out.println("낫싱");
}
}

// 게임 재시작 여부
System.out.println("게임을 새로 시작하려면 1, 종료하려면 2를 입력하세요.");
String restart = Console.readLine(); // 1 또는 2 입력

if (restart.equals("1")) {
playAgain = true;
} else if (restart.equals("2")) {
playAgain = false;
} else {
System.out.println("잘못된 값을 입력하셨습니다. 게임을 종료합니다.");
throw new IllegalArgumentException();
}
}

View.PrintGameEnd();
Console.close();
}

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

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

public class Conversion {

public static List<Integer> convertToIntegerList(String input) {
List<Integer> numbers = new ArrayList<>();
for (char ch : input.toCharArray()) {
numbers.add(Character.getNumericValue(ch));
}
return numbers;
}
}
22 changes: 22 additions & 0 deletions src/main/java/baseball/rule/CountNums.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package baseball.rule;

import java.util.List;

public abstract class CountNums {

public static Result getResult(List<Integer> computerNumbers, List<Integer> userNumbers) {
int strikes = 0;
int balls = 0;

for (int i = 0; i < 3; i++) {
if (computerNumbers.get(i).equals(userNumbers.get(i))) {
strikes++;
} else if (computerNumbers.contains(userNumbers.get(i))) {
balls++;
}
}

return new Result(strikes, balls);
}
}

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

import java.util.*;

public class CreateRandomNum {
// 난수 생성
public static List<Integer> ComputerRandomNumbers() {
Random random = new Random();
Set<Integer> numbers = new HashSet<>();

while (numbers.size() < 3) {
numbers.add(random.nextInt(9) + 1); // 1부터 9까지의 랜덤 3개 숫자
}

return new ArrayList<>(numbers);

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

import java.util.HashSet;
import java.util.Set;

public class InputValidator {
public static void validate(String userInput) {
// IllegalArgumentException
if (!ValidInput(userInput)) {
System.out.println("잘못된 값을 입력하셨습니다. 게임을 종료합니다.");
throw new IllegalArgumentException();
}
}

// 사용자 입력값 유효성 (IllegalArgumentException)
private static boolean ValidInput(String input) {
if (input.length() != 3) return false;

Set<Character> unique = new HashSet<>();
// 중복된 숫자를 확인하기 위해 숫자를 저장할 공간 생성
Set<Character> uniqueNumbers = new HashSet<>();
// 입력값의 각 문자를 하나씩 확인
for (int i = 0; i < input.length(); i++) {
char ch = input.charAt(i); // 입력값에서 한 글자 가져오기

//숫자가 아닌 경우
if (!Character.isDigit(ch) || ch == '0') {
return false;
}
uniqueNumbers.add(ch);
}
return uniqueNumbers.size() == 3;
}
}
19 changes: 19 additions & 0 deletions src/main/java/baseball/rule/Result.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package baseball.rule;

public class Result {
public int strikes;
public int balls;

public Result(int strikes, int balls) {
this.strikes = strikes;
this.balls = balls;
}

public boolean isAllStrike() {
return strikes == 3;
}

public boolean isNothing() {
return strikes == 0 && balls == 0;
}
}
19 changes: 19 additions & 0 deletions src/main/java/baseball/rule/View.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package baseball.rule;

import camp.nextstep.edu.missionutils.Console;

public class View {
public static String readUserNumbers() {
System.out.print("숫자 3개 입력하세요: ");

return Console.readLine();
}

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

public static void PrintGameEnd(){
System.out.println("게임을 종료합니다.");
}
}