Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
52 commits
Select commit Hold shift + click to select a range
f0b7dda
Docs: 기능 목록 추가
bj-son May 25, 2023
cb16320
Design: 공용 인터페이스 설계
bj-son May 25, 2023
27d350b
Docs: 유스케이스 추가
bj-son May 25, 2023
d8a7cff
Docs: 도메인 모델 추가
bj-son May 25, 2023
b7a3619
Feat: 게임 시작 기능 추가
bj-son May 25, 2023
6ff265b
Docs: 화면 기능 추가
bj-son May 25, 2023
7947800
Docs: 판정 결과 기능 추가
bj-son May 25, 2023
f63930c
Refactor: 판정 결과가 스스로 최대 스트라이크 개수인지 판단하도록 변경
bj-son May 25, 2023
e4669f6
Docs: 판정 결과에서 게임 의존성 제거
bj-son May 25, 2023
f178cb7
Docs: 판정 결과에서 낫싱 제거
bj-son May 25, 2023
80a6d1b
Feat: 게임 재시작 혹은 종료 기능 추가
bj-son May 25, 2023
4a1d9e6
Fix: 게임 진행 시 숫자 입력 메세지 출력하도록 수정
bj-son May 25, 2023
81113c9
Style: 의미없는 줄간격 제거 및 자바 코드 컨벤션 적용
bj-son May 25, 2023
9143932
Fix: 상수에 final 키워드 추가
bj-son May 25, 2023
e42de43
Design: View 공용 인터페이스 추가
bj-son May 25, 2023
148e28d
Feat: 심판이 스트라이크와 볼 개수 판정하는 기능 추가
bj-son May 25, 2023
9face11
Feat: 게임 재시작 시 상대방에게 숫자 변경 요청 기능 추가
bj-son May 25, 2023
298039e
Refactor: 상대방 메소드 네임 변경
bj-son May 25, 2023
83ba3be
Feat: 상대방 숫자 반환 기능 추가
bj-son May 25, 2023
41aca22
Feat: 랜덤하게 범위 내 3자리 숫자 생성 기능 추가
bj-son May 25, 2023
1a3ad26
Feat: 상대방 숫자 초기화 기능 추가
bj-son May 25, 2023
83985e0
Feat: 플레이어 숫자 반환 기능 추가
bj-son May 25, 2023
7f6bdbf
Feat: 플레이어 입력 타입 변환 기능 추가
bj-son May 25, 2023
994b5b8
Design: Validator 인터페이스 변경
bj-son May 25, 2023
7b4b3a0
Docs: 유효성 검사기 기능 문서 수정
bj-son May 25, 2023
48dd348
Feat: 플레이어가 콘솔로 받은 입력이 숫자인지 판단하는 기능 추가
bj-son May 25, 2023
5a5ebf3
Feat: 플레이어가 콘솔로 받은 입력에 중복된 수가 있는지 판단하는 기능 추가
bj-son May 25, 2023
fcb643e
Docs: 유효성 검사 기능 문서 수정
bj-son May 25, 2023
846e8a6
Feat: 플레이어가 콘솔로 받은 입력이 입력 숫자 범위 내에 존재하는지 판단하는 기능 추가
bj-son May 25, 2023
ad02ffb
Feat: 플레이어가 콘솔로 받은 입력의 길이가 올바른지 판단하는 기능 추가
bj-son May 25, 2023
211d066
Feat: 숫자 입력 메세지 출력 기능 추가
bj-son May 25, 2023
dd50429
Docs: 화면 출력 기능 문서 수정
bj-son May 25, 2023
740f8f9
Feat: 게임 종료 메세지와 게임 재시작 혹은 종료 여부를 입력하도록 출력하는 기능 추가
bj-son May 25, 2023
6423ab8
Feat: 스트라이크와 볼 개수 혹은 낫싱을 출력하는 기능 추가
bj-son May 25, 2023
260fce8
Fix: 상대방 숫자 인스턴스화
bj-son May 25, 2023
3973b6e
Docs: 상대방 숫자 생성 기능 수정
bj-son May 25, 2023
666e9d5
Fix: 상대방 숫자 생성시 숫자가 중복되지 않도록 변경
bj-son May 25, 2023
bb196eb
Refactor: 메세지 enum화
bj-son May 26, 2023
1bfb42d
Refactor: 객체들간 연관관계 변경
bj-son May 26, 2023
0c9db22
Refactor: View 함수 분리
bj-son May 26, 2023
bf7ac00
Refactor: 객체 간 관계 변경
bj-son May 26, 2023
42d85b4
Refactor: 게임 재시작, 종료 유즈케이스를 main에서 시작하도록 변경
bj-son May 26, 2023
9e9cf8c
Refactor: View에서 메세지 상수이용하도록 변경
bj-son May 26, 2023
5f9a299
Refactor: 불필요한 함수 제거 및 함수 추출
bj-son May 26, 2023
001ec54
Style: 불필요한 공백 제거
bj-son May 26, 2023
0c04639
Docs: 도메인 모델, 기능 목록 업데이트
bj-son May 26, 2023
afa4af1
Style: 불필요한 공백 제거
bj-son May 27, 2023
acdfda5
Refactor: 객체간 관계 변경
bj-son May 27, 2023
c8f7aca
Refactor: 함수 추출 및 메소드 네임 변경
bj-son May 27, 2023
be024c9
Docs: 도메인 모델 수정
bj-son May 27, 2023
1d67e2c
Refactor: 함수 쪼개기
bj-son May 27, 2023
3e9355d
Fix: 3스트라이크 시 스트라이크 개수 출력하도록 수정
bj-son May 27, 2023
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
33 changes: 33 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,39 @@

