diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..76611b0 --- /dev/null +++ b/.gitignore @@ -0,0 +1,21 @@ +.DS_Store +.gradle +/build/ +!gradle/wrapper/gradle-wrapper.jar +/out/ +/target/ + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +bin/ + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr \ No newline at end of file diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..26d3352 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,3 @@ +# Default ignored files +/shelf/ +/workspace.xml diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..29af3ee --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..35eb1dd --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..2e82af5 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2020 woowacourse + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md index 94a4ce9..1bee390 100644 --- a/README.md +++ b/README.md @@ -1,25 +1,130 @@ -# java-challenges -https://github.com/JunHoPark93/woowacourse-projects -- 학습한 자바를 사용하여 프로젝트를 직접 구현 -- 리뷰를 통한 코드의 개선 - -## java-baseball-game -https://github.com/woowacourse/java-baseball-precourse - -## 브랜치 -- `main`브랜치가 아닌, 프로젝트 별 브랜치를 생성하여 진행합니다. - - ex) 브랜치 명을 `java_baseball_game_손현경` 으로 생성합니다. -- 구현이 끝나면, `PR`을 올리고, `Assignee`를 본인으로 지정합니다. -- 스터디장이 `Reviewers`를 한 프로젝트 당 `3명씩` 지정하고, 코드 리뷰를 진행합니다. -- 리뷰에 달린 수정사항들을 반영한 후 `main`에 `Merge`합니다. -## 폴더명 -- 자신의 작업물은 자신의 깃허브 아이디 디렉토리에서 관리합니다. - - ex) shkisme/java_baseball_game -## 커밋 메세지 구조 -- `Review`가 용이하도록, 역할에 따라 `Commit`을 분리합니다. -- `feat` : 새로운 기능에 대한 커밋 -- `fix` : 버그 수정에 대한 커밋 -- `chore` : 자잘한 수정에 대한 커밋 -- `docs` : 문서 수정에 대한 커밋 -- `style` : 코드 리팩토링에 대한 커밋 -- `test` : 테스트 코드 수정에 대한 커밋 +# 미션 - 숫자 야구 게임 + +## 🔍 진행방식 + +- 미션은 **기능 요구사항, 프로그래밍 요구사항, 과제 진행 요구사항** 세 가지로 구성되어 있다. +- 세 개의 요구사항을 만족하기 위해 노력한다. 특히 기능을 구현하기 전에 기능 목록을 만들고, 기능 단위로 커밋 하는 방식으로 진행한다. + +## ✉️ 미션 제출 방법 + +- 미션 구현을 완료한 후 GitHub을 통해 제출해야 한다. + - GitHub을 활용한 제출 방법은 [프리코스 과제 제출 문서](https://github.com/woowacourse/woowacourse-docs/tree/master/precourse) 를 참고해 제출한다. +- GitHub에 미션을 제출한 후 [우아한테크코스 지원 플랫폼](https://apply.techcourse.co.kr) 에 접속하여 프리코스 과제를 제출한다. + - 자세한 방법은 [링크](https://github.com/woowacourse/woowacourse-docs/tree/master/precourse#제출-가이드) 를 참고한다. + - **Pull Request만 보내고, 지원 플랫폼에서 과제를 제출하지 않으면 최종 제출하지 않은 것으로 처리되니 주의한다.** + +## ✔️ 과제 제출 전 체크리스트 - 0점 방지 + +- 터미널에서 `java -version`을 실행해 자바 8인지 확인한다. 또는 Eclipse, IntelliJ IDEA와 같은 IDE의 자바 8로 실행하는지 확인한다. +- 터미널에서 맥 또는 리눅스 사용자의 경우 `./gradlew clean test`, 윈도우 사용자의 경우 `gradlew.bat clean test` 명령을 실행했을 때 모든 테스트가 통과하는지 확인한다. + +--- + +## 🚀 기능 요구사항 + +기본적으로 1부터 9까지 서로 다른 수로 이루어진 3자리의 수를 맞추는 게임이다. + +- 같은 수가 같은 자리에 있으면 스트라이크, 다른 자리에 있으면 볼, 같은 수가 전혀 없으면 포볼 또는 낫싱이란 힌트를 얻고, 그 힌트를 이용해서 먼저 상대방(컴퓨터)의 수를 맞추면 승리한다. + - 예) 상대방(컴퓨터)의 수가 425일 때 + - 123을 제시한 경우 : 1스트라이크 + - 456을 제시한 경우 : 1볼 1스트라이크 + - 789를 제시한 경우 : 낫싱 +- 위 숫자 야구 게임에서 상대방의 역할을 컴퓨터가 한다. 컴퓨터는 1에서 9까지 서로 다른 임의의 수 3개를 선택한다. 게임 플레이어는 컴퓨터가 생각하고 있는 3개의 숫자를 입력하고, 컴퓨터는 입력한 숫자에 대한 결과를 출력한다. +- 이 같은 과정을 반복해 컴퓨터가 선택한 3개의 숫자를 모두 맞히면 게임이 종료된다. +- 게임을 종료한 후 게임을 다시 시작하거나 완전히 종료할 수 있다. +- 사용자가 잘못된 값을 입력할 경우 `IllegalArgumentException`을 발생시킨 후 애플리케이션은 종료되어야 한다. +- 아래의 프로그래밍 실행 결과 예시와 동일하게 입력과 출력이 이루어져야 한다. + +
+ +## ✍🏻 입출력 요구사항 + +### ⌨️ 입력 + +- 3자리의 수 +- 게임이 끝난 경우 재시작/종료를 구분하는 1과 2 중 하나의 수 + +### 🖥 출력 + +- 입력한 수에 대한 결과를 볼, 스트라이크 개수로 표시 + +``` +1볼 1스트라이크 +``` + +- 하나도 없는 경우 + +``` +낫싱 +``` + +- 3개의 숫자를 모두 맞힐 경우 + +``` +3스트라이크 +3개의 숫자를 모두 맞히셨습니다! 게임 종료 +``` + +### 💻 프로그래밍 실행 결과 예시 + +``` +숫자를 입력해주세요 : 123 +1볼 1스트라이크 +숫자를 입력해주세요 : 145 +1볼 +숫자를 입력해주세요 : 671 +2볼 +숫자를 입력해주세요 : 216 +1스트라이크 +숫자를 입력해주세요 : 713 +3스트라이크 +3개의 숫자를 모두 맞히셨습니다! 게임 종료 +게임을 새로 시작하려면 1, 종료하려면 2를 입력하세요. +1 +숫자를 입력해주세요 : 123 +1볼 +… +``` + +
+ +--- + +## 🎱 프로그래밍 요구사항 + +- 프로그램을 실행하는 시작점은 `Application`의 `main()`이다. +- JDK 8 버전에서 실행 가능해야 한다. **JDK 8에서 정상 동작하지 않을 경우 0점 처리**한다. +- 자바 코드 컨벤션을 지키면서 프로그래밍한다. + - https://naver.github.io/hackday-conventions-java +- indent(인덴트, 들여쓰기) depth를 3이 넘지 않도록 구현한다. 2까지만 허용한다. + - 예를 들어 while문 안에 if문이 있으면 들여쓰기는 2이다. + - 힌트: indent(인덴트, 들여쓰기) depth를 줄이는 좋은 방법은 함수(또는 메소드)를 분리하면 된다. +- 3항 연산자를 쓰지 않는다. +- 함수(또는 메소드)가 한 가지 일만 하도록 최대한 작게 만들어라. + +### 프로그래밍 요구사항 - Randoms, Console + +- JDK에서 기본 제공하는 Random, Scanner API 대신 `camp.nextstep.edu.missionutils`에서 제공하는 `Randoms`, `Console` API를 활용해 구현해야 한다. + - Random 값 추출은 `camp.nextstep.edu.missionutils.Randoms`의 `pickNumberInRange()`를 활용한다. + - 사용자가 입력하는 값은 `camp.nextstep.edu.missionutils.Console`의 `readLine()`을 활용한다. +- 프로그램 구현을 완료했을 때 `src/test/java` 디렉터리의 `ApplicationTest`에 있는 모든 테스트 케이스가 성공해야 한다. **테스트가 실패할 경우 0점 처리한다.** + +
+ +--- + +## 📈 과제 진행 요구사항 + +- 미션은 [java-baseball-precourse](https://github.com/woowacourse/java-baseball-precourse) 저장소를 Fork/Clone해 시작한다. +- **기능을 구현하기 전에 java-baseball-precourse/README.md 파일에 구현할 기능 목록을 정리**해 추가한다. +- **Git의 커밋 단위는 앞 단계에서 README.md 파일에 정리한 기능 목록 단위**로 추가한다. + - [AngularJS Commit Message Conventions](https://gist.github.com/stephenparish/9941e89d80e2bc58a153) 참고해 commit log를 남긴다. +- 과제 진행 및 제출 방법은 [프리코스 과제 제출 문서](https://github.com/woowacourse/woowacourse-docs/tree/master/precourse) 를 참고한다. + +
+ +--- + +## 📝 License + +This project is [MIT](https://github.com/woowacourse/java-baseball-precourse/blob/master/LICENSE) licensed. diff --git a/build.gradle b/build.gradle new file mode 100644 index 0000000..fae7297 --- /dev/null +++ b/build.gradle @@ -0,0 +1,18 @@ +apply plugin: 'java' +apply plugin: 'eclipse' + +version = '1.0.0' +sourceCompatibility = 1.8 + +repositories { + maven { url 'https://jitpack.io' } + mavenCentral() +} + +dependencies { + implementation('com.github.woowacourse-projects:mission-utils:1.0.0') +} + +test { + useJUnitPlatform() +} diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000..87b738c Binary files /dev/null and b/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..bb8b2fc --- /dev/null +++ b/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,5 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-6.5.1-bin.zip +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew new file mode 100644 index 0000000..af6708f --- /dev/null +++ b/gradlew @@ -0,0 +1,172 @@ +#!/usr/bin/env sh + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m"' + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn () { + echo "$*" +} + +die () { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; + NONSTOP* ) + nonstop=true + ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin, switch paths to Windows format before running java +if $cygwin ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=$((i+1)) + done + case $i in + (0) set -- ;; + (1) set -- "$args0" ;; + (2) set -- "$args0" "$args1" ;; + (3) set -- "$args0" "$args1" "$args2" ;; + (4) set -- "$args0" "$args1" "$args2" "$args3" ;; + (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Escape application args +save () { + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done + echo " " +} +APP_ARGS=$(save "$@") + +# Collect all arguments for the java command, following the shell quoting and substitution rules +eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" + +# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong +if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then + cd "$(dirname "$0")" +fi + +exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat new file mode 100644 index 0000000..6d57edc --- /dev/null +++ b/gradlew.bat @@ -0,0 +1,84 @@ +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto init + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto init + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:init +@rem Get command-line arguments, handling Windows variants + +if not "%OS%" == "Windows_NT" goto win9xME_args + +:win9xME_args +@rem Slurp the command line arguments. +set CMD_LINE_ARGS= +set _SKIP=2 + +:win9xME_args_slurp +if "x%~1" == "x" goto execute + +set CMD_LINE_ARGS=%* + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/src/main/java/baseball/Application.java b/src/main/java/baseball/Application.java new file mode 100644 index 0000000..c2102d0 --- /dev/null +++ b/src/main/java/baseball/Application.java @@ -0,0 +1,15 @@ +package baseball; + +public class Application { + + public static void main(String[] args) { + //TODO: 숫자 야구 게임 구현 + + BaseballGame baseballgame = new BaseballGame(); + InputAndOutput input = new InputAndOutput(); + + do { + baseballgame.Game(); + } while (input.isContinue()); + } +} diff --git a/src/main/java/baseball/BaseballGame.java b/src/main/java/baseball/BaseballGame.java new file mode 100644 index 0000000..6423c9b --- /dev/null +++ b/src/main/java/baseball/BaseballGame.java @@ -0,0 +1,21 @@ +package baseball; + +public class BaseballGame { + + void Game() { + RandomInt answer = new RandomInt(); + answer.generateRandomInt(); + InputAndOutput inout = new InputAndOutput(); + + int user, strike, ball; + + do { + user = inout.userNumber(); + + strike = answer.countStrike(user); + ball = answer.countSameNumber(user) - strike; + + inout.printResult(ball, strike); + } while (strike != 3); + } +} diff --git a/src/main/java/baseball/ContinueOrNot.java b/src/main/java/baseball/ContinueOrNot.java new file mode 100644 index 0000000..6bdab0d --- /dev/null +++ b/src/main/java/baseball/ContinueOrNot.java @@ -0,0 +1,15 @@ +package baseball; + +public enum ContinueOrNot { + CONTINUE(1), END(2); + + private final int value; + + ContinueOrNot(int value) { + this.value = value; + } + + public int getValue() { + return value; + } +} diff --git a/src/main/java/baseball/InputAndOutput.java b/src/main/java/baseball/InputAndOutput.java new file mode 100644 index 0000000..fe68851 --- /dev/null +++ b/src/main/java/baseball/InputAndOutput.java @@ -0,0 +1,46 @@ +package baseball; + +import java.util.Scanner; + +import static baseball.ContinueOrNot.CONTINUE; + +public class InputAndOutput { + + Scanner scanner = new Scanner(System.in); + + public int userNumber() { + System.out.print("숫자를 입력해주세요: "); + int user; + try { + user = scanner.nextInt(); + } catch (Exception e) { + throw new IllegalArgumentException("answer must be INTEGERS"); + } + + if (user < 100) { + throw new IllegalArgumentException("answer must be THREE integers"); + } + + return user; + } + + public boolean isContinue() { + System.out.println("게임을 새로 시작하려면 1, 종료하려면 2를 입력하세요."); + int isContinue = scanner.nextInt(); + return isContinue == CONTINUE.getValue(); + } + + public void printResult(int ball, int strike) { + if (ball == 0 && strike == 0) { + System.out.println("낫싱"); + } else { + if (ball != 0) { + System.out.print(ball + "볼"); + } + if (strike != 0) { + System.out.print(strike + "스트라이크"); + } + System.out.print("\n"); + } + } +} diff --git a/src/main/java/baseball/RandomInt.java b/src/main/java/baseball/RandomInt.java new file mode 100644 index 0000000..9f168db --- /dev/null +++ b/src/main/java/baseball/RandomInt.java @@ -0,0 +1,60 @@ +package baseball; + +import java.util.Random; + +public class RandomInt { + + int number; + + RandomInt() { + } + + public void generateRandomInt() { + Random random = new Random(); + while (true) { + number = random.nextInt(999); + int com1, com2, com3; + com1 = number % 10; + com2 = (number / 10) % 10; + com3 = number / 100; + if (com1 != com2 && com2 != com3 && com3 != com1) { + break; + } + } + } + + public int countStrike(int user) { + int strike = 0; + int answer = number; + + while (answer > 0) { + if (answer % 10 == user % 10) { + strike++; + } + answer /= 10; + user /= 10; + } + + return strike; + } + + public int countSameNumber(int user) { + int howMany = 0; + int answer = number; + + while (answer > 0) { + if (answer % 10 == user % 10) { + howMany++; + } + if (answer % 10 == (user / 10) % 10) { + howMany++; + } + if (answer % 10 == user / 100) { + howMany++; + } + answer /= 10; + } + + return howMany; + } +} diff --git a/src/test/java/baseball/ApplicationTest.java b/src/test/java/baseball/ApplicationTest.java new file mode 100644 index 0000000..359aacf --- /dev/null +++ b/src/test/java/baseball/ApplicationTest.java @@ -0,0 +1,36 @@ +package baseball; + +import camp.nextstep.edu.missionutils.test.NsTest; +import org.junit.jupiter.api.Test; + +import static camp.nextstep.edu.missionutils.test.Assertions.assertRandomNumberInRangeTest; +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; + +class ApplicationTest extends NsTest { + + @Test + void 게임종료_후_재시작() { + assertRandomNumberInRangeTest( + () -> { + run("246", "135", "1", "597", "589", "2"); + assertThat(output()).contains("낫싱", "3스트라이크", "1볼 1스트라이크", "3스트라이크", "게임 종료"); + }, + 1, 3, 5, 5, 8, 9 + ); + } + + @Test + void 예외_테스트() { + assertSimpleTest(() -> + assertThatThrownBy(() -> runException("1234")) + .isInstanceOf(IllegalArgumentException.class) + ); + } + + @Override + public void runMain() { + Application.main(new String[]{}); + } +}