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 src/main/java/baseball/Application.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,11 @@

public class Application {
public static void main(String[] args) {
Controller controller = new Controller();
controller.run();
//TODO: 숫자 야구 게임 구현



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

import baseball.service.GameService;
import baseball.view.RequestInput;
import baseball.view.SystemMessage;
import camp.nextstep.edu.missionutils.Console;

public class Controller {
final int SIZE = 3;
final int START_INCLUSIVE = 1;
final int END_INCLUSIVE = 9;
final int RETRY = 1;
final int GAME_OVER = 2;

GameService gameService = new GameService();

public void run() throws IllegalArgumentException {
setGame();
startGame();
endGame();
askRetry();
}

private void setGame() {
gameService.setGame(SIZE, START_INCLUSIVE, END_INCLUSIVE);
}

private void startGame() throws IllegalArgumentException {
gameService.playGame();
}

private void endGame() {
SystemMessage.printGameOverMessage();
}

/**
* 유저입력이 (문자 or 0 or 3 이상) : Exception
* 유저입력이 (1) : 재시작
* 유저입력이 (2) : 종료
*/
private void askRetry() throws IllegalArgumentException {
RequestInput.printRetryMessage();
if (getInputNum() == RETRY) {
run();
}
}

private int getInputNum() throws IllegalArgumentException {
int inputNum = Integer.parseInt(Console.readLine());

if (inputNum == 0 || inputNum > GAME_OVER) {
throw new IllegalArgumentException();
}
return inputNum;
}
}

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

public class Game {

int strikeCount;
int ballCount;
int[] gameNumbers;

public Game(int[] numbers) {
gameNumbers = numbers;
}

public void initBaseBall() {
strikeCount = 0;
ballCount = 0;
}

public int getStrikeCount() {
return strikeCount;
}

public int getBallCount() {
return ballCount;
}

public int[] getGameNumbers() {
return gameNumbers;
}

public void incStrikeCount() {
strikeCount += 1;
}

public void incBallCount() {
ballCount += 1;
}
}


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

public class User {

int[] userNumbers;

public int[] getUserNumbers() {
return userNumbers;
}

public void setUserNumbers(int[] userNumbers) {
this.userNumbers = userNumbers;
}
}

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

import baseball.domain.Game;
import baseball.domain.User;
import baseball.utils.Parser;
import baseball.utils.RandomUtils;
import baseball.view.RequestInput;
import baseball.view.SystemMessage;
import camp.nextstep.edu.missionutils.Console;

public class GameService {

int size;
Game game;
User user = new User();
Parser parser = new Parser();
SystemMessage systemMessage = new SystemMessage();

public void setGame(int size, int start, int end) {
this.size = size;
game = new Game(RandomUtils.getRandomNumbers(size, start, end));
}

public void playGame() {
int strike = 0;
while (strike != 3) {
play();
systemMessage.printScoreMessage(game.getBallCount(), game.getStrikeCount());
strike = game.getStrikeCount();
}
}

private void play() {
game.initBaseBall();
user.setUserNumbers(getUserNumber());
computeScore();
}

private int[] getUserNumber() throws IllegalArgumentException {
RequestInput.requestInputData();
String input = Console.readLine();
return parser.parseUserInput(input, size);
}

private void computeScore() {
for (int i = 0; i < size; i++) {
compute(game.getGameNumbers(), user.getUserNumbers(), i);
}
}

private void compute(int[] gameNumber, int[] userNumber, int index) {
int temp = -1;
for (int i = 0; i < gameNumber.length; i++) {
if (gameNumber[i] == userNumber[index]) {
temp = i;
break;
}
}
incCount(index, temp);
}

private void incCount(int index, int temp) {
if (temp != index && temp != -1) {
game.incBallCount();
}
if (temp == index) {
game.incStrikeCount();
}
}
}

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

public class Parser {

public int[] parseUserInput(String input, int size) throws IllegalArgumentException {
checkSize(input, size);
return getParseInt(input, size);
}

private void checkSize(String input, int size) throws IllegalArgumentException {
if (input.length() != size) {
throw new IllegalArgumentException();
}
}

private int[] getParseInt(String input, int size) throws IllegalArgumentException {
int[] parseInt = new int[size];

for (int i = 0; i < input.length(); i++) {
if (!checkDigit(input, i)) {
throw new IllegalArgumentException();
}
parseInt[i] = convertCharToInt(input, i);
}
return parseInt;
}

private int convertCharToInt(String input, int i) {
return input.charAt(i) - '0';
}

private Boolean checkDigit(String input, int i) {
return '0' <= input.charAt(i) && input.charAt(i) <= '9';
}
}

35 changes: 35 additions & 0 deletions src/main/java/baseball/utils/RandomUtils.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
package baseball.utils;
import camp.nextstep.edu.missionutils.Randoms;

public class RandomUtils {




public static int[] getRandomNumbers(int size, int start, int end) {
int[] numbers = new int[3];

for (int i = 0; i < size; i++) {
numbers[i] = getUniqueRandomNumber(numbers, start, end, i);
}
return numbers;
}

private static int getUniqueRandomNumber(int[] numbers, int start, int end, int i) {
int randomNumber = Randoms.pickNumberInRange(start, end);
while (!isUnique(numbers, i, randomNumber)) {
randomNumber = Randoms.pickNumberInRange(start, end);
}
return randomNumber;
}

private static Boolean isUnique(int[] numbers, int i, int randomNumber) {
for (int j = 0; j < i; j++) {
if (numbers[j] == randomNumber) {
return false;
}
}
return true;
}
}

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

public class RequestInput {
public static void requestInputData() {
System.out.print("숫자를 입력해 주세요 : ");
}

public static void printRetryMessage() {
System.out.println("게임을 다시 시작하려면 1, 종료하려면 2를 입력하세요.");
}
}
23 changes: 23 additions & 0 deletions src/main/java/baseball/view/SystemMessage.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package baseball.view;

public class SystemMessage {
public void printScoreMessage(int ball, int strike) {
if (ball == 0 && strike == 0) {
System.out.println("낫싱");
}
if (ball == 0 && strike != 0) {
System.out.println(strike + "스트라이크");
}
if (ball != 0 && strike == 0) {
System.out.println(ball + "볼");
}
if (ball != 0 && strike != 0) {
System.out.println(ball + "볼 " + strike + "스트라이크");
}
}

public static void printGameOverMessage() {
System.out.println("3개의 숫자를 모두 맞히셨습니다! 게임 종료");
}
}