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

## 구현할 기능 목록

- 게임이 실행되고, 컴퓨터가 생각한 수를 사전에 미리 설정할 수 있는 기능 구현
- 사용자에게 안내 문구를 출력한 뒤 입력을 받아오는 기능 구현
- 사용자의 입력값이 잘못 되었을 경우 에러를 출력하는 기능 구현
- 입력값을 토대로 결과를 판단하는 심판 기능 구현
- 결과를 출력하는 기능 구현
- 게임 진행 흐름을 컨트롤 하는 기능 구현
14 changes: 14 additions & 0 deletions src/main/java/Application.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
import controller.GameController;
import view.InputView;
import view.OutputView;

public class Application {

public static void main(String[] args) {
InputView inputView = new InputView();
OutputView outputView = new OutputView();
GameController gameController = new GameController(inputView, outputView);
gameController.start();
}

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

import model.Referee;
import model.player.ComputerPlayer;
import model.player.NormalPlayer;
import view.InputView;
import view.OutputView;

public class GameController {

private final InputView inputView;
private final OutputView outputView;

public GameController(InputView inputView, OutputView outputView) {
this.inputView = inputView;
this.outputView = outputView;
}

public void start() {
while (true) {
NormalPlayer player = new NormalPlayer();
ComputerPlayer computerPlayer = new ComputerPlayer();
play(player, computerPlayer);
outputView.printFinishMessage();
int validResume = getValidResume();
if (validResume != 1) {
return;
}
}
}

private void play(NormalPlayer player, ComputerPlayer computerPlayer) {
computerPlayer.setRandomNumbers();
Referee referee = new Referee();

boolean gameOver = false;

while (!gameOver) {
player.updateNumbers(getValidUserNumbers());
int[] score = referee.judgeGameScore(player.getNumbers(), computerPlayer.getNumbers());
outputView.printResultMessage(score[0], score[1]);
gameOver = referee.judgeGameOver(score);
}

}

private int[] getValidUserNumbers() {
while (true) {
try {
outputView.printInputMessage();
return inputView.getUserNumbers();
} catch (Exception e) {
outputView.printlnMessage(e.getMessage());
}
}
}

private int getValidResume() {
while (true) {
try {
outputView.printResumeMessage();
return inputView.getResumeOption();
} catch (Exception e) {
outputView.printlnMessage(e.getMessage());
}
}
}
}
41 changes: 41 additions & 0 deletions src/main/java/model/Referee.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
package model;

public class Referee {
private static int OFFSET = 3;

public int[] judgeGameScore(int[] userNumberArray, int[] computerNumberArray) {
int[] score = {0, 0}; // ball, strike
score[0] = countBall(userNumberArray, computerNumberArray);
score[1] = countStrike(userNumberArray, computerNumberArray);
return score;
}

public boolean judgeGameOver(int[] score) {
return score[1] == OFFSET;
}

private int countStrike(int[] userNumberArray, int[] computerNumberArray) {
int cnt = 0;
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
if (userNumberArray[i] == computerNumberArray[j] && i == j) {
cnt++;

}
}
}
return cnt;
}

private int countBall(int[] userNumberArray, int[] computerNumberArray) {
int cnt = 0;
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
if (userNumberArray[i] == computerNumberArray[j] && i != j) {
cnt++;
}
}
}
return cnt;
}
}
39 changes: 39 additions & 0 deletions src/main/java/model/player/ComputerPlayer.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
package model.player;

import java.util.Random;

public class ComputerPlayer {

private final int[] numbers;

public ComputerPlayer() {
this.numbers = new int[3];
}

public int[] getNumbers() {
return numbers;
}

public void setRandomNumbers() {
Random random = new Random();
int idx = 0;

while (idx < 3) {
int randomNumber = random.nextInt(9) + 1;

if (!isDuplicate(numbers, randomNumber, idx)) {
numbers[idx] = randomNumber;
idx++;
}
}
}

private boolean isDuplicate(int[] arr, int num, int idx) {
for (int i = 0; i < idx; i++) {
if (arr[i] == num) {
return true;
}
}
return false;
}
}
20 changes: 20 additions & 0 deletions src/main/java/model/player/NormalPlayer.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package model.player;

