Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

2️⃣ 숫자야구게임 구현 #160

Open
wants to merge 14 commits into
base: main
Choose a base branch
from
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
7 changes: 7 additions & 0 deletions src/main/java/BaseBallPlaygroundMain.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
public class BaseBallPlaygroundMain {

public static void main(String[] args) {
NumberBaseballGamePlayService service = new NumberBaseballGamePlayService();
service.play();
}
}
21 changes: 21 additions & 0 deletions src/main/java/NumberBaseballGamePlayService.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
import gameContinue.GameContinueService;
import input.GAME_PROGRESS_STATUS;

import static input.GAME_PROGRESS_STATUS.isProgress;

public class NumberBaseballGamePlayService {

public void play() {
NumberBaseballGameService numberBaseballGameService = new NumberBaseballGameService();
GameContinueService gameContinueService = new GameContinueService();

GAME_PROGRESS_STATUS gameProgressStatus = GAME_PROGRESS_STATUS.PROGRESS;

while (isProgress(gameProgressStatus)) {
numberBaseballGameService.playOneGame();

gameProgressStatus = gameContinueService.chooseGameContinueOrTerminate();

}
}
}
31 changes: 31 additions & 0 deletions src/main/java/NumberBaseballGameService.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
import gameResult.GameResult;
import gameResult.GameResultVerifyService;
import answer.ComputerAnswerService;
import answer.ComputerAnswerServiceImpl;
import input.InputViewService;

import static gameResult.GameResult.createDefaultGameResult;