- 미션은 **기능 요구사항, 프로그래밍 요구사항, 과제 진행 요구사항** 세 가지로 구성되어 있다.
- 세 개의 요구사항을 만족하기 위해 노력한다. 특히 기능을 구현하기 전에 기능 목록을 만들고, 기능 단위로 커밋 하는 방식으로 진행한다.
## 유스케이스
- 게임을 시작하라
- 게임을 재시작하라
- 게임을 종료하라

## 도메인 모델
![img.png](img.png)


## 기능 목록
- 게임
- 게임을 시작하는 기능
- 게임을 종료하는 기능
- 심판
- 플레이어와 상대방으로부터 숫자를 받아 스트라이크와 볼 개수를 판단하는 기능
- 화면
- 숫자 입력 메세지 출력 기능
- 스트라이크와 볼 개수 혹은 낫싱을 출력하는 기능
- 3개의 숫자를 모두 맞혔을 때 게임 종료 메세지와 게임 재시작 혹은 종료 여부를 입력하도록 출력하는 기능
- 플레이어
- 문자열 타입 숫자를 숫자형 리스트로 변환하는 기능
- 심판의 요청에 따라 입력받은 유효한 숫자를 반환하는 기능
- 유효성 검사기
- 플레이어가 콘솔로 받은 입력이 숫자인지 판단하는 기능
- 플레이어가 콘솔로 받은 입력에 중복된 수가 있는지 판단하는 기능
- 플레이어가 콘솔로 받은 입력이 입력 숫자 범위 내에 존재하는지 판단하는 기능
- 플레이어가 콘솔로 받은 입력의 길이가 올바른지 판단하는 기능
- 상대방(컴퓨터)
- 랜덤하게 범위 내의 중복되지 않는 3자리 숫자를 생성하는 기능
- 심판의 요청에 따라 자신의 숫자를 반환하는 기능
- 판정 결과
- 스트라이크 판정 개수가 최대 스트라이크 개수인지 판단 기능


## ✉️ 미션 제출 방법

Expand Down
Binary file added img.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
20 changes: 19 additions & 1 deletion src/main/java/baseball/Application.java
Original file line number Diff line number Diff line change
@@ -1,7 +1,25 @@
package baseball;

import camp.nextstep.edu.missionutils.Console;

import static baseball.Message.SIGNAL_INVALID_ERROR;

