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

2023-11-20 #2781

Open
wants to merge 11 commits into
base: main
Choose a base branch
from
85 changes: 85 additions & 0 deletions docs/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@
# ⚾ BaseBall Game
## 요구 사항 분석
### 게임 규칙
>같은 수가 같은 자리에 있으면 Strike
><br>
>같은 수가 다른 자리에 있으면 Ball
><br>
>같은 수가 하나도 없으면 Nothing
><br>
>Strike, Ball, Nothing의 힌트를 가지고 Computer의 수를 맞추면 승리
><br>
> 예시)Compuer의 수 : 829일때
><br>
> 123을 제시 : 1스트라이크
> <br>
> 456을 제시 : 낫싱
> <br>
> 189을 제시 : 1볼 1스트라이크

<br>

### 게임 진행 과정
> 게임 플레이어는 서로 다른 3개의 숫자를 입력하고, 컴퓨터는 입력한 숫자에 대한 결과물 출력

<br>

### 게임 종료 조건
> 컴퓨터의 숫자 3개를 모두 맞추면 게임 종료

<br>

### 게임 종료 후 처리 방법
> 게임을 다시 시작하거나 종료



<br>

### 예외 조건
1. 입력값이 길이가 3이 초과가 되는지
2. 입력값이 정수형이 아닌지
3. 입력값이 서로 다른 수가 아니라 중복되는 수인지
4. 사용자가 잘못된 값을 입력할 경우 <b>IllegalArgumentException()</b>을 발생시킨 후 애플리케이션 종료

<br>

## 구현 목록

### Controller
- GameController
- 시작 기능



### Model
- Game
- 컴퓨터 정답 생성
- 결과값 생성
- 현재 상태 (이겼는지 / 재시작 할건지 / 종료할건지)

- GameResult
- 컴퓨터 vs 유저 값 판단하여 스트라이크, 볼 개수 판단
- 결과를 string형으로 변환

### View
- GameView
- 출력 인터페이스

### Service
- CheckUserNumber
- 예외 처리 기능
- 입력 길이 3 이상인지
- 입력 값이 정수인지
- 입력 값이 중복되는지

<br>

## 커밋 방법 [깃 배쉬]
1. git clone --bare [forked한 레포지 주소]
2. cd [forked한 레포지 주소]
3. git push --mirror [새 레포지 주소]
4. cd ..
5. rm -rf [forked한 레포지 주소]

<br>
14 changes: 12 additions & 2 deletions src/main/java/baseball/Application.java
Original file line number Diff line number Diff line change
@@ -1,7 +1,17 @@
package baseball;

import baseball.Controller.GameController;
import baseball.View.GameView;
import camp.nextstep.edu.missionutils.Console;
import camp.nextstep.edu.missionutils.Randoms;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;

public class Application {

public static void main(String[] args) {
// TODO: 프로그램 구현
GameController gameController = new GameController();
gameController.GameStart();
}
}
}
38 changes: 38 additions & 0 deletions src/main/java/baseball/Controller/GameController.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
package baseball.Controller;

import baseball.Service.CheckUserNumber;
import baseball.Model.Game;
import baseball.View.GameView;

import java.util.List;

