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 d5b0084..e2c4cc8 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,21 @@ # 미션 - 숫자 야구 게임 +## 구현할 기능 +- 게임 시작 +- 3개의 임의의 수 생성 +- 사용자 입력 요구문 출력 +- 사용자 입력 + - 비정상적인 입력 처리 + - 세자리 수가 아닐 경우 + - 중복 수가 입력될 경우 + - 0이 입력될 경우 +- 사용자 입력과 임의의 수 비교 + - 스트라이크 판정 + - 볼 판정 + - 낫싱 판정 + - 판정 결과 출력 +- 재시작 여부 확인 + ## 🚀 기능 요구사항 - 이 게임은 프로그램이 1에서 9까지 서로 다른 임의의 수 3개를 정하고 이를 플레이어가 맞추는 게임이다. - 정답을 맞추기 위해 3자리수를 입력하고 힌트를 받는다. @@ -56,7 +72,7 @@ ## 🎱 프로그래밍 요구사항 - 자바 코드 컨벤션을 지키면서 프로그래밍한다. - - 기본적으로 [Google Java Style Guide](https://google.github.io/styleguide/javaguide.html) 문서와 [네이버 핵데이 Java 컨벤션](https://naver.github.io/hackday-conventions-java/)을 원칙으로 한다. + - 기본적으로 [Google Java Style Guide](https://google.github.io/styleguide/javaguide.html)을 원칙으로 한다. - 단, 들여쓰기는 '2 spaces'가 아닌 '4 spaces'로 한다. - indent(인덴트, 들여쓰기) depth를 3이 넘지 않도록 구현한다. 2까지만 허용한다. - 예를 들어 while문 안에 if문이 있으면 들여쓰기는 2이다. @@ -69,13 +85,13 @@ ### 프로그래밍 요구사항 - Application - Application 클래스를 활용해 구현해야 한다. - Application의 패키지 구조와 구현은 변경하지 않는다. -- `Scanner scanner = new Scanner(System.in);`는 변경하지 않는다. +- `final Scanner scanner = new Scanner(System.in);`는 변경하지 않는다. - `// TODO 구현 진행` 이 후 부터 구현한다. ```java public class Application { public static void main(String[] args) { - Scanner scanner = new Scanner(System.in); + final Scanner scanner = new Scanner(System.in); // TODO 구현 진행 } } @@ -96,10 +112,11 @@ private static final Random RANDOM = new Random();
## 📈 진행 요구사항 -- 미션은 현재 저장소를 fork & clone해서 시작한다. +- 미션은 [java-baseball-precourse 저장소](https://github.com/woowacourse/java-baseball-precourse) 를 fork/clone해 시작한다. - 기능을 구현하기 전에 java-baseball-precourse/README.md 파일에 구현할 기능 목록을 정리해 추가한다. - git의 commit 단위는 앞 단계에서 README.md 파일에 정리한 기능 목록 단위로 추가한다. - [AngularJS Commit Message Conventions](https://gist.github.com/stephenparish/9941e89d80e2bc58a153) 참고해 commit log를 남긴다. +- [프리코스 과제 제출 문서](https://github.com/woowacourse/woowacourse-docs/tree/master/precourse) 절차를 따라 미션을 제출한다.
diff --git a/build.gradle b/build.gradle index 95687b5..56b3bc8 100644 --- a/build.gradle +++ b/build.gradle @@ -1,19 +1,19 @@ -plugins { - id 'java' -} +apply plugin: 'java' +apply plugin: 'eclipse' -group 'org.example' -version '1.0-SNAPSHOT' +version = '1.0.0' +sourceCompatibility = 1.8 repositories { mavenCentral() } dependencies { - testImplementation 'org.junit.jupiter:junit-jupiter-api:5.6.0' - testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine' + testImplementation('org.junit.jupiter:junit-jupiter:5.7.0') + testImplementation('org.assertj:assertj-core:3.18.1') + testImplementation('org.mockito:mockito-inline:3.6.0') } test { useJUnitPlatform() -} \ No newline at end of file +} diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index be52383..8de3c30 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,9 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists +<<<<<<< HEAD distributionUrl=https\://services.gradle.org/distributions/gradle-6.7-bin.zip +======= +distributionUrl=https\://services.gradle.org/distributions/gradle-6.5.1-bin.zip +>>>>>>> 2d75f4343ccfdead02994a6674392d6353b04a19 zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew index 4f906e0..1960262 100755 --- a/gradlew +++ b/gradlew @@ -1,21 +1,5 @@ #!/usr/bin/env sh -# -# Copyright 2015 the original author or authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# https://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - ############################################################################## ## ## Gradle start up script for UN*X @@ -44,7 +28,7 @@ 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" "-Xms64m"' +DEFAULT_JVM_OPTS='"-Xmx64m"' # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD="maximum" @@ -82,7 +66,10 @@ esac CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar +<<<<<<< HEAD +======= +>>>>>>> 2d75f4343ccfdead02994a6674392d6353b04a19 # Determine the Java command to use to start the JVM. if [ -n "$JAVA_HOME" ] ; then if [ -x "$JAVA_HOME/jre/sh/java" ] ; then @@ -126,11 +113,10 @@ if $darwin; then GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" fi -# For Cygwin or MSYS, switch paths to Windows format before running java -if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then +# 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 @@ -156,19 +142,19 @@ if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then else eval `echo args$i`="\"$arg\"" fi - i=`expr $i + 1` + 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" ;; + (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 @@ -177,9 +163,14 @@ save () { for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done echo " " } -APP_ARGS=`save "$@"` +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 index 107acd3..6d57edc 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -1,19 +1,3 @@ -@rem -@rem Copyright 2015 the original author or authors. -@rem -@rem Licensed under the Apache License, Version 2.0 (the "License"); -@rem you may not use this file except in compliance with the License. -@rem You may obtain a copy of the License at -@rem -@rem https://www.apache.org/licenses/LICENSE-2.0 -@rem -@rem Unless required by applicable law or agreed to in writing, software -@rem distributed under the License is distributed on an "AS IS" BASIS, -@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -@rem See the License for the specific language governing permissions and -@rem limitations under the License. -@rem - @if "%DEBUG%" == "" @echo off @rem ########################################################################## @rem @@ -29,18 +13,15 @@ if "%DIRNAME%" == "" set DIRNAME=. set APP_BASE_NAME=%~n0 set APP_HOME=%DIRNAME% -@rem Resolve any "." and ".." in APP_HOME to make it shorter. -for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi - @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" "-Xms64m" +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 execute +if "%ERRORLEVEL%" == "0" goto init echo. echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. @@ -54,7 +35,7 @@ goto fail set JAVA_HOME=%JAVA_HOME:"=% set JAVA_EXE=%JAVA_HOME%/bin/java.exe -if exist "%JAVA_EXE%" goto execute +if exist "%JAVA_EXE%" goto init echo. echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% @@ -64,14 +45,28 @@ 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 %* +"%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 diff --git a/src/main/java/baseball/Application.java b/src/main/java/baseball/Application.java index d484dad..df54e3a 100644 --- a/src/main/java/baseball/Application.java +++ b/src/main/java/baseball/Application.java @@ -4,7 +4,16 @@ public class Application { public static void main(String[] args) { - Scanner scanner = new Scanner(System.in); - // TODO 구현 진행 + final Scanner scanner = new Scanner(System.in); + GamePlayer gamePlayer = new GamePlayer(); + + //게임 시작 + while(true){ + gamePlayer.play(scanner); + System.out.println("게임을 새로 시작하려면 1, 종료하려면 2를 입력하세요."); + if(scanner.nextInt()==1) + continue; + break; + } } } diff --git a/src/main/java/baseball/GamePlayer.java b/src/main/java/baseball/GamePlayer.java new file mode 100644 index 0000000..7a9972c --- /dev/null +++ b/src/main/java/baseball/GamePlayer.java @@ -0,0 +1,36 @@ +package baseball; + +import java.util.InputMismatchException; +import java.util.Scanner; + +import static baseball.Number.*; + +public class GamePlayer { + + public static void play(Scanner Input){ + Number random = new Number(); + Number player = new Number(); + Integer temp; + + //랜덤 수 생성 + random.setNumber(random.createNumber()); + + //게임 내 n트 + while(true) { + //입력 받고 비정상적인 입력 처리하고 저장 + System.out.print("숫자를 입력해 주세요 : "); + try { + temp = Input.nextInt(); + }catch (InputMismatchException e) { + throw new IllegalArgumentException("올바른 입력이 아닙니다!"); + } + + inputCheck(temp); + player.setNumber(splitNumber(temp)); + + Referee referee = new Referee(); + if (referee.judgement(random.getNumber(), player.getNumber())) + break; + } + } +} \ No newline at end of file diff --git a/src/main/java/baseball/Number.java b/src/main/java/baseball/Number.java new file mode 100644 index 0000000..1978333 --- /dev/null +++ b/src/main/java/baseball/Number.java @@ -0,0 +1,75 @@ +package baseball; + + +import utils.RandomUtils; + +import java.util.ArrayList; + +public class Number { + private ArrayList number; + + public ArrayList getNumber() { + return number; + } + + public void setNumber(ArrayList playerNumber) { + this.number = playerNumber; + } + + //임의의 수 3개 생성 + public static ArrayList createNumber(){ + ArrayList result = new ArrayList<>(); + int temp; + + //중복 수 제거 + for(int i = 0 ; i<3; i++) { + temp = RandomUtils.nextInt(1, 9); + + if (!result.contains(temp)) + result.add(temp); + else + i--; + } + return result; + } + + //입력받은 수 배열로 변환 + public static ArrayList splitNumber(Integer playerNumber) { + ArrayList splitPlayerNumber = new ArrayList<>(); + for (int i = 0; i < 3; i++) { + splitPlayerNumber.add(0, playerNumber % 10); + playerNumber /= 10; + } + return splitPlayerNumber; + } + + //비정상적인 입력 처리 + public static void inputCheck(Integer number){ + is_Include_Zero(splitNumber(number)); + is_Not_ThreeDigits(number); + is_overlap(splitNumber(number)); + } + + //세자리 수가 아닐 경우 + public static void is_Not_ThreeDigits(Integer number){ + if(number.toString().length()!=3) + throw new IllegalArgumentException("올바른 입력이 아닙니다!"); + } + + //중복일 경우 + public static void is_overlap(ArrayList number){ + ArrayList temp = new ArrayList<>(); + + for(int i = 0 ; i< 3; i++){ + if(temp.contains(number.get(i))) + throw new IllegalArgumentException("올바른 입력이 아닙니다!"); + temp.add(number.get(i)); + } + } + + //0이 입력될 경우 + public static void is_Include_Zero(ArrayList number){ + if(number.contains(0)) + throw new IllegalArgumentException("올바른 입력이 아닙니다!"); + } +} \ No newline at end of file diff --git a/src/main/java/baseball/Referee.java b/src/main/java/baseball/Referee.java new file mode 100644 index 0000000..dd66d7d --- /dev/null +++ b/src/main/java/baseball/Referee.java @@ -0,0 +1,56 @@ +package baseball; + +import java.util.ArrayList; + +public class Referee { + private int strike; + private int ball; + + public Referee(){ + this.strike = 0; + this.ball = 0; + } + + public boolean judgement(ArrayList randomNumber, ArrayList playerNumber){ + count_Strike(randomNumber, playerNumber); + count_Ball(randomNumber, playerNumber); + + if(this.strike==3) { + System.out.print("3스트라이크\n3개의 숫자를 모두 맞히셨습니다! 게임 종료"); + return true; + } + if(this.strike != 0 && this.ball != 0) + System.out.println(this.ball + "볼 " + this.strike + "스트라이크"); + else if(this.strike == 0 && this.ball != 0) + System.out.println(this.ball + "볼"); + else if(this.strike != 0 && this.ball == 0) + System.out.println(this.strike + "스트라이크"); + else{ + System.out.println("낫싱"); + } + return false; + } + + public int count_Strike(ArrayList randomNumber, ArrayList playerNumber){ + for(int i = 0 ; i < 3; i++){ + this.strike += is_equals(randomNumber.get(i), playerNumber.get(i)); + } + return this.strike; + } + + public int count_Ball(ArrayList randomNumber, ArrayList playerNumber){ + for(int i = 0; i < 3; i++){ + for(int j = 0; j < 3; j++){ + this.ball += is_equals(randomNumber.get(i), playerNumber.get(j)); + } + } + this.ball -= this.strike; + return this.ball; + } + + public int is_equals(int randomNumber, int playerNumber){ + if(randomNumber==playerNumber) + return 1; + return 0; + } +}