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
74 changes: 73 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1 +1,73 @@
# java-baseball-precourse
# java-baseball-precourse

## 프로그램 구현 기능

### 프로그램 시작

- 숫자 야구 게임을 시작한다.
- 게임이 끝난다면 1 또는 2를 입력받아 새로 시작하거나 종료한다.

### 숫자야구 게임 시작

- 정답 숫자를 생성한다.
- 3자리 수 한 개를 입력받는다.
- 입력받은 수가 3 스트라이크 이면, 숫자 야구 게임을 종료한다.

### 정답 숫자 생성

- 1부터 9까지 서로 다른 수로 이루어진 랜덤한 3자리 수를 생성하여 정답으로 한다.

### 숫자 입력

- 3자리 수를 입력받는다.
- 서로 다른 수로 이루어진 3자리 수가 아니라면 [ERROR]처리한다.

### 숫자 판단

- 스트라이크, 볼, 낫싱을 판단한다.
- 3 스트라이크라면 숫자 야구 게임을 종료한다.

## 구조

### model

Numbers

- 숫자 야구에 사용되는 3자리 수 model
- 숫자 입력 값 예외 처리
- 스트라이크, 볼 계산

Game

- 정답 숫자 생성
- 정답 숫자와 유저 숫자를 비교하여 스트라이크, 볼, 낫싱 판정
- 게임 재시작 및 종료 값 예외 처리

GameResult

- 숫자 야구 결과를 출력
- 스트라이크, 볼, 낫싱
- 게임 종료 조건(3스트라이크) 확인

### view

InputView

- 유저 숫자 입력받기
- 게임 재시작 및 종료 입력받기

OutputView

- 숫자 야구 시작 메시지 출력
- 숫자 야구 결과 출력
- 게임 재시작 및 종료 메시지 출력
- 에러 메시지 출력

### controller

Controller

- 숫자 야구 실행
- 숫자 판정
- 결과 제공
- 게임 재시작 및 종료 판단
8 changes: 8 additions & 0 deletions src/main/java/Main.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
import controller.Controller;

public class Main {
public static void main(String[] args) {
Controller controller = new Controller();
controller.run();
}
}
51 changes: 51 additions & 0 deletions src/main/java/controller/Controller.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
package controller;

import model.Game;
import model.GameResult;
import model.Numbers;
import view.InputView;
import view.OutputView;

import java.util.List;

public class Controller {
private final InputView inputView = new InputView();
private final OutputView outputView = new OutputView();

public void run() {
while (true) {
int result = play();
if (result == 2) break;
}
}

private int play() {
Game game = new Game();
while (true) {
try {
outputView.OutputInputNumber();

Numbers userNumbers = new Numbers(inputView.InputUserNumbers());

GameResult result = game.getResult(userNumbers);
outputView.OutputResult(result);

if (result.isFinish()) {
break;
}
} catch (IllegalArgumentException e) {
outputView.OutputError(e.getMessage());
}
}
outputView.OutputWin();

while (true) {
try {
outputView.OutputInputCommand();
return game.getCommand(inputView.InputCommand());
} catch (IllegalArgumentException e) {
outputView.OutputError(e.getMessage());
}
}
}
}
65 changes: 65 additions & 0 deletions src/main/java/model/Game.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
package model;

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