public class GameController {

private final GameView gameView = new GameView();

public GameController(){
gameView.showGameStart();
}

public void GameStart(){
Game game = new Game();
while(game.gamestatus()){
gameView.showInputNumbers(); //숫자를 입력해 주세요:
String strInputNumbers = gameView.getInput(); //입력받아 string형에 저장
CheckUserNumber check = new CheckUserNumber(strInputNumbers); //오류 검사
List<Integer> UserNumbers = game.stringToIntList(strInputNumbers); //console로 입력 받으면 string형 이기 때문에 비교과 쉽게 List로 변환

String Gameresult = game.makeGameResult(UserNumbers);
gameView.showString(Gameresult);
}
gameView.showGameEnd();

gameView.showInputRestart();
String strInputRestart = gameView.getInput();
if (game.isRestart(strInputRestart)) {
GameStart();
}
}


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

import camp.nextstep.edu.missionutils.Randoms;

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

public class Game {

private final List<Integer> answerNumbers = new ArrayList<>();
private boolean GameStatus;
private final boolean Playing = true;
private final boolean End = false;
private final String RESTART = "1";
private final String QUIT = "2";
public Game(){
this.setAnswerNumbers();
this.GameStatus = Playing;
}

public void setAnswerNumbers(){
while (this.answerNumbers.size() < 3) {
int randomNumber = Randoms.pickNumberInRange(1, 9);
if (!this.answerNumbers.contains(randomNumber)) {
this.answerNumbers.add(randomNumber);
}
}
}

public String makeGameResult(List<Integer> inputNumbers) {
GameResult gameResult = new GameResult(this.answerNumbers, inputNumbers);
applyResult(gameResult.getStrikes());
return gameResult.resultToString();
}

public void applyResult(int strike) {
if (strike == 3) {
this.GameStatus = End;
}
}

public boolean gamestatus() {
return this.GameStatus;
}


public boolean isRestart(String input) {
if (input.equals(RESTART)) {
return true;
} else if (input.equals(QUIT)) {
return false;
} else {
throw new IllegalArgumentException();
}
}


public List<Integer> stringToIntList(String String) { //입력값을 List로 변경
List<Integer> intList = new ArrayList<>();
for (int i = 0; i < String.length(); i++) {
char digitChar = String.charAt(i);
int digitInt = Character.getNumericValue(digitChar);
intList.add(digitInt);
}
return intList;
}
}
44 changes: 44 additions & 0 deletions src/main/java/baseball/Model/GameResult.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
package baseball.Model;

import java.util.List;

public class GameResult {

private int ball = 0;
private int strike = 0;

GameResult(List<Integer> answerNumbers, List<Integer> UserNumbers ){
for(int i=0; i<answerNumbers.size(); i++){
int computer = answerNumbers.get(i);
int user = UserNumbers.get(i);

if(computer == user){
this.strike++;
}
else if(answerNumbers.contains(user)){
this.ball++;
}
}
}

public String resultToString() {
String result = "";
if (this.ball != 0) {
result += this.ball + "볼";
}
if (this.strike != 0) {
if (this.ball != 0) {
result += " ";
}
result += this.strike + "스트라이크";
}
if (this.ball == 0 && this.strike == 0) {
result = "낫싱";
}
return result;
}

public int getStrikes() {
return this.strike;
}
}
38 changes: 38 additions & 0 deletions src/main/java/baseball/Service/CheckUserNumber.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
package baseball.Service;

import java.util.HashSet;
import java.util.Set;

public class CheckUserNumber {

public CheckUserNumber(String String){
CheckLength(String);
CheckInt(String);
CheckDuplicate(String);
}

private void CheckLength(String String){
if(String.length() != 3)
throw new IllegalArgumentException();

}

private void CheckInt(String String){
try {
int inputInt = Integer.parseInt(String);
} catch (NumberFormatException e) {
throw new IllegalArgumentException();
}
}

private void CheckDuplicate(String String){
Set<Character> charSet = new HashSet<>();
for (int i = 0; i < String.length(); i++) {
char currentChar = String.charAt(i);
if (charSet.contains(currentChar)) {
throw new IllegalArgumentException();
}
charSet.add(currentChar);
}
}
}
34 changes: 34 additions & 0 deletions src/main/java/baseball/View/GameView.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package baseball.View;

import camp.nextstep.edu.missionutils.Console;

public class GameView {
private final static String GAME_START = "숫자 야구 게임을 시작합니다.";
private final static String INPUT_NUMBERS = "숫자를 입력해주세요 : ";
private final static String GAME_END = "3개의 숫자를 모두 맞히셨습니다! 게임 종료";
private final static String INPUT_RESTART = "게임을 새로 시작하려면 1, 종료하려면 2를 입력하세요.";

public void showGameStart() {
System.out.println(GAME_START);
}

public void showInputNumbers() {
System.out.print(INPUT_NUMBERS);
}

public void showGameEnd() {
System.out.println(GAME_END);
}

public void showInputRestart() {
System.out.println(INPUT_RESTART);
}

public void showString(String string) {
System.out.println(string);
}

public String getInput() {
return Console.readLine();
}
}
3 changes: 2 additions & 1 deletion src/test/java/baseball/ApplicationTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
import static camp.nextstep.edu.missionutils.test.Assertions.assertSimpleTest;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatThrownBy;
import static org.assertj.core.api.Assertions.*;

class ApplicationTest extends NsTest {
@Test
Expand All @@ -32,4 +33,4 @@ class ApplicationTest extends NsTest {
public void runMain() {
Application.main(new String[]{});
}
}
}