diff --git a/docs/README.md b/docs/README.md new file mode 100644 index 0000000..f625b8c --- /dev/null +++ b/docs/README.md @@ -0,0 +1,35 @@ +## 기능 요구사항 + +### 객체별 역할 + +**View** +- [x] 게임 버전(영어/숫자)입력 받기 +- [x] 숫자 입력받기 +- [x] 영어 입력받기 + +**Output** +- [x] 게임 시작 문구 출력 +- [x] UP/DOWN 결과 출력 +- [x] 정답이면 정답문구 출력 +- [x] 시도환 횟수 출력 + +**Controller** +- [x] 게임 시작 +- [ ] 입력값 유효성 검사 + +**Model** +- [x] 랜덤수 생성 +- [x] 랜덤수보다 입력값이 크면 UP 판단 +- [x] 랜덤수보다 입력값이 작으면 DOWN 판단 +- [x] 랜덤수가 입력값과 같으면 게임 종료 +- [x] 시도횟수 판단 + +**에러처리** +- [x] 버전 이외의 값 입력 + :[ERROR] 존재하지 않는 버전입니다. +- [ ] 범위 밖의 숫자 입력 + :[ERROR] 범위 내의 숫자를 입력하세요. +- [ ] 범위 밖의 알파벳 입력 + :[ERROR] 범위 내의 알파벳을 입력하세요. +- [ ] 다른 타입의 입력값 입력 + :[ERROR] 입력 문자의 타입이 맞지 않습니다. diff --git a/src/main/java/leets/land/UpdownApplication.java b/src/main/java/leets/land/UpdownApplication.java index 09d7ae5..f8c5329 100644 --- a/src/main/java/leets/land/UpdownApplication.java +++ b/src/main/java/leets/land/UpdownApplication.java @@ -1,8 +1,11 @@ package leets.land; +import leets.land.controller.Controller; + public class UpdownApplication { public static void main(String[] args) { - System.out.print("hihi :D"); + Controller controller = new Controller(); + controller.play(); } } diff --git a/src/main/java/leets/land/constants/Constants.java b/src/main/java/leets/land/constants/Constants.java new file mode 100644 index 0000000..86b5888 --- /dev/null +++ b/src/main/java/leets/land/constants/Constants.java @@ -0,0 +1,4 @@ +package leets.land.constants; + +public class Constants { +} diff --git a/src/main/java/leets/land/controller/Controller.java b/src/main/java/leets/land/controller/Controller.java new file mode 100644 index 0000000..8c5679c --- /dev/null +++ b/src/main/java/leets/land/controller/Controller.java @@ -0,0 +1,70 @@ +package leets.land.controller; + +import leets.land.model.AlphabetComputer; +import leets.land.model.NumberComputer; +import leets.land.view.InputView; +import leets.land.view.OutputView; + +public class Controller { + private final static AlphabetComputer alphabetComputer = new AlphabetComputer(); + private final static NumberComputer numberComputer = new NumberComputer(); + private final static InputView inputView = new InputView(); + private final static OutputView outputView = new OutputView(); + + public void play(){ + outputView.printStart(); + int version = inputView.getVersion(); + + if(version == 1){ + numberPlay(); + }else if( version == 2) { + alphabetPlay(); + }else{ + outputView.printErrorMessage("존재하지 않는 버전입니다."); + play(); + } + } + public void numberPlay(){ + while (true){ + int input = inputView.getNextNumberGuess(numberComputer.getMin(), numberComputer.getMax()); + if (!numberComputer.isValidInput(input)) { + outputView.printErrorMessage("범위 내의 숫자를 입력하세요."); + continue; + } + if(numberComputer.up(input)){ + numberComputer.judgeUp(input); + outputView.printUpDownResult("UP"); + }else if(numberComputer.down(input)){ + numberComputer.judgeDown(input); + outputView.printUpDownResult("DOWN"); + }else if(numberComputer.correct(input)){ + outputView.printUpDownResult("정답 !"); + outputView.printCount(numberComputer.getCount()); + break; + } + } + } + + public void alphabetPlay(){ + while (true){ + char input = inputView.getNextAlphabetGuess(alphabetComputer.getMin(), alphabetComputer.getMax()); + if (!alphabetComputer.isValidInput(input)) { + outputView.printErrorMessage("범위 내의 알파벳을 입력하세요."); + continue; + } + + if(alphabetComputer.up(input)){ + alphabetComputer.judgeUp(input); + outputView.printUpDownResult("UP"); + } else if(alphabetComputer.down(input)){ + alphabetComputer.judgeDown(input); + outputView.printUpDownResult("DOWN"); + } else if(alphabetComputer.correct(input)){ + outputView.printUpDownResult("정답 !"); + outputView.printCount(alphabetComputer.getCount()); + break; + } + } + + } +} diff --git a/src/main/java/leets/land/model/AlphabetComputer.java b/src/main/java/leets/land/model/AlphabetComputer.java new file mode 100644 index 0000000..4510b33 --- /dev/null +++ b/src/main/java/leets/land/model/AlphabetComputer.java @@ -0,0 +1,61 @@ +package leets.land.model; + +import java.util.regex.Pattern; + +public class AlphabetComputer { + + private static char answer = (char) (Math.random() * ('z'-'A'+1) + 'A'); + private static int count = 1; + private static char min = 'A'; + private static char max = 'z'; + + + public int getCount() { + return count; + } + + public char getMin(){ + return min; + } + public char getMax(){ + return max; + } + public void judgeUp(char input) { + count++; + if (input == 'z') { + max = 'z'; + min = 'A'; + } else { + min = (char) (input + 1); + max = 'z'; + } + } + + public void judgeDown(char input) { + count++; + if (input == 'A') { + min = 'A'; + max = 'z'; + } else { + max = (char) (input - 1); + min = 'A'; + } + } + + public boolean up(char input) { + return answer > input; + } + + public boolean down(char input) { + return answer < input; + } + + public boolean correct(char input) { + return answer == input; + } + + public boolean isValidInput(char input) { + return input >= min && input <= max; + } + +} diff --git a/src/main/java/leets/land/model/NumberComputer.java b/src/main/java/leets/land/model/NumberComputer.java new file mode 100644 index 0000000..635d902 --- /dev/null +++ b/src/main/java/leets/land/model/NumberComputer.java @@ -0,0 +1,48 @@ +package leets.land.model; + +public class NumberComputer { + private static int answer = (int) (Math.random() * 100) + 1; + private static int count = 1; + private static int min = 1; + private static int max = 100; + + + public int getCount() { + return count; + } + + public int getMin() { + return min; + } + + public int getMax() { + return max; + } + + public void judgeUp(int input) { + count++; + min = input + 1; + } + + public void judgeDown(int input) { + count++; + max = input - 1; + } + + public boolean up(int input) { + return answer > input; + } + + public boolean down(int input) { + return answer < input; + } + + public boolean correct(int input) { + return answer == input; + } + + public boolean isValidInput(int input){ + return input >= min && input <= max; + + } +} diff --git a/src/main/java/leets/land/view/InputView.java b/src/main/java/leets/land/view/InputView.java new file mode 100644 index 0000000..8e32ede --- /dev/null +++ b/src/main/java/leets/land/view/InputView.java @@ -0,0 +1,24 @@ +package leets.land.view; + +import java.util.Scanner; + +public class InputView { + private final Scanner scanner; + + public InputView(){ + scanner = new Scanner(System.in); + } + public int getVersion(){ + System.out.print("버전을 입력해주세요 (숫자 버전: 1, 영어 버전: 2) :"); + return scanner.nextInt(); + } + + public int getNextNumberGuess(int min, int max){ + System.out.printf("숫자를 입력해주세요(%d ~ %d) : ",min ,max); + return scanner.nextInt(); + } + public char getNextAlphabetGuess(char min, char max){ + System.out.printf("영어를 입력해주세요(%c ~ %c) : ",min ,max); + return scanner.next().charAt(0); + } +} diff --git a/src/main/java/leets/land/view/OutputView.java b/src/main/java/leets/land/view/OutputView.java new file mode 100644 index 0000000..f27dea4 --- /dev/null +++ b/src/main/java/leets/land/view/OutputView.java @@ -0,0 +1,19 @@ +package leets.land.view; + +public class OutputView { + public void printStart(){ + System.out.println("업다운 게임을 시작합니다.\n"); + } + + public void printUpDownResult(String result){ + System.out.println(result); + } + + public void printCount(int count){ + System.out.println("\n시도한 횟수 : " + count); + } + + public void printErrorMessage(String message) { + System.out.println("[ERROR] " + message); + } +}