public class Game {
private final Numbers correctNumbers;

public Game() {
this.correctNumbers = generateCorrectNumbers();
}

private Numbers generateCorrectNumbers() {
List<Integer> tempNumbers = new ArrayList<Integer>();

for (int i = 1; i <= 9; ++i) {
tempNumbers.add(i);
}
Collections.shuffle(tempNumbers);

return new Numbers(tempNumbers.subList(0, 3));
}

public GameResult getResult(Numbers userNumbers) {
int strike = correctNumbers.countStrike(userNumbers);
int ball = correctNumbers.countBall(userNumbers);

return new GameResult(strike, ball);
}

public int getCommand(String commandString) {
return validateAndParseInputString(commandString);
}

private int validateAndParseInputString(String commandString) {
if (!validateInputLength(commandString)) {
throw new IllegalArgumentException("1 또는 2만 입력해야 합니다.");
}
if (!validateInputIsNumber(commandString)) {
throw new IllegalArgumentException("1 또는 2만 입력해야 합니다.");
}
if (!validateInputIsOneOrTwo(commandString)) {
throw new IllegalArgumentException("1 또는 2만 입력해야 합니다.");
}
return convertStringToInteger(commandString);
}

private boolean validateInputLength(String commandString) {
return commandString.length() == 1;
}

private boolean validateInputIsNumber(String commandString) {
return commandString.charAt(0) >= '0' && commandString.charAt(0) <= '9';
}

private boolean validateInputIsOneOrTwo(String commandString) {
return commandString.charAt(0) == '1' || commandString.charAt(0) == '2';
}

private Integer convertStringToInteger(String commandString) {
return commandString.charAt(0) - '0';
}

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

public class GameResult {
private final int strike;
private final int ball;

public GameResult(int strike, int ball) {
this.strike = strike;
this.ball = ball;
}

public String getResultString() {
String ret = "";
if (strike > 0) ret += strike + "스트라이크 ";
if (ball > 0) ret += ball + "볼 ";
if (strike == 0 && ball == 0) ret += "낫싱";
return ret;
}

public boolean isFinish() {
return strike == 3;
}
}
84 changes: 84 additions & 0 deletions src/main/java/model/Numbers.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
package model;

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

public class Numbers {
private final List<Integer> numbers;

public Numbers(String inputNumbersString) {
this.numbers = validateAndParseInputString(inputNumbersString);
}

public Numbers(List<Integer> numbers) {
this.numbers = numbers;
}

private List<Integer> validateAndParseInputString(String inputNumbersString) {
if (!validateInputLength(inputNumbersString)) {
throw new IllegalArgumentException("3자리여야 합니다.");
}
if (!validateInputIsNumbers(inputNumbersString)) {
throw new IllegalArgumentException("숫자만 입력해야 합니다.");
}
if (!validateInputHasDistinctDigits(inputNumbersString)) {
throw new IllegalArgumentException("중복된 숫자를 다른 자릿수에 사용할 수 없습니다.");
}
return convertStringToIntegerList(inputNumbersString);
}

private boolean validateInputLength(String inputNumbersString) {
return inputNumbersString.length() == 3;
}

private boolean validateInputIsNumbers(String inputNumbersString) {
for (int i = 0; i < 3; ++i) {
if (inputNumbersString.charAt(i) < '0' || inputNumbersString.charAt(i) > '9') return false;
}
return true;
}

private boolean validateInputHasDistinctDigits(String inputNumbersString) {
boolean[] digitsArray = new boolean[13];
for (int i = 0; i < 3; ++i) {
int digit = inputNumbersString.charAt(i) - '0';
if (digitsArray[digit]) return false;
digitsArray[digit] = true;
}
return true;
}

private List<Integer> convertStringToIntegerList(String inputNumbersString) {
List<Integer> ret = new ArrayList<Integer>();
for (int i = 0; i < 3; ++i) {
ret.add(inputNumbersString.charAt(i) - '0');
}
return ret;
}


public int countStrike(Numbers otherNumbers) {
int cnt = 0;
for (int i = 0; i < 3; ++i) {
if (this.numbers.get(i).equals(otherNumbers.numbers.get(i))) cnt += 1;
}
return cnt;
}

public int countBall(Numbers otherNumbers) {
boolean[] ballCountArray = new boolean[13];
int[] ballIndexArray = new int[13];
int cnt = 0;

for (int i = 0; i < 3; ++i) {
ballCountArray[this.numbers.get(i)] = true;
ballIndexArray[this.numbers.get(i)] = i;
}
for (int i = 0; i < 3; ++i) {
if (ballCountArray[otherNumbers.numbers.get(i)] && ballIndexArray[otherNumbers.numbers.get(i)] != i) {
cnt += 1;
}
}
return cnt;
}
}
17 changes: 17 additions & 0 deletions src/main/java/view/InputView.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package view;

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

public class InputView {
private final Scanner scanner = new Scanner(System.in);

public String InputUserNumbers() {
return scanner.nextLine();
}

public String InputCommand() {
return scanner.nextLine();
}
}
28 changes: 28 additions & 0 deletions src/main/java/view/OutputView.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package view;

import model.Game;
import model.GameResult;
import model.Numbers;

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

public void OutputResult(GameResult result) {
System.out.println(result.getResultString());
}

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

public void OutputInputCommand() {
System.out.println("게임을 새로 시작하려면 1, 종료하려면 2를 입력하세요.");
}

public void OutputError(String errorMessage) {
System.out.println("[ERROR]: " + errorMessage);
}
}

Loading