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
Binary file added .DS_Store
Binary file not shown.
51 changes: 51 additions & 0 deletions docs/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
## 📌 구조
- computer
- player
- game
- baseball_number
- end_number
- answer


## 📌 시나리오
1. 숫자 야구 게임을 시작한다.
2. 플레이어가 컴퓨터에 숫자를 입력한다.
3. 컴퓨터가 입력한 숫자에 대한 결과를 플레이어에게 보여준다.
4. 컴퓨터가 게임 종료 여부를 묻는다.
4-a. 게임을 종료한다.
4-b. 게임을 재시작한다.

### 에러 발생
2a. 플레이어 숫자가 아닌 다른 값을 입력한다.
2b. 플레이어 숫자를 입력하지만, 3자리가 아닌값을 입력한다.
2c. 플레이어 중복된 숫자를 입력한다.

4a. 플레이어 숫자가 아닌 다른 값을 입력한다.
4b. 플레이어 숫자를 입력하지만, 1자리가 아닌값을 입력한다.

---

## 🤔기능
1. player(view)
- [ ] 숫자를 입력하라
- [ ] 게임종료 여부를 말해라

2. game
- [ ] 게임을 시작해라
- [ ] 게임을 종료하라
- [ ] 플레이어의 입력에 대한 결과를 제공해라

3. computer
- [ ] 정답 숫자를 만들어라
- [ ] 플레이어의 입력에 대한 결과를 제공해라

4. baseball_number
- [ ] 숫자를 검증하라

5. answer
- [ ] baseball_number를 계산하라
- [ ] 출력할 문자열을 만들어라

6. end_number
- [ ] 숫자를 검증하라
- [ ] game을 종료할지 결정하라
10 changes: 9 additions & 1 deletion src/main/java/baseball/Application.java
Original file line number Diff line number Diff line change
@@ -1,7 +1,15 @@
package baseball;

import baseball.game.Game;

public class Application {
public static void main(String[] args) {
// TODO: 프로그램 구현
boolean end = false;
do {
Game game = new Game();
game.start();
end = game.end();
} while (!end);
}
}
}
48 changes: 48 additions & 0 deletions src/main/java/baseball/domain/Answer.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
package baseball.domain;

import java.util.List;
import java.util.stream.IntStream;

public class Answer {
private enum AnswerStatus {RIGHT, WRONG}

private AnswerStatus status = AnswerStatus.WRONG;
private final Long strike;
private final Long ball;

public Answer(List<Integer> answerNumbers, List<Integer> playerNumbers) {
strike = countStrike(answerNumbers, playerNumbers);
ball = countContain(answerNumbers, playerNumbers) - strike;
if (Long.valueOf(BaseballNumber.BASEBALL_LENGTH).equals(strike)) {
this.status = AnswerStatus.RIGHT;
}
}

private Long countContain(List<Integer> answerNumbers, List<Integer> playerNumbers) {
return answerNumbers.stream().filter(playerNumbers::contains).count();
}

private Long countStrike(List<Integer> answerNumbers, List<Integer> playerNumbers) {
return IntStream.range(0, BaseballNumber.BASEBALL_LENGTH)
.filter(i -> answerNumbers.get(i).equals(playerNumbers.get(i)))
.count();
}

public boolean isStatusWRONG() {
return status.equals(AnswerStatus.WRONG);
}

public String getString() {
String statement = "";
if (ball > 0) {
statement = statement.concat(String.format("%d볼 ", ball));
}
if (strike > 0) {
statement = statement.concat(String.format("%d스트라이크", strike));
}
if (statement.isEmpty()) {
statement = statement.concat("낫싱");
}
return statement;
}
}
47 changes: 47 additions & 0 deletions src/main/java/baseball/domain/BaseballNumber.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
package baseball.domain;


import java.util.ArrayList;
import java.util.List;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
import java.util.stream.Stream;