public class NormalPlayer {

private final int[] numbers;

public NormalPlayer() {
this.numbers = new int[3];
}

public int[] getNumbers() {
return numbers;
}

public void updateNumbers(int[] inputNumbers) {
this.numbers[0] = inputNumbers[0];
this.numbers[1] = inputNumbers[1];
this.numbers[2] = inputNumbers[2];
}
}
13 changes: 13 additions & 0 deletions src/main/java/util/StringUtils.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package util;

public class StringUtils {

public static int[] parseStringToIntArray(String inputString) {
String[] array = inputString.split("");
int[] numberArray = new int[3];
for (int i = 0; i < 3; i++) {
numberArray[i] = Integer.parseInt(array[i]);
}
return numberArray;
}
}
91 changes: 91 additions & 0 deletions src/main/java/view/InputView.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,91 @@
package view;

import util.StringUtils;

import java.io.BufferedReader;

import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;

public class InputView {

private final BufferedReader reader;

public InputView() {
this.reader = new BufferedReader(new InputStreamReader(System.in));
}

public int[] getUserNumbers() throws Exception {
String inputString = reader.readLine();
checkInputFormat(inputString);
return StringUtils.parseStringToIntArray(inputString);
}

public int getResumeOption() throws Exception {
String inputString = reader.readLine();
checkResumeInputFormat(inputString);
return Integer.parseInt(inputString);
}

private void checkInputFormat(String inputString) throws Exception {
validateIntegerInput(inputString);
validateIntegerLength(inputString, 3);
validateNotZero(inputString);
validateDuplicatedNumber(inputString);
}

public void checkResumeInputFormat(String inputString) throws Exception{
validateIntegerInput(inputString);
validateIntegerLength(inputString, 1);
validateResumeFormat(inputString);
}

private void validateIntegerInput(String inputString) throws Exception{
if (!isInteger(inputString)) {
throw new IllegalArgumentException("[ERROR] 숫자만 입력 가능합니다.");
}
}

private boolean isInteger(String inputString) throws Exception {
try {
Integer.parseInt(inputString);
return true;
} catch (NumberFormatException e) {
return false;
}
}

private void validateIntegerLength(String inputString, int N) throws Exception {
if (inputString.length() != N) {
throw new IllegalArgumentException("[ERROR] " + N + "자리의 숫자여야 합니다.");
}
}

private void validateNotZero(String inputString) throws Exception {
if (inputString.contains("0")) {
throw new IllegalArgumentException("[ERROR] 0은 포함될 수 없습니다.");
}
}

private void validateDuplicatedNumber(String inputString) throws Exception {
String[] array = inputString.split("");
Set<String> set = new HashSet<>(Arrays.asList(array));
if (set.size() != array.length) {
throw new IllegalArgumentException("[ERROR] 중복된 숫자가 있습니다.");
}
}

private void validateResumeFormat(String inputString) throws Exception {
if (!inputString.equals("1") && !inputString.equals("2")) {
throw new IllegalArgumentException("[ERROR] 1 또는 2만 입력 가능합니다.");
}
}

public void close() throws IOException {
reader.close();
}

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

public class OutputView {

private static final String inputMessage = "숫자를 입력해주세요 : ";
private static final String ballMessage = "볼 ";
private static final String strikeMessage = "스트라이크";
private static final String nothingMessage = "낫싱";
private static final String endMessage = "3개의 숫자를 모두 맞히셨습니다! 게임 끝";
private static final String resumeMessage = "게임을 새로 시작하려면 1, 종료하려면 2를 입력하세요.";


public void printlnMessage(String message) {
System.out.println(message);
}

public void printMessage(String message) {
System.out.print(message);
}

public void printInputMessage() {
printMessage(inputMessage);
}

public void printFinishMessage() {
printlnMessage(endMessage);
}

public void printResumeMessage() {
printlnMessage(resumeMessage);
}

public void printResultMessage(int ball, int strike) {
String message = "";
if (strike == 0 && ball == 0) {
message += nothingMessage;
}
if (ball > 0) {
message += ball + ballMessage;
}
if (strike > 0) {
message += strike + strikeMessage;
}
printlnMessage(message);
}

}
Loading