public class NumberBaseballGameService {

void playOneGame() {

// 3자리 서로다른 수 생성
ComputerAnswerService computerAnswerService = new ComputerAnswerServiceImpl();
int[] computeAnswer = computerAnswerService.makeAnswer();

InputViewService inputViewService = new InputViewService();
GameResultVerifyService inputAnswerVerifyService = new GameResultVerifyService();
GameResult gameResult = createDefaultGameResult();

while(!gameResult.isWin()) {
// 입력받기
int[] input = inputViewService.processInput();

// 결과판단
gameResult = inputAnswerVerifyService.verify(computeAnswer, input);
gameResult.printGameResult();

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

public interface ComputerAnswerService {

int[] makeAnswer();

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

import answer.check.CheckUseAnswer;

import static answer.random.RandomNumber.generateRandomNumber;
import static utils.ConstantUtils.GAME_NUM_LENGTH;

public class ComputerAnswerServiceImpl implements ComputerAnswerService {


@Override
public int[] makeAnswer() {
CheckUseAnswer checkUseAnswerArr = new CheckUseAnswer();
int [] answer = new int[GAME_NUM_LENGTH];

for(int i = 0; i < GAME_NUM_LENGTH; ++i ){
int answerNum = generateUniqueRandomNumber(checkUseAnswerArr);
answer[i] = answerNum;
checkUseAnswerArr.checkAnswer(answer[i]);
}
return answer;
}

int generateUniqueRandomNumber(CheckUseAnswer checkUseAnswerArr) {
int randomNum = 0;
while (!checkUseAnswerArr.isNotCheckedAnswer(randomNum)) {
randomNum = generateRandomNumber();
}
return randomNum;
}
}
18 changes: 18 additions & 0 deletions src/main/java/answer/check/CheckUseAnswer.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package answer.check;

public class CheckUseAnswer {

private boolean [] check;

public CheckUseAnswer() {
this.check = new boolean[10];
}

public boolean isNotCheckedAnswer(int num) {
return !check[num];
}

public void checkAnswer(int num) {
check[num] = true;
}
}
13 changes: 13 additions & 0 deletions src/main/java/answer/random/RandomNumber.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package answer.random;

import java.util.concurrent.ThreadLocalRandom;

public class RandomNumber {

private static final int RANDOM_MIN = 1;
private static final int RANDOM_MAX = 10;

public static int generateRandomNumber() {
return ThreadLocalRandom.current().nextInt(RANDOM_MIN, RANDOM_MAX);
}
}
17 changes: 17 additions & 0 deletions src/main/java/gameContinue/GameContinueService.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package gameContinue;

import input.GAME_PROGRESS_STATUS;

import java.util.Scanner;

public class GameContinueService {

public GAME_PROGRESS_STATUS chooseGameContinueOrTerminate() {
Scanner sc = new Scanner(System.in);

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

int userInput = sc.nextInt();
return GAME_PROGRESS_STATUS.getGameProgressByInputCode(userInput);
}
}
30 changes: 30 additions & 0 deletions src/main/java/gameResult/BallCountService.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package gameResult;

import utils.ConstantUtils;

public class BallCountService {

public int ballCount(int [] answer, int [] input) {

int totalBall = 0;
for(int answerIdx = 0; answerIdx < ConstantUtils.GAME_NUM_LENGTH; ++answerIdx){
totalBall += countInputBallCompareAnswerElement(answer[answerIdx], input, answerIdx);
}

return totalBall;
}

int countInputBallCompareAnswerElement(int answer, int [] input, int answerIdx) {
int ballByOneAnswerCount = 0;
for(int inputIdx = 0; inputIdx < ConstantUtils.GAME_NUM_LENGTH; ++inputIdx){
ballByOneAnswerCount += checkBall(answer, input[inputIdx], answerIdx, inputIdx);
}

return ballByOneAnswerCount;
}

int checkBall(int answerElement, int inputElement, int answerIdx, int inputIdx){
if(answerElement == inputElement && answerIdx != inputIdx) return 1;
return 0;
}
}
57 changes: 57 additions & 0 deletions src/main/java/gameResult/GameResult.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
package gameResult;

import utils.ConstantUtils;

public class GameResult {

private int ball;
private int strike;

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

public GameResult() {
}

public static GameResult createDefaultGameResult(){
GameResult gameResult = new GameResult();
gameResult.strike = 0;
gameResult.ball = 0;
return gameResult;
}

public boolean isWin() {
return strike == ConstantUtils.GAME_NUM_LENGTH;
}

public void printGameResult() {
if(ball == 0) {
System.out.println(strike + "스트라이크");
printWhenWinGame();
return;
}

if(strike == 0) {
System.out.println(ball +"볼");
return;
}

System.out.println(ball + "볼 " + strike +"스트라이크");
}

void printWhenWinGame() {
if(isWin()) {
System.out.println(ConstantUtils.GAME_NUM_LENGTH + "개의 숫자를 모두 맞히셨습니다! 게임종료");
}
}

public int getBall(){
return this.ball;
}

public int getStrike() {
return this.strike;
}
}
17 changes: 17 additions & 0 deletions src/main/java/gameResult/GameResultVerifyService.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package gameResult;


public class GameResultVerifyService {

public GameResult verify(int[] answer, int[] input){

StrikeCountService strikeCountService = new StrikeCountService();
int strike = strikeCountService.countStrike(answer, input);

BallCountService ballCountService = new BallCountService();
int ball = ballCountService.ballCount(answer, input);

return new GameResult(ball, strike);
}

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

import utils.ConstantUtils;

public class StrikeCountService {

public int countStrike(int[] answer, int[] input) {
int strike = 0;
for(int i = 0; i < ConstantUtils.GAME_NUM_LENGTH; ++i ) {
strike += checkStrike(answer[i], input[i]);
}

return strike;
}

int checkStrike(int answerElement, int inputElement) {
if(answerElement == inputElement) return 1;
return 0;
}
}
30 changes: 30 additions & 0 deletions src/main/java/input/GAME_PROGRESS_STATUS.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package input;

import java.util.Arrays;

public enum GAME_PROGRESS_STATUS {
PROGRESS(1)
, TERMINATE(2)
;

private int inputCode;

GAME_PROGRESS_STATUS(int inputCode) {
this.inputCode = inputCode;
}

public int getInputCode() {
return inputCode;
}

public static GAME_PROGRESS_STATUS getGameProgressByInputCode(int inputCode) {
return Arrays.stream(GAME_PROGRESS_STATUS.values())
.filter(status -> status.getInputCode() == inputCode)
.findAny()
.orElseThrow(IllegalArgumentException::new);
}

public static boolean isProgress(GAME_PROGRESS_STATUS status){
return status == PROGRESS;
}
}
17 changes: 17 additions & 0 deletions src/main/java/input/InputViewGameProgressService.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package input;

import java.util.Scanner;

import static input.GAME_PROGRESS_STATUS.getGameProgressByInputCode;

public class InputViewGameProgressService {

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

Scanner scanner = new Scanner(System.in);
int userInput = scanner.nextInt();

return getGameProgressByInputCode(userInput);
}
}
34 changes: 34 additions & 0 deletions src/main/java/input/InputViewService.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package input;

import utils.ConstantUtils;

import java.util.Scanner;

public class InputViewService {

public int[] processInput() {
Scanner scanner = new Scanner(System.in);
System.out.print("숫자를 입력해 주세요 : ");
String [] input = scanner.nextLine().split("");
int[] inputInt = new int[input.length];

if(inputInt.length != ConstantUtils.GAME_NUM_LENGTH) {
throw new IllegalArgumentException("숫자 3개만 입력 가능합니다. ");
}

for(int i = 0; i < ConstantUtils.GAME_NUM_LENGTH; i++) {
inputInt[i] = parseToInteger(input[i]);
}

return inputInt;
}

private Integer parseToInteger(String strInt) {
try {
return Integer.parseInt(strInt);
} catch (NumberFormatException exception) {
throw new IllegalArgumentException("숫자만 입력해주세요. ");
}
}

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

public class ConstantUtils {

public static final int GAME_NUM_LENGTH = 3;
}
Loading