public class BaseballNumber {
public static final Integer BASEBALL_LENGTH = 3;
private final String REGEXP_PATTERN_INTEGER = String.format("[1-9]{%d}", BASEBALL_LENGTH);
private final List<Integer> numbers;

public BaseballNumber(String input) {
validate(input);
this.numbers = Stream.of(input.split("")).mapToInt(Integer::parseInt).boxed().toList();
}

private void validate(String input) {
isCorrectLength(input);
isInteger(input);
isDuplicate(input);
}

private void isCorrectLength(String input) {
if (input.length() != BASEBALL_LENGTH) {
throw new IllegalArgumentException("입력의 길이가 알맞지 않습니다.");
}
}

private void isInteger(String input) {
if (!Pattern.matches(REGEXP_PATTERN_INTEGER, input)) {
throw new IllegalArgumentException("입력이 정수로 이루어지지 않았습니다.");
}
}

private void isDuplicate(String input) {
if (Stream.of(input.split("")).collect(Collectors.toSet()).size() < BASEBALL_LENGTH) {
throw new IllegalArgumentException("입력 중 중복이 있습니다.");
}
}

public List<Integer> getNumbers() {
return new ArrayList<>(this.numbers);
}
}
29 changes: 29 additions & 0 deletions src/main/java/baseball/domain/Computer.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package baseball.domain;

import camp.nextstep.edu.missionutils.Randoms;
import java.util.ArrayList;
import java.util.List;

public class Computer {
private List<Integer> answerNumbers;

public Computer() {
this.answerNumbers = makeRandomNumbers();
}

private List<Integer> makeRandomNumbers() {
List<Integer> numbers = new ArrayList<>();
while (numbers.size() < BaseballNumber.BASEBALL_LENGTH) {
int randomNumber = Randoms.pickNumberInRange(1, 9);
if (!numbers.contains(randomNumber)) {
numbers.add(randomNumber);
}
}
return numbers;
}

public Answer calculate(BaseballNumber baseballNumber) {
List<Integer> playerNumbers = baseballNumber.getNumbers();
return new Answer(answerNumbers, playerNumbers);
}
}
35 changes: 35 additions & 0 deletions src/main/java/baseball/domain/EndNumber.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
package baseball.domain;

import java.util.regex.Pattern;

public class EndNumber {
public static final Integer END_LENGTH = 1;
private final String REGEXP_PATTERN_FORMAT = String.format("[1-2]{%d}", END_LENGTH);
private final Integer number;

public EndNumber(String input) {
validate(input);
this.number = Integer.parseInt(input);
}

private void validate(String input) {
isCorrectLength(input);
isCorrectNumber(input);
}

private void isCorrectLength(String input) {
if (input.length() != END_LENGTH) {
throw new IllegalArgumentException("입력의 길이가 알맞지 않습니다.");
}
}

private void isCorrectNumber(String input) {
if (!Pattern.matches(REGEXP_PATTERN_FORMAT, input)) {
throw new IllegalArgumentException("입력값이 형식을 만족하지 않습니다.");
}
}

public boolean isEnd() {
return this.number == 2;
}
}
30 changes: 30 additions & 0 deletions src/main/java/baseball/game/Game.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package baseball.game;

import baseball.domain.Answer;
import baseball.domain.BaseballNumber;
import baseball.domain.Computer;
import baseball.domain.EndNumber;
import baseball.view.View;

public class Game {
private Computer computer;

public Game() {
this.computer = new Computer();
}

public void start() {
View.init();
Answer answer;
do {
BaseballNumber baseballNumber = new BaseballNumber(View.input());
answer = computer.calculate(baseballNumber);
View.showAnswer(answer.getString());
} while (answer.isStatusWRONG());
}

public boolean end() {
EndNumber endNumber = new EndNumber(View.showEnd());
return endNumber.isEnd();
}
}
25 changes: 25 additions & 0 deletions src/main/java/baseball/view/View.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package baseball.view;

import camp.nextstep.edu.missionutils.Console;

public class View {

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

public static String input() {
System.out.println("숫자를 입력해주세요 : ");
return Console.readLine();
}

public static void showAnswer(String statement) {
System.out.println(statement);
}

public static String showEnd() {
System.out.println("3개의 숫자를 모두 맞히셨습니다! 게임 종료");
System.out.println("게임을 새로 시작하려면 1, 종료하려면 2를 입력하세요.");
return Console.readLine();
}
}