diff --git a/src/main/java/leets/land/UpdownApplication.java b/src/main/java/leets/land/UpdownApplication.java index 09d7ae5..d50d61c 100644 --- a/src/main/java/leets/land/UpdownApplication.java +++ b/src/main/java/leets/land/UpdownApplication.java @@ -1,8 +1,10 @@ package leets.land; -public class UpdownApplication { +import leets.land.controller.GameLoader; - public static void main(String[] args) { - System.out.print("hihi :D"); - } -} +public class UpdownApplication { + public static void main(String[] args) { + GameLoader gameLoader = new GameLoader(); + gameLoader.load(); + } +} \ No newline at end of file diff --git a/src/main/java/leets/land/controller/AlphabetGame.java b/src/main/java/leets/land/controller/AlphabetGame.java new file mode 100644 index 0000000..c36d54a --- /dev/null +++ b/src/main/java/leets/land/controller/AlphabetGame.java @@ -0,0 +1,47 @@ +package leets.land.controller; + +import leets.land.domain.AlphabetUpDown; +import leets.land.domain.UpDown; +import leets.land.view.InputView; +import leets.land.view.OutputView; + +public class AlphabetGame implements Game { + final InputView inputView = new InputView(); + final OutputView outputView = new OutputView(); + + @Override + public void run() { + UpDown updown = new AlphabetUpDown(); + play(updown); + } + + @Override + public void play(UpDown updown) { + char answer = updown.getAnswerAsChar(); + + while (true) { + char alphabet = inputView.inputAlphabetInRange(updown.getStartAsChar(), updown.getEndAsChar()); + + try { + updown.validator(alphabet); + } catch (IllegalArgumentException e) { + System.out.println(e.getMessage()); + continue; + } + + updown.increaseCount(); + + if (alphabet == answer) { + System.out.println("Correct!"); + outputView.printCount(updown.getCount()); + break; + } else if (alphabet < answer) { + System.out.println("UP"); + updown.setStart(alphabet + 1); + } else { + System.out.println("DOWN"); + updown.setEnd(alphabet - 1); + } + } + } +} diff --git a/src/main/java/leets/land/controller/Game.java b/src/main/java/leets/land/controller/Game.java new file mode 100644 index 0000000..6854f5f --- /dev/null +++ b/src/main/java/leets/land/controller/Game.java @@ -0,0 +1,8 @@ +package leets.land.controller; + +import leets.land.domain.UpDown; + +public interface Game { + void run(); + void play(UpDown upDown); +} diff --git a/src/main/java/leets/land/controller/GameLoader.java b/src/main/java/leets/land/controller/GameLoader.java new file mode 100644 index 0000000..c86a6f0 --- /dev/null +++ b/src/main/java/leets/land/controller/GameLoader.java @@ -0,0 +1,18 @@ +package leets.land.controller; + +import leets.land.domain.Version; +import leets.land.view.InputView; + +public class GameLoader { + final InputView inputView = new InputView(); + + public void load() { + Version version = inputVersion(); + version.run(); + } + + private Version inputVersion() { + int gameVersion = inputView.inputVersion(); + return Version.versionValidator(gameVersion); + } +} \ No newline at end of file diff --git a/src/main/java/leets/land/controller/NumberGame.java b/src/main/java/leets/land/controller/NumberGame.java new file mode 100644 index 0000000..2852938 --- /dev/null +++ b/src/main/java/leets/land/controller/NumberGame.java @@ -0,0 +1,47 @@ +package leets.land.controller; + +import leets.land.domain.NumberUpDown; +import leets.land.domain.UpDown; +import leets.land.view.InputView; +import leets.land.view.OutputView; + +public class NumberGame implements Game { + final InputView inputView = new InputView(); + final OutputView outputView = new OutputView(); + + @Override + public void run() { + UpDown updown = new NumberUpDown(); + play(updown); + } + + @Override + public void play(UpDown updown) { + int answer = updown.getAnswerAsInt(); + + while (true) { + int number = inputView.inputNumberInRange(updown.getStartAsInt(), updown.getEndAsInt()); + + try { + updown.validator(number); + } catch (IllegalArgumentException e) { + System.out.println(e.getMessage()); + continue; + } + + updown.increaseCount(); + + if (number == answer) { + System.out.println("Correct!"); + outputView.printCount(updown.getCount()); + break; + } else if (number < answer) { + System.out.println("UP"); + updown.setStart(number + 1); + } else { + System.out.println("DOWN"); + updown.setEnd(number - 1); + } + } + } +} diff --git a/src/main/java/leets/land/domain/AlphabetUpDown.java b/src/main/java/leets/land/domain/AlphabetUpDown.java new file mode 100644 index 0000000..877435d --- /dev/null +++ b/src/main/java/leets/land/domain/AlphabetUpDown.java @@ -0,0 +1,77 @@ +package leets.land.domain; + +public class AlphabetUpDown implements UpDown { + private final char answerAlphabet = Answer.setAlphabet(); + private char startAlphabet = 'A', endAlphabet = 'z'; + private int count = 0; + + @Override + public int getAnswerAsInt() { + return 0; + } + + @Override + public char getAnswerAsChar() { + return answerAlphabet; + } + + @Override + public int getStartAsInt() { + return 0; + } + + @Override + public char getStartAsChar() { + return startAlphabet; + } + + @Override + public int getEndAsInt() { + return 0; + } + + @Override + public char getEndAsChar() { + return endAlphabet; + } + + @Override + public int getCount() { + return count; + } + + @Override + public void setStart(int start) { + if (start - 1 == 'Z') { + startAlphabet = 'a'; + } else { + startAlphabet = (char) start; + } + } + + @Override + public void setEnd(int end) { + if (end + 1 == 'a') { + endAlphabet = 'Z'; + } else { + endAlphabet = (char) end; + } + } + + @Override + public void increaseCount() { + count++; + } + + @Override + public void validator(char alphabet) { + if (alphabet < startAlphabet || alphabet > endAlphabet) { + throw new IllegalArgumentException("[ERROR] 범위 내의 알파벳을 입력하세요."); + } + } + + @Override + public void validator(int number) { + + } +} diff --git a/src/main/java/leets/land/domain/Answer.java b/src/main/java/leets/land/domain/Answer.java new file mode 100644 index 0000000..08eaa4d --- /dev/null +++ b/src/main/java/leets/land/domain/Answer.java @@ -0,0 +1,17 @@ +package leets.land.domain; + +public class Answer { + public static int setNumber() { + return (int) (Math.random() * 100) + 1; + } + + public static char setAlphabet() { + char answer = (char) ((int) (Math.random() * ('z'-'A')) + 'A'); + + if (answer > 'Z' && answer < 'a') { + return setAlphabet(); + } + + return answer; + } +} diff --git a/src/main/java/leets/land/domain/NumberUpDown.java b/src/main/java/leets/land/domain/NumberUpDown.java new file mode 100644 index 0000000..f017025 --- /dev/null +++ b/src/main/java/leets/land/domain/NumberUpDown.java @@ -0,0 +1,69 @@ +package leets.land.domain; + +public class NumberUpDown implements UpDown { + private final int answerNumber = Answer.setNumber(); + private int startNumber = 1, endNumber = 100; + private int count = 0; + + @Override + public int getAnswerAsInt() { + return answerNumber; + } + + @Override + public char getAnswerAsChar() { + return 0; + } + + @Override + public int getStartAsInt() { + return startNumber; + } + + @Override + public char getStartAsChar() { + return 0; + } + + @Override + public int getEndAsInt() { + return endNumber; + } + + @Override + public char getEndAsChar() { + return 0; + } + + @Override + public int getCount() { + return count; + } + + @Override + public void setStart(int start) { + startNumber = start; + } + + @Override + public void setEnd(int end) { + endNumber = end; + } + + @Override + public void increaseCount() { + count++; + } + + @Override + public void validator(char alphabet) { + return; + } + + @Override + public void validator(int number) { + if (number < startNumber || number > endNumber) { + throw new IllegalArgumentException("[ERROR] 범위 내의 숫자를 입력하세요."); + } + } +} diff --git a/src/main/java/leets/land/domain/UpDown.java b/src/main/java/leets/land/domain/UpDown.java new file mode 100644 index 0000000..e75638b --- /dev/null +++ b/src/main/java/leets/land/domain/UpDown.java @@ -0,0 +1,27 @@ +package leets.land.domain; + +public interface UpDown { + int getAnswerAsInt(); + + char getAnswerAsChar(); + + int getStartAsInt(); + + char getStartAsChar(); + + int getEndAsInt(); + + char getEndAsChar(); + + int getCount(); + + void setStart(int start); + + void setEnd(int end); + + void increaseCount(); + + void validator(char alphabet); + + void validator(int number); +} \ No newline at end of file diff --git a/src/main/java/leets/land/domain/Version.java b/src/main/java/leets/land/domain/Version.java new file mode 100644 index 0000000..27f2e06 --- /dev/null +++ b/src/main/java/leets/land/domain/Version.java @@ -0,0 +1,32 @@ +package leets.land.domain; + +import leets.land.controller.AlphabetGame; +import leets.land.controller.Game; +import leets.land.controller.NumberGame; + +public enum Version { + + NUMBER(1, new NumberGame()), + ALPHABET(2, new AlphabetGame()); + + private final int version; + private final Game game; + + Version(int version, Game game) { + this.version = version; + this.game = game; + } + + public static Version versionValidator(int version) { + for (Version gameVersion : Version.values()) { + if (gameVersion.version == version) { + return gameVersion; + } + } + throw new IllegalArgumentException("[ERROR] 존재하지 않는 버전입니다."); + } + + public void run() { + game.run(); + } +} \ No newline at end of file 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..aba16e1 --- /dev/null +++ b/src/main/java/leets/land/view/InputView.java @@ -0,0 +1,57 @@ +package leets.land.view; + +import java.util.*; + +public class InputView { + final String VERSION_MESSAGE = "버전을 입력해주세요 (숫자 버전: 1, 영어 버전: 2) : "; + final String NUMBER_MESSAGE = "숫자를 입력해주세요(%d ~ %d) : "; + final String ALPHABET_MESSAGE = "영어를 입력해주세요(%c ~ %c) : "; + final Scanner sc = new Scanner(System.in); + final String newline = System.lineSeparator(); + + // 실행할 버전을 입력받는 함수입니다. + public int inputVersion() { + System.out.print(VERSION_MESSAGE); + try{ + return sc.nextInt(); + } catch (InputMismatchException e) { + System.out.println("[ERROR] 입력 문자의 타입이 맞지 않습니다."); + sc.nextLine(); + return inputVersion(); + } + } + + // 범위 내 숫자를 입력 받는 함수입니다. + public int inputNumberInRange(int startNumber, int endNumber) { + System.out.print(String.format(NUMBER_MESSAGE, startNumber, endNumber)); + int number; + + try { + number = sc.nextInt(); + sc.nextLine(); + return number; + } catch (InputMismatchException e) { + System.out.println("[ERROR] 입력 문자의 타입이 맞지 않습니다."); + sc.nextLine(); + return inputNumberInRange(startNumber, endNumber); + } + } + + // 범위 내 영어를 입력 받는 함수입니다. + public char inputAlphabetInRange(char startAlphabet, char endAlphabet) { + System.out.print(String.format(ALPHABET_MESSAGE, startAlphabet, endAlphabet)); + String alphabet = sc.nextLine(); + + if(alphabet.length() != 1) { + System.out.println("[ERROR] 한 글자만 입력해주세요."); + return inputAlphabetInRange(startAlphabet, endAlphabet); + } + + if(!alphabet.matches("[a-zA-Z]")) { + System.out.println("[ERROR] 입력 문자의 타입이 맞지 않습니다."); + return inputAlphabetInRange(startAlphabet, endAlphabet); + } + + return alphabet.charAt(0); + } +} \ No newline at end of file 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..d87d02d --- /dev/null +++ b/src/main/java/leets/land/view/OutputView.java @@ -0,0 +1,10 @@ +package leets.land.view; + +public class OutputView { + final String COUNT_MESSAGE = "시도한 횟수 : %d회"; + + // 시도한 횟수를 출력하는 함수 + public void printCount(int count) { + System.out.print(String.format(COUNT_MESSAGE, count)); + } +} diff --git a/src/test/java/leets/land/domain/AlphabetUpDownTest.java b/src/test/java/leets/land/domain/AlphabetUpDownTest.java new file mode 100644 index 0000000..4395d55 --- /dev/null +++ b/src/test/java/leets/land/domain/AlphabetUpDownTest.java @@ -0,0 +1,16 @@ +package leets.land.domain; + +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; + +class AlphabetUpDownTest { + AlphabetUpDown app = new AlphabetUpDown(); + + @Test + void 범위_외의_알파벳를_입력한_경우_예외를_반환한다() { + assertThrows(Exception.class, () -> { + app.validator((char)('A'-1)); + }); + } +} \ No newline at end of file diff --git a/src/test/java/leets/land/domain/NumberUpDownTest.java b/src/test/java/leets/land/domain/NumberUpDownTest.java new file mode 100644 index 0000000..ae02b8f --- /dev/null +++ b/src/test/java/leets/land/domain/NumberUpDownTest.java @@ -0,0 +1,16 @@ +package leets.land.domain; + +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; + +class NumberUpDownTest { + NumberUpDown app = new NumberUpDown(); + + @Test + void 범위_외의_숫자를_입력한_경우_예외를_반환한다() { + assertThrows(Exception.class, () -> { + app.validator(0); + }); + } +} \ No newline at end of file diff --git a/src/test/java/leets/land/domain/VersionTest.java b/src/test/java/leets/land/domain/VersionTest.java new file mode 100644 index 0000000..89d1a9b --- /dev/null +++ b/src/test/java/leets/land/domain/VersionTest.java @@ -0,0 +1,23 @@ +package leets.land.domain; + +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.*; + +class VersionTest { + + @Test + void 없는_버전를_입력한_경우_예외를_반환한다() { + assertThrows(Exception.class, () -> { + Version.versionValidator(0); + }); + } + + @Test + void 입력_받은_버전에_맞는_게임을_실행한다() { + int version = 1; + Version actual = Version.versionValidator(version); + assertThat(actual).isEqualTo(Version.NUMBER); + } +} \ No newline at end of file