diff --git a/src/main/java/leets/land/UpdownApplication.java b/src/main/java/leets/land/UpdownApplication.java index 09d7ae5..560e3cb 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.GameController; + public class UpdownApplication { public static void main(String[] args) { - System.out.print("hihi :D"); + GameController gameController = new GameController(); + gameController.startGame(); } } diff --git a/src/main/java/leets/land/controller/GameController.java b/src/main/java/leets/land/controller/GameController.java new file mode 100644 index 0000000..f7673d4 --- /dev/null +++ b/src/main/java/leets/land/controller/GameController.java @@ -0,0 +1,37 @@ +package leets.land.controller; + +import leets.land.model.Game; +import leets.land.view.InputView; +import leets.land.view.OutputView; + +public class GameController { + private Game game; + private InputView inputView; + private OutputView outputView; + + public GameController() { + this.game = new Game(); + this.inputView = new InputView(); + this.outputView = new OutputView(); + } + + public void startGame() { + outputView.displayWelcomeMessage(); + int gameType = inputView.promptForGameType(); + game.initializeGame(gameType); + + while (!game.isGameOver()) { + String range = game.getCurrentRange(); + outputView.displayPrompt("값을 입력해주세요 " + range + " : "); + String guess = inputView.promptForGuess(); + if (!game.isValidGuess(guess)) { + outputView.displayError("범위 내의 올바른 값을 입력하세요."); + continue; + } + game.processGuess(guess); // 변경된 부분 + if (game.isGameOver()) { + outputView.displayGameOverMessage(game.getGuessCount()); + } + } + } +} \ No newline at end of file diff --git a/src/main/java/leets/land/model/Game.java b/src/main/java/leets/land/model/Game.java new file mode 100644 index 0000000..1872f90 --- /dev/null +++ b/src/main/java/leets/land/model/Game.java @@ -0,0 +1,114 @@ +package leets.land.model; + +import java.util.Random; + +public class Game { + private int targetNumber; + private char targetLetter; + private int minNumber = 1; + private int maxNumber = 100; + private char minLetter = 'A'; + private char maxLetter = 'Z'; + private int guessCount = 0; + private boolean gameOver = false; + private int gameType; + + public void initializeGame(int gameType) { + this.gameType = gameType; + Random rand = new Random(); + if (gameType == 1) { + targetNumber = rand.nextInt(maxNumber - minNumber + 1) + minNumber; + } else { + minLetter = 'A'; + maxLetter = 'z'; + targetLetter = (char) (rand.nextInt('z' - 'A' + 1) + 'A'); + } + } + + public boolean isValidGuess(String guess) { + if (gameType == 1) { + try { + int guessNum = Integer.parseInt(guess); + return guessNum >= minNumber && guessNum <= maxNumber; + } catch (NumberFormatException e) { + return false; + } + } else { + if (guess.length() != 1) return false; + char guessChar = guess.charAt(0); + return (guessChar >= minLetter && guessChar <= maxLetter) || + (guessChar >= Character.toLowerCase(minLetter) && guessChar <= Character.toLowerCase(maxLetter)); + } + } + + public void processGuess(String guess) { + guessCount++; + if (gameType == 1) { + int guessNum; + try { + guessNum = Integer.parseInt(guess); + } catch (NumberFormatException e) { + System.out.println("[ERROR] 정수 값을 입력하세요."); + return; + } + + if (guessNum < targetNumber) { + minNumber = guessNum + 1; + System.out.println("UP"); + } else if (guessNum > targetNumber) { + maxNumber = guessNum - 1; + System.out.println("DOWN"); + } else { + gameOver = true; + System.out.println("정답!"); + } + } else { + char guessChar = guess.charAt(0); + if (guessChar >= 'A' && guessChar <= 'Z') { + if (guessChar < targetLetter) { + minLetter = (char) (guessChar + 1); + System.out.println("UP"); + } else if (guessChar > targetLetter) { + maxLetter = (char) (guessChar - 1); + System.out.println("DOWN"); + } else { + gameOver = true; + } + } else if (guessChar >= 'a' && guessChar <= 'z') { + if (guessChar < targetLetter) { + minLetter = (char) (guessChar + 1); + System.out.println("UP"); + } else if (guessChar > targetLetter) { + maxLetter = (char) (guessChar - 1); + System.out.println("DOWN"); + } else { + gameOver = true; + } + } else { + System.out.println("[ERROR] 범위 내의 올바른 값을 입력하세요."); + } + + if (maxLetter >= '[' && maxLetter <= '`') { + maxLetter = 'Z'; + } else if (minLetter > 'Z' && minLetter < 'a') { + minLetter = 'a'; + } + } + } + + public boolean isGameOver() { + return this.gameOver; + } + + public int getGuessCount() { + return this.guessCount; + } + + public String getCurrentRange() { + if (gameType == 1) { + return String.format("(%d ~ %d)", minNumber, maxNumber); + } else { + return String.format("(%c ~ %c)", minLetter, maxLetter); + } + } +} 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..483b648 --- /dev/null +++ b/src/main/java/leets/land/view/InputView.java @@ -0,0 +1,20 @@ +package leets.land.view; + +import java.util.Scanner; + +public class InputView { + private Scanner scanner; + + public InputView() { + this.scanner = new Scanner(System.in); + } + + public int promptForGameType() { + System.out.print("버전을 입력해주세요 (숫자 버전: 1, 영어 버전: 2) : "); + return scanner.nextInt(); + } + + public String promptForGuess() { + return scanner.next(); + } +} 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..222ddbe --- /dev/null +++ b/src/main/java/leets/land/view/OutputView.java @@ -0,0 +1,25 @@ +package leets.land.view; + +public class OutputView { + public void displayWelcomeMessage() { + System.out.println("업다운 게임을 시작합니다."); + } + + public void displayPrompt(String message) { + System.out.print(message); + } + + public void displayFeedback(String feedback) { + System.out.println(feedback); + } + + public void displayError(String errorMessage) { + System.out.println("[ERROR] " + errorMessage); + } + + + public void displayGameOverMessage(int guessCount) { + System.out.println("정답!\n"); + System.out.println("시도한 횟수 : " + guessCount + "회"); + } +} \ No newline at end of file