public class Application {
public static void main(String[] args) {
//TODO: 숫자 야구 게임 구현
final String RESTART_SIGNAL = "1";
final String CLOSE_SIGNAL = "2";

Game game = new Game();
game.proceed();

String signal = Console.readLine();
while (signal.equals(RESTART_SIGNAL)) {
game.proceed();
signal = Console.readLine();
}

if (!signal.equals(CLOSE_SIGNAL)) {
throw new IllegalArgumentException(SIGNAL_INVALID_ERROR.getBody());
}
}
}
46 changes: 46 additions & 0 deletions src/main/java/baseball/Game.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
package baseball;

public class Game {
private Referee referee;

private Player player;

private Opponent computer;

private boolean isRunning;


public void proceed() {
initializeProperty();

while (isRunning) {
run();
}

close();
}

private void initializeProperty() {
referee = new Referee();
player = new Player();
computer = new Opponent();
isRunning = true;
}

private void run() {
View.print(Message.INPUT_NUMBER_GUIDE);
JudgementResult judgementResult = referee.judge(player.getNumber(), computer.getNumber());
View.print(judgementResult);
determineKeepRunning(judgementResult);
}

private void determineKeepRunning(JudgementResult judgementResult) {
if (judgementResult.isMaxStrike()) {
isRunning = false;
}
}

private void close() {
View.println(Message.RESTART_OR_CLOSE_GUIDE);
}
}
27 changes: 27 additions & 0 deletions src/main/java/baseball/JudgementResult.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package baseball;

public class JudgementResult {
private final int numberOfStrike;

private final int numberOfBall;

private final int MAX_STRIKE = 3;


public JudgementResult(int numberOfStrike, int numberOfBall) {
this.numberOfStrike = numberOfStrike;
this.numberOfBall = numberOfBall;
}

public int getNumberOfStrike() {
return numberOfStrike;
}

public int getNumberOfBall() {
return numberOfBall;
}

public boolean isMaxStrike() {
return numberOfStrike == MAX_STRIKE;
}
}
24 changes: 24 additions & 0 deletions src/main/java/baseball/Message.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package baseball;

public enum Message {
INPUT_NUMBER_GUIDE("숫자를 입력해주세요 : "),
MAX_STRIKE_AND_CLOSE_GUIDE("3개의 숫자를 모두 맞히셨습니다! 게임 종료"),
RESTART_OR_CLOSE_GUIDE("게임을 새로 시작하려면 1, 종료하려면 2를 입력하세요."),


USER_NUMBER_NOT_NUMBER_ERROR("입력값에 숫자가 아닌 다른 값이 포함돼있습니다. 숫자만 입력해주세요."),
USER_NUMBER_DUPLICATE_ERROR("입력값에 중복이 포함돼있습니다. 중복되지 않는 숫자를 입력해주세요."),
USER_NUMBER_CONTAIN_ZERO_ERROR("입력값에 0은 포함될 수 없습니다. 1부터 9까지 숫자만 입력해주세요."),
USER_NUMBER_LENGTH_ERROR("입력값의 개수가 유효하지 않습니다. 3개의 숫자를 입력해주세요."),
SIGNAL_INVALID_ERROR("입력값에 1, 2가 아닌 다른 값이 포함돼있습니다. 1과 2중 하나를 선택해 입력해주세요.");

private String body;

Message(String body) {
this.body = body;
}

public String getBody() {
return body;
}
}
32 changes: 32 additions & 0 deletions src/main/java/baseball/Opponent.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package baseball;

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

public class Opponent {
private List<Integer> number = new ArrayList<>();

public List<Integer> getNumber() {
if (number.isEmpty()) {
generateNumber();
}
return number;
}

private void generateNumber() {
HashSet<Integer> digitsWithoutZero = new HashSet<>();
while (digitsWithoutZero.size() < 3) {
digitsWithoutZero.add(getRandomDigitWithoutZero());
}
number.addAll(digitsWithoutZero);
}

private int getRandomDigitWithoutZero() {
final int startInclusive = 1;
final int endInclusive = 9;

return Randoms.pickNumberInRange(startInclusive, endInclusive);
}
}
24 changes: 24 additions & 0 deletions src/main/java/baseball/Player.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package baseball;

import camp.nextstep.edu.missionutils.Console;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

public class Player {
private List<Integer> number;

public List<Integer> getNumber() {
String input = Console.readLine();
Validator.validate(input);
number = convertStringToIntegerList(input);
return number;
}

private List<Integer> convertStringToIntegerList(String input) {
return Arrays
.stream(input.split(""))
.map(Integer::parseInt)
.collect(Collectors.toList());
}
}
29 changes: 29 additions & 0 deletions src/main/java/baseball/Referee.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package baseball;

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

public class Referee {
public JudgementResult judge(List<Integer> playerNumber, List<Integer> opponentNumber) {
int numberOfStrike = countStrike(playerNumber, opponentNumber);
int numberOfBall = countBall(playerNumber, opponentNumber);

return new JudgementResult(numberOfStrike, numberOfBall);
}

private int countStrike(List<Integer> playerNumber, List<Integer> opponentNumber) {
return (int) IntStream
.rangeClosed(0, 2)
.filter(i -> playerNumber.get(i) == opponentNumber.get(i))
.count();
}

private int countBall(List<Integer> playerNumber, List<Integer> opponentNumber) {
return (int) IntStream
.rangeClosed(0, 2)
.filter(playerNumberIndex -> {
int opponentNumberIndex = opponentNumber.indexOf(playerNumber.get(playerNumberIndex));
return opponentNumberIndex != playerNumberIndex && opponentNumberIndex != -1;})
.count();
}
}
43 changes: 43 additions & 0 deletions src/main/java/baseball/Validator.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
package baseball;

import java.util.Arrays;

import static baseball.Message.*;

public class Validator {
public static void validate(String input) {
checkTypeConverting(input);
checkDuplication(input);
checkContainZero(input);
checkLength(input);
}

private static void checkTypeConverting(String input) {
if (input == null || !input.matches("[0-9]+")) {
throw new IllegalArgumentException(USER_NUMBER_NOT_NUMBER_ERROR.getBody());
}
}

private static void checkDuplication(String input) {
long nonDuplicateWordCount = Arrays
.stream(input.split(""))
.distinct()
.count();

if (nonDuplicateWordCount != input.length()) {
throw new IllegalArgumentException(USER_NUMBER_DUPLICATE_ERROR.getBody());
}
}

private static void checkContainZero(String input) {
if (input.contains("0")) {
throw new IllegalArgumentException(USER_NUMBER_CONTAIN_ZERO_ERROR.getBody());
}
}

private static void checkLength(String input) {
if (input.length() != 3) {
throw new IllegalArgumentException(USER_NUMBER_LENGTH_ERROR.getBody());
}
}
}
39 changes: 39 additions & 0 deletions src/main/java/baseball/View.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
package baseball;

import static baseball.Message.*;

public class View {
public static void print(Message message) {
System.out.print(message.getBody());
}

public static void println(Message message) {
System.out.println(message.getBody());
}

public static void print(JudgementResult result) {
String JudgementResultMessage = makeJudgementResultMessage(result);
System.out.println(JudgementResultMessage);
}

private static String makeJudgementResultMessage(JudgementResult judgementResult) {
StringBuilder stringBuilder = new StringBuilder();

if (judgementResult.getNumberOfBall() > 0) {
stringBuilder.append(judgementResult.getNumberOfBall() + "볼 ");
}
if (judgementResult.getNumberOfStrike() > 0) {
stringBuilder.append(judgementResult.getNumberOfStrike() + "스트라이크 ");
}

if (judgementResult.getNumberOfBall() == 0 && judgementResult.getNumberOfStrike() == 0) {
stringBuilder.append("낫싱");
}

if (judgementResult.isMaxStrike()) {
stringBuilder.append(MAX_STRIKE_AND_CLOSE_GUIDE.getBody());
}

return stringBuilder.toString();
}
}