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
5 changes: 5 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,3 +5,8 @@

## 과제 제출 과정
* [과제 제출 방법](https://github.com/next-step/nextstep-docs/tree/master/ent-precourse)

## 구현 기능
- 임의의 3자리 수 선정
- 유저 input & 결과(힌트) return
- (게임 오버 시) 재시작 여부 체크
13 changes: 13 additions & 0 deletions src/main/java/Application.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
import game.BaseballGame;
import service.RandomGenerator;

public class Application {
public static void main(String[] args) {
RandomGenerator.generateRandomNumber();
Boolean keepPlaying = true;
while (keepPlaying) {
BaseballGame baseballGame = new BaseballGame();
keepPlaying = baseballGame.playGame();
}
}
}
66 changes: 66 additions & 0 deletions src/main/java/game/BaseballGame.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
package game;

import service.RandomGenerator;
import service.StrikeBallCount;
import service.SubmissionValidator;

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

public class BaseballGame {
private final List<Integer> answer;
private final List<Integer> userInput = new ArrayList<>();
private final Scanner scanner = new Scanner(System.in);

public BaseballGame() {
this.answer = RandomGenerator.generateRandomNumber();
}

public Boolean playGame() {
Boolean stop = false;
while (!stop) {
stop = progressGame();
}
System.out.println("3개의 숫자를 모두 맞히셨습니다! 게임 종료");
System.out.println("게임을 새로 시작하려면 1, 종료하려면 2를 입력하세요.");
return scanner.nextInt() == 1;
}

private Boolean progressGame() {
setUserInput();
StrikeBallCount strikeBallCount = SubmissionValidator.validateSubmission(userInput, answer);
System.out.println(strikeBallCount.getResultString());
return strikeBallCount.isCorrect();
}

private void setUserInput() {
System.out.print("숫자를 입력해주세요: ");
String input = scanner.nextLine().replaceAll("\\s", "");
if (isInputValid(input)) {
updateUserInput(input);
return;
}
System.out.println("올바른 숫자를 입력해 주세요!");
setUserInput();
}

private void updateUserInput(String input) {
userInput.clear();
for (int i = 0; i < 3; i++) {
userInput.add(Character.getNumericValue(input.charAt(i)));
}
}

private boolean isInputValid(String input) {
if (input.length() != 3) return false;
int idx = 0;
while (idx < 3 && Character.isDigit(input.charAt(idx)) && Character.getNumericValue(input.charAt(idx)) > 0) {
idx++;
}
if (idx != 3) {
return false;
}
return true;
}
}
22 changes: 22 additions & 0 deletions src/main/java/service/RandomGenerator.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package service;

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

public class RandomGenerator {
public static List<Integer> generateRandomNumber() {
ArrayList<Integer> candidate = new ArrayList<>();
while (candidate.size() < 3) {
insertDistinctNumber(candidate);
}
return candidate;
}

private static void insertDistinctNumber(List<Integer> candidate) {
int newCandidate = (int) ((Math.random() * 8) + 1);
while (candidate.contains(newCandidate)) {
newCandidate = (int) ((Math.random() * 8) + 1);
}
candidate.add(newCandidate);
}
}
38 changes: 38 additions & 0 deletions src/main/java/service/StrikeBallCount.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
package service;

public class StrikeBallCount {
private int strikeCount = 0;
private int ballCount = 0;

public int getStrikeCount() {
return strikeCount;
}

public int getBallCount() {
return ballCount;
}

public void updateStrike() {
this.strikeCount += 1;
}

public void updateBall() {
this.ballCount += 1;
}

public Boolean isCorrect() {
return this.strikeCount == 3;
}

public Boolean isNothing() {
return this.ballCount == 0 & this.strikeCount == 0;
}

public String getResultString() {
StringBuilder res = new StringBuilder();
if (this.strikeCount > 0) res.append(strikeCount).append("스트라이크 ");
if (this.ballCount > 0) res.append(ballCount).append("볼");
if (this.isNothing()) res.append("낫싱");
return res.toString();
}
}
24 changes: 24 additions & 0 deletions src/main/java/service/SubmissionValidator.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package service;

import java.util.List;

public class SubmissionValidator {
public static StrikeBallCount validateSubmission(List<Integer> submission, List<Integer> answer) {
StrikeBallCount strikeBallCount = new StrikeBallCount();
for (int idx = 0; idx < 3; idx++) {
updateStrikeBallCountPerIdx(idx, submission, answer, strikeBallCount);
}
return strikeBallCount;
}

private static void updateStrikeBallCountPerIdx(int idx, List<Integer> submission, List<Integer> answer, StrikeBallCount strikeBallCount) {
if (submission.get(idx).equals(answer.get(idx))) {
strikeBallCount.updateStrike();
return;
}
if(answer.contains(submission.get(idx))) {
strikeBallCount.updateBall();
return;
}
}
}
10 changes: 10 additions & 0 deletions src/test/java/game/BaseballGameTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package game;

import org.junit.jupiter.api.Test;

import static org.junit.jupiter.api.Assertions.*;

class BaseballGameTest {
BaseballGame game = new BaseballGame();

}
30 changes: 30 additions & 0 deletions src/test/java/service/RandomGeneratorTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package service;

import org.junit.jupiter.api.Test;
import java.util.HashSet;
import java.util.List;

import static org.assertj.core.api.Assertions.*;

class RandomGeneratorTest {

@Test
void generateRandomNumber_sizeIsThree() {
List<Integer> randomNumber = RandomGenerator.generateRandomNumber();
assertThat(randomNumber.size()).isEqualTo(3);
}

@Test
void generateRandomNumber_noDuplicate() {
List<Integer> randomNumber = RandomGenerator.generateRandomNumber();
assertThat(new HashSet<>(randomNumber).size()).isEqualTo(randomNumber.size());
}

@Test
void generateRandomNumber_isInRange() {
List<Integer> randomNumber = RandomGenerator.generateRandomNumber();
for (Integer num : randomNumber) {
assertThat(num).isBetween(1, 9);
}
}
}
164 changes: 164 additions & 0 deletions src/test/java/service/SubmissionValidatorTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,164 @@
package service;

import org.junit.jupiter.api.Test;

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

import static org.assertj.core.api.Assertions.*;

class SubmissionValidatorTest {

@Test
void validateSubmission_isStrikeThree() {
List<Integer> submission = new ArrayList<>();
submission.add(1);
submission.add(2);
submission.add(3);

List<Integer> answer = new ArrayList<>();
answer.add(1);
answer.add(2);
answer.add(3);

StrikeBallCount strikeBallCount = SubmissionValidator.validateSubmission(submission, answer);
assertThat(strikeBallCount.getStrikeCount()).isEqualTo(3);
assertThat(strikeBallCount.getBallCount()).isEqualTo(0);
}

@Test
void validateSubmission_isStrikeThreeAndCorrect() {
List<Integer> submission = new ArrayList<>();
submission.add(1);
submission.add(2);
submission.add(3);

List<Integer> answer = new ArrayList<>();
answer.add(1);
answer.add(2);
answer.add(3);

StrikeBallCount strikeBallCount = SubmissionValidator.validateSubmission(submission, answer);
assertThat(strikeBallCount.getStrikeCount()).isEqualTo(3);
assertThat(strikeBallCount.getBallCount()).isEqualTo(0);
assertThat(strikeBallCount.isCorrect()).isTrue();
}

@Test
void validateSubmission_isBallThree() {
List<Integer> submission = new ArrayList<>();
submission.add(1);
submission.add(2);
submission.add(3);

List<Integer> answer = new ArrayList<>();
answer.add(3);
answer.add(1);
answer.add(2);

StrikeBallCount strikeBallCount = SubmissionValidator.validateSubmission(submission, answer);
assertThat(strikeBallCount.getStrikeCount()).isEqualTo(0);
assertThat(strikeBallCount.getBallCount()).isEqualTo(3);
}

@Test
void validateSubmission_isTwoBallOneStrike() {
List<Integer> submission = new ArrayList<>();
submission.add(1);
submission.add(2);
submission.add(3);

List<Integer> answer = new ArrayList<>();
answer.add(1);
answer.add(3);
answer.add(2);

StrikeBallCount strikeBallCount = SubmissionValidator.validateSubmission(submission, answer);
assertThat(strikeBallCount.getStrikeCount()).isEqualTo(1);
assertThat(strikeBallCount.getBallCount()).isEqualTo(2);
}

@Test
void validateSubmission_isOneBall() {
List<Integer> submission = new ArrayList<>();
submission.add(1);
submission.add(2);
submission.add(3);

List<Integer> answer = new ArrayList<>();
answer.add(4);
answer.add(5);
answer.add(1);

StrikeBallCount strikeBallCount = SubmissionValidator.validateSubmission(submission, answer);
assertThat(strikeBallCount.getStrikeCount()).isEqualTo(0);
assertThat(strikeBallCount.getBallCount()).isEqualTo(1);
}

@Test
void validateSubmission_noMatch() {
List<Integer> submission = new ArrayList<>();
submission.add(1);
submission.add(2);
submission.add(3);

List<Integer> answer = new ArrayList<>();
answer.add(4);
answer.add(5);
answer.add(6);

StrikeBallCount strikeBallCount = SubmissionValidator.validateSubmission(submission, answer);
assertThat(strikeBallCount.getStrikeCount()).isEqualTo(0);
assertThat(strikeBallCount.getBallCount()).isEqualTo(0);
}

@Test
void validateSubmission_noMatchAndNothing() {
List<Integer> submission = new ArrayList<>();
submission.add(1);
submission.add(2);
submission.add(3);

List<Integer> answer = new ArrayList<>();
answer.add(4);
answer.add(5);
answer.add(6);

StrikeBallCount strikeBallCount = SubmissionValidator.validateSubmission(submission, answer);
assertThat(strikeBallCount.getStrikeCount()).isEqualTo(0);
assertThat(strikeBallCount.getBallCount()).isEqualTo(0);
assertThat(strikeBallCount.isNothing()).isTrue();
}

@Test
void validateSubmission_resultStringIsTwoBallOneStrike() {
List<Integer> submission = new ArrayList<>();
submission.add(1);
submission.add(2);
submission.add(3);

List<Integer> answer = new ArrayList<>();
answer.add(1);
answer.add(3);
answer.add(2);

StrikeBallCount strikeBallCount = SubmissionValidator.validateSubmission(submission, answer);
assertThat(strikeBallCount.getResultString()).isEqualTo("1스트라이크 2볼");
}

@Test
void validateSubmission_resultStringIsNothing() {
List<Integer> submission = new ArrayList<>();
submission.add(1);
submission.add(2);
submission.add(3);

List<Integer> answer = new ArrayList<>();
answer.add(4);
answer.add(5);
answer.add(6);

StrikeBallCount strikeBallCount = SubmissionValidator.validateSubmission(submission, answer);
assertThat(strikeBallCount.getResultString()).isEqualTo("낫싱");
}
}
Loading