Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
26 commits
Select commit Hold shift + click to select a range
955e49d
docs(README): κΈ°λŠ₯ μš”κ΅¬μ‚¬ν•­ μž‘μ„±
ay-eonii Apr 13, 2024
f56e7e1
feat(GuessNumber): μΆ”μΈ‘κ°’ 도메인
ay-eonii Apr 13, 2024
95beeea
feat(AnswerNumber): μΆ”μΈ‘κ°’κ³Ό 정닡을 λΉ„κ΅ν•˜λŠ” λ©”μ„œλ“œ
ay-eonii Apr 13, 2024
8fa5b88
feat(Status): 좔츑값을 κΈ°μ€€μœΌλ‘œ κ°€μ§€λŠ” μƒνƒœ 도메인 생성
ay-eonii Apr 13, 2024
26c9ac8
refactor(GuessStatus): νŒ¨ν‚€μ§€ 이동
ay-eonii Apr 13, 2024
fbb3e37
feat(Status): μ’…λ£Œ μ—¬λΆ€ λ©”μ„œλ“œ
ay-eonii Apr 13, 2024
19f2b1a
feat(RandomNumberGenerator): 랜덀 수 생성
ay-eonii Apr 13, 2024
3a75db9
feat(InputView): μΆ”μΈ‘κ°’ μž…λ ₯λ°›κΈ°
ay-eonii Apr 13, 2024
032f9e9
feat(GameMachine): κ²Œμž„ μ‹€ν–‰
ay-eonii Apr 13, 2024
919196c
feat(GuessRange): μΆ”μΈ‘κ°’ λ²”μœ„ 도메인
ay-eonii Apr 13, 2024
193e48c
feat(OutputView): μΆ”μΈ‘κ°’ νŒμ • κ²°κ³Ό 좜λ ₯
ay-eonii Apr 13, 2024
101d5ae
refactor(Status): λ²”μœ„ 검사 및 λ²”μœ„ μž¬μ •μ˜ μ—­ν•  Status에 μœ„μž„
ay-eonii Apr 13, 2024
e66ff5f
fix(GameMachine): λ²”μœ„ λ³€κ²½λ˜λ„λ‘ μˆ˜μ •
ay-eonii Apr 13, 2024
45eed1f
refactor(GameMachine): 반볡 μž¬κ·€λ‘œ 호좜
ay-eonii Apr 13, 2024
de95d7b
fix(InputView): 잘λͺ»λœ μž…λ ₯ μ˜ˆμ™Έ 처리
ay-eonii Apr 13, 2024
4aeee30
feat(UpDownGame): 도메인 뢄리
ay-eonii Apr 13, 2024
2ae19ba
fix(UpDownGame): λΆˆν•„μš”ν•œ μ½”λ“œ μ‚­μ œ
ay-eonii Apr 13, 2024
5925870
docs(README): κΈ°λŠ₯ μš”κ΅¬ 사항 μ™„λ£Œ 체크
ay-eonii Apr 13, 2024
25502f8
refactor(GuessRange): λ©”μ„œλ“œ μˆœμ„œ λ³€κ²½
ay-eonii Apr 14, 2024
0a0cc73
feat(UpDownGame): UpDownGame μΈν„°νŽ˜μ΄μŠ€ κ΅¬ν˜„ν•œ AlphabetUpDownGame 생성
ay-eonii Apr 14, 2024
9fb43f2
feat(GuessValue): GuessValue μΈν„°νŽ˜μ΄μŠ€ κ΅¬ν˜„ν•œ GuessAlphabet μΆ”κ°€
ay-eonii Apr 14, 2024
148ae53
refactor(All): κ²Œμž„κ³Ό μΆ”μΈ‘μœΌλ‘œ νŒ¨ν‚€μ§€ 뢄리
ay-eonii Apr 14, 2024
65da7d3
refactor(AlphabetGameMachine): μ˜μ–΄ κ²Œμž„ 뢄리
ay-eonii Apr 14, 2024
82eaf45
feat(GameLoader): κ²Œμž„ 버전 선택
ay-eonii Apr 14, 2024
2799a40
refactor(RandomAlphabetGenerator): μ†Œλ¬Έμž λ³€ν™˜ api μ‚¬μš©
ay-eonii Apr 14, 2024
ffb1a7e
refactor(AlphabetGameMachine): GuessValue λŒ€μ‹  GuessAlphabet μ‚¬μš©
ay-eonii Apr 14, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
27 changes: 27 additions & 0 deletions docs/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
## κΈ°λŠ₯ μš”κ΅¬ 사항

**버전**

- [ ] 숫자 버전은 1λ²ˆμ΄λ‹€.
- [ ] μ˜μ–΄ 버전은 2λ²ˆμ΄λ‹€.

**λ‚œμˆ˜**

- [x] 숫자 버전은 1 ~ 100 μ‚¬μ΄μ˜ 정닡을 κ°€μ§„λ‹€.
- [ ] μ˜μ–΄ 버전은 A ~ z μ‚¬μ΄μ˜ 정닡을 κ°€μ§„λ‹€.

**μ •λ‹΅**

- [x] μΆ”μΈ‘κ°’κ³Ό 정닡을 λΉ„κ΅ν•œλ‹€.
- [x] κ²Œμž„ μƒνƒœλ₯Ό λ°˜ν™˜ν•œλ‹€.

**κ²Œμž„ μƒνƒœ**
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

λ‹€λ₯Έ λΆ„λ“€ ν•˜μ‹ κ±° λ³΄λ‹ˆκΉ μΆ”μΈ‘ 값이 정닡보닀 ν¬κ±°λ‚˜ μž‘μ€ 경우 κ·Έ 값을 μ œμ™Έν•œ λ²”μœ„λ‘œ μ§€μ •ν•˜λŠ”κ²Œ λ§žλ‹€κ³  μƒκ°ν–ˆμ–΄μš”
예λ₯Όλ“€μ–΄ λ§Œμ•½ μ‚¬μš©μžκ°€ aλ₯Ό μž…λ ₯ν–ˆλ”λ‹ˆ UP이면 λ²”μœ„κ°€ b~z둜 지정될 수 μžˆλ„λ‘ λ§μ΄μ—μš”..!
κ·Έλ ‡μ§€ μ•ŠμœΌλ©΄ μ˜λ„μ μœΌλ‘œ λ¬΄ν•œνžˆ κ²Œμž„μ„ μ§„ν–‰ν•  μˆ˜λ„ μžˆμ„κ±°κ³ , μ—…λ‹€μš΄ κ²Œμž„ κΈ°λ³Έ 원칙이 μž…λ ₯ 값을 μ œμ™Έν•œ λ²”μœ„ μ€‘μ—μ„œ μ„ νƒν•˜λŠ”κ±°λΌκ³  μƒκ°ν•©λ‹ˆλ‹€

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

쒋은 μ§€μ μ΄μ—μš”! 사싀 κ΅¬ν˜„ν•˜λ‹€ λ†“μΉœ λΆ€λΆ„μž…λ‹ˆλ‹€γ…‹γ…‹γ…‹πŸ₯²

κ°μ‚¬ν•΄μš” ☺️


- [x] 좔츑값이 정닡보닀 μž‘μ€ 경우 UP μƒνƒœμ΄λ‹€.
- [x] 좔츑값이 정닡보닀 큰 경우 DOWN μƒνƒœμ΄λ‹€.
- [x] 좔츑값이 μ •λ‹΅κ³Ό μΌμΉ˜ν•˜λŠ” 경우 CORRECT μƒνƒœμ΄λ‹€.

**μ‹œλ„ 횟수**

- [ ] μ‚¬μš©μžκ°€ 정닡을 맞좜 λ•ŒκΉŒμ§€ μ‹œλ„ν•œ 횟수λ₯Ό 좜λ ₯ν•œλ‹€
- 잘λͺ»λœ κ°’ μž…λ ₯ μ—­μ‹œ μ‹œλ„ν•œ νšŸμˆ˜μ— 포함 λ˜μ–΄μ•Ό ν•œλ‹€.
9 changes: 6 additions & 3 deletions src/main/java/leets/land/UpdownApplication.java
Original file line number Diff line number Diff line change
@@ -1,8 +1,11 @@
package leets.land;

import leets.land.controller.GameLoader;

public class UpdownApplication {

public static void main(String[] args) {
System.out.print("hihi :D");
}
public static void main(String[] args) {
GameLoader gameLoader = new GameLoader();
gameLoader.load();
}
}
41 changes: 41 additions & 0 deletions src/main/java/leets/land/controller/AlphabetGameMachine.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
package leets.land.controller;

import leets.land.domain.guess.GuessAlphabet;
import leets.land.domain.guess.GuessRange;
import leets.land.domain.status.GuessStatus;
import leets.land.domain.updowngame.AlphabetUpDownGame;
import leets.land.domain.updowngame.UpDownGame;
import leets.land.view.InputView;
import leets.land.view.OutputView;

public class AlphabetGameMachine implements GameMachine {

private final InputView inputView = new InputView();
private final OutputView outputView = new OutputView();

@Override
public void run() {
UpDownGame upDownGame = new AlphabetUpDownGame();
play(upDownGame);
}

private void play(UpDownGame upDownGame) {
GuessAlphabet guessAlphabet = readGuessAlphabetInRange(upDownGame.guessRange());
GuessStatus guessStatus = upDownGame.play(guessAlphabet);
outputView.printGuessStatus(guessStatus);
if (guessStatus.isContinue()) {
play(upDownGame);
}
}

private GuessAlphabet readGuessAlphabetInRange(GuessRange guessRange) {
try {
int guessValue = inputView.readGuessAlphabetInRange(guessRange.min(), guessRange.max());
guessRange.checkRange(guessValue);
return new GuessAlphabet(guessValue);
} catch (IllegalArgumentException e) {
System.out.println(e.getMessage());
return readGuessAlphabetInRange(guessRange);
}
}
}
19 changes: 19 additions & 0 deletions src/main/java/leets/land/controller/GameLoader.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package leets.land.controller;

import leets.land.domain.GameVersion;
import leets.land.view.InputView;

public class GameLoader {

private final InputView inputView = new InputView();

public void load() {
GameVersion gameVersion = readGameVersion();
gameVersion.start();
}

private GameVersion readGameVersion() {
int gameVersion = inputView.readGameVersion();
return GameVersion.match(gameVersion);
}
}
6 changes: 6 additions & 0 deletions src/main/java/leets/land/controller/GameMachine.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package leets.land.controller;

public interface GameMachine {

void run();
}
41 changes: 41 additions & 0 deletions src/main/java/leets/land/controller/NumberGameMachine.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
package leets.land.controller;

import leets.land.domain.guess.GuessNumber;
import leets.land.domain.guess.GuessRange;
import leets.land.domain.status.GuessStatus;
import leets.land.domain.updowngame.NumberUpDownGame;
import leets.land.domain.updowngame.UpDownGame;
import leets.land.view.InputView;
import leets.land.view.OutputView;

public class NumberGameMachine implements GameMachine {

private final InputView inputView = new InputView();
private final OutputView outputView = new OutputView();

@Override
public void run() {
UpDownGame upDownGame = new NumberUpDownGame();
play(upDownGame);
}

private void play(UpDownGame upDownGame) {
GuessNumber guessNumber = readGuessNumberInRange(upDownGame.guessRange());
GuessStatus guessStatus = upDownGame.play(guessNumber);
outputView.printGuessStatus(guessStatus);
if (guessStatus.isContinue()) {
play(upDownGame);
}
}

private GuessNumber readGuessNumberInRange(GuessRange guessRange) {
try {
int guessNumber = inputView.readGuessNumberInRange(guessRange.min(), guessRange.max());
guessRange.checkRange(guessNumber);
return new GuessNumber(guessNumber);
} catch (IllegalArgumentException e) {
System.out.println(e.getMessage());
return readGuessNumberInRange(guessRange);
}
}
}
18 changes: 18 additions & 0 deletions src/main/java/leets/land/domain/AnswerNumber.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package leets.land.domain;

import leets.land.domain.guess.GuessValue;
import leets.land.domain.status.GuessStatus;

public class AnswerNumber {

private final int value;

public AnswerNumber(int value) {
this.value = value;
}

public GuessStatus compare(GuessValue guessValue) {
int compared = guessValue.compare(value);
return GuessStatus.match(compared);
}
}
32 changes: 32 additions & 0 deletions src/main/java/leets/land/domain/GameVersion.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package leets.land.domain;

import leets.land.controller.AlphabetGameMachine;
import leets.land.controller.GameMachine;
import leets.land.controller.NumberGameMachine;

import java.util.Arrays;

public enum GameVersion {

NUMBER(1, new NumberGameMachine()),
ALPHABET(2, new AlphabetGameMachine());

private final int version;
private final GameMachine gameMachine;

GameVersion(int version, GameMachine gameMachine) {
this.version = version;
this.gameMachine = gameMachine;
}

public static GameVersion match(int version) {
return Arrays.stream(values())
.filter(gameVersion -> gameVersion.version == version)
.findFirst()
.orElseThrow(() -> new IllegalArgumentException("[ERROR] μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ” λ²„μ „μž…λ‹ˆλ‹€."));
}

public void start() {
gameMachine.run();
}
}
44 changes: 44 additions & 0 deletions src/main/java/leets/land/domain/guess/GuessAlphabet.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
package leets.land.domain.guess;

import java.util.Objects;

public class GuessAlphabet implements GuessValue {

private static final int MIN_RANGE = 'A';
private static final int MAX_RANGE = 'z';
private static final String ERROR_FORMAT = "[ERROR] %s";

private final int value;

public GuessAlphabet(int value) {
validate(value);
this.value = value;
}

private void validate(int value) {
if (value < MIN_RANGE || value > MAX_RANGE) {
throw new IllegalArgumentException(String.format(ERROR_FORMAT, "μΆ”μΈ‘κ°’μ˜ λ²”μœ„λŠ” A 이상 z μ΄ν•˜μž…λ‹ˆλ‹€"));
}
}

public int compare(int other) {
return other - value;
}

public int value() {
return value;
}

@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
GuessAlphabet that = (GuessAlphabet) o;
return value == that.value;
}

@Override
public int hashCode() {
return Objects.hash(value);
}
}
44 changes: 44 additions & 0 deletions src/main/java/leets/land/domain/guess/GuessNumber.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
package leets.land.domain.guess;

import java.util.Objects;

public class GuessNumber implements GuessValue {

private static final int MIN_RANGE = 1;
private static final int MAX_RANGE = 100;
private static final String ERROR_FORMAT = "[ERROR] %s";

private final int value;

public GuessNumber(int value) {
validate(value);
this.value = value;
}

private void validate(int value) {
if (value < MIN_RANGE || value > MAX_RANGE) {
throw new IllegalArgumentException(String.format(ERROR_FORMAT, "μΆ”μΈ‘κ°’μ˜ λ²”μœ„λŠ” 1 이상 100 μ΄ν•˜μž…λ‹ˆλ‹€"));
}
}

public int compare(int other) {
return other - value;
}

public int value() {
return value;
}

@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
GuessNumber that = (GuessNumber) o;
return value == that.value;
}

@Override
public int hashCode() {
return Objects.hash(value);
}
}
51 changes: 51 additions & 0 deletions src/main/java/leets/land/domain/guess/GuessRange.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
package leets.land.domain.guess;

import java.util.Objects;

public class GuessRange {

private static final String ERROR_FORMAT = "[ERROR] %s";

private final GuessValue min;
private final GuessValue max;

public GuessRange(GuessValue min, GuessValue max) {
this.min = min;
this.max = max;
}

public GuessRange downMax(GuessValue max) {
return new GuessRange(min, max);
}

public GuessRange upMin(GuessValue min) {
return new GuessRange(min, max);
}

public void checkRange(int guessValue) {
if (guessValue < min() || guessValue > max()) {
throw new IllegalArgumentException(String.format(ERROR_FORMAT, "λ²”μœ„λ₯Ό λ²—μ–΄λ‚©λ‹ˆλ‹€."));
}
}

public int min() {
return min.value();
}

public int max() {
return max.value();
}

@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
GuessRange that = (GuessRange) o;
return Objects.equals(min, that.min) && Objects.equals(max, that.max);
}

@Override
public int hashCode() {
return Objects.hash(min, max);
}
}
8 changes: 8 additions & 0 deletions src/main/java/leets/land/domain/guess/GuessValue.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package leets.land.domain.guess;

public interface GuessValue {

int compare(int other);

int value();
}
23 changes: 23 additions & 0 deletions src/main/java/leets/land/domain/status/Correct.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package leets.land.domain.status;

import leets.land.domain.guess.GuessRange;
import leets.land.domain.guess.GuessValue;

public class Correct implements Status {

@Override
public GuessRange narrowRange(GuessRange guessRange, GuessValue guessValue) {
GuessRange downMaxed = guessRange.downMax(guessValue);
return downMaxed.upMin(guessValue);
}

@Override
public boolean isValid(int gap) {
return gap == 0;
}

@Override
public boolean isContinue() {
return false;
}
}
Loading