Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

test #3

Open
wants to merge 15 commits into
base: main
Choose a base branch
from
80 changes: 80 additions & 0 deletions docs/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
- 다리는 왼쪽에서 오른쪽으로 건너야 한다
- 위 아래 둘 중 하나의 칸만 건널 수 있다
- 다리의 길이를 숫자로 입력받는다
- 다리를 생성할 때 위칸과 아래칸 중 건널 수 있는 칸은 0과 1를 이용한다
- 0인 경우 아래 칸, D로 나타낸다.
- 1인 경우 위칸, U로 나타낸다
- 다리가 생성되면 플레이어가 이동할 칸을 선택한다
- 이동할 때 위칸은 대문자 U, 아래칸은 D를 입력한다
- 이동한 칸을 건널 수 있다면 O, 건널 수 없다면 X로 표시한다
- 다리를 끝까지 건너면 게임이 종료된다
- 게임 중 실패 시 게임을 재시작하거나 종료할 수 있다
- 재시작 해도 처음 만든 다리를 재사용한다
- 게임 결과에 총 시도한 횟수는 첫 시도를 포함해 게임을 종료할 때까지 시도한 횟수를 나타낸다
- 사용자가 잘못된 값을 입력할 경우 예외를 발생시키고 [ERROR] 로 시작하는 메세지를 출력한다
- 그 부분부터 입력을 다시 받는다

#### 메서드 네이밍 규칙
- 메서드명은 동사/전치사, 클래스명은 명사, 다른 타입으로 전환하는 메서드나 빌더 패턴을 구현한 클래스의 메서드는 전치사를 쓸 수 없다
- 상태 데이터를 가지는 객체에서 데이터를 get하지말고 객체에 메세지를 보낸다
- init : 데이터를 초기화 하는 메서드 명에 쓰인다
- is/has/can : boolean 값을 리턴한다.
- is : true,false를 판단하는 메서드 명
- has : 데이터를 가지고 있는지 확인하는 메서드 명
- can : 할 수 있는지 , 없는지 확인하는 메서드 명
- create : 새로운 객체를 만든 후 리턴해주는 메서드 명
- find : 데이터를 찾는 메서드 명
- to : 해당 객체를 다른 형태의 객체로 변환해주는 메서드 명
- A-By-B : B를 기준으로 A를 하겠다는 메서드 명

### 입력
- [x] 다리 길이를 입력받는다
- [x] 잘못된 값 입력 시 예외처리
- [x] 이동할 칸을 입력 받는다
- [x] 잘못된 값 입력 시 예외처리
- [x] 게임 재시작/종료 여부를 입력받는다
- [x] 잘못된 값 입력 시 예외처리
### 출력
- [x] 게임 시작 문구
- [] 게임 종료 문구
- [] 최종 게임 결과
- [] 게임 성공 여부
- [] 총 시도한 횟수
- [] 게임 중 메세지
- [] 이동할 수 있는 칸을 선택한 경우 O 표시
- [] 이동할 수 없는 칸을 선택한 경우 X 표시
- [] 선택하지 않은 칸은 공백 한 칸으로 표시

- [] 다리의 시작은 `[`, 다리의 끝은 `]`으로 표시
- [] 다리 칸의 구분은 ` | `(앞뒤 공백 포함) 문자열로 구분
- [] 현재까지 건넌 다리를 모두 출력
- [] 게임을 다시 시도할지 여부를 묻는 메세지
- [] 이동할 칸 입력을 요구하는 메세지
- [] 잘못된 값 입력 시 예외처리
- [] 재입력을 요구하는 메세지
### 모델(도메인)
- [x] BridgeMaker : 사용자가 입력한 숫자만큼 다리를 생성한다
- [x] 숫자만큼 리스트에 담아 반환한다
- [x] GameStatus : 게임 진행 상황. 사용자의 사항을 저장한다
- [x] getDirection : 방향과 결과 반환
- [x] isDirection : 입력 방향과 같은 방향인지 확인
- [x] startGameCount : 게임 시도 횟수
--- + 추가된 사항
- [x] playGameCount : 게임 시도 횟수 증가
- [x] getAttempsGame : 게임 시도 횟수 반환
- [x] Direction : 방향 표현
- [x] 0,1 사이의 값을 받아 D,U중 하나 반환
- [x] D,U를 입력받아 인스턴스 반환
- [x] InputValidation : 사용자의 입력값을 검증한다
- [x] 숫자는 3-20 사이여야한다
- [x] 다리 생성 시 문자열이 입력될 경우 예외 처리
- [x] 이동 시 문자가 U,D여야한다
- [x] 요구한 문자열과 다른 값 입력 시 예외처리
- [x] 게임 재시작/종료는 R,Q여야 한다
- [x] 요구한 문자열과 다른 값 입력 시 예외처리
- [] Bridgegeneration : 다리 생성기
- [] 라운드와 방향을 입력받아 moveResult 반환
- [] isLastRound : 마지막 라운드인지 확인
- [x] MoveResult : 성공, 실패를 표현
- [x] getCommand : O,X 반환
- [x] isFail : 결과가 실패인지 반환
4 changes: 4 additions & 0 deletions src/main/java/bridge/Application.java
Original file line number Diff line number Diff line change
@@ -1,8 +1,12 @@
package bridge;

import bridge.controller.BridgeGameController;

public class Application {

public static void main(String[] args) {
// TODO: 프로그램 구현
BridgeGameController bridgeGameController = new BridgeGameController();
bridgeGameController.run();
}
}
23 changes: 0 additions & 23 deletions src/main/java/bridge/BridgeGame.java

This file was deleted.

13 changes: 12 additions & 1 deletion src/main/java/bridge/BridgeMaker.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
package bridge;

import bridge.model.Direction;

import java.util.LinkedList;
import java.util.List;

/**
Expand All @@ -18,6 +21,14 @@ public BridgeMaker(BridgeNumberGenerator bridgeNumberGenerator) {
* @return 입력받은 길이에 해당하는 다리 모양. 위 칸이면 "U", 아래 칸이면 "D"로 표현해야 한다.
*/
public List<String> makeBridge(int size) {
return null;
List<String> bridge = new LinkedList<>();
while (bridge.size() < size) {
Direction direction = Direction.toCommand(bridgeNumberGenerator.generate());
bridge.add(direction.getCommand());
}
return bridge;
}



}
28 changes: 0 additions & 28 deletions src/main/java/bridge/InputView.java

This file was deleted.

23 changes: 0 additions & 23 deletions src/main/java/bridge/OutputView.java

This file was deleted.

40 changes: 40 additions & 0 deletions src/main/java/bridge/controller/BridgeGameController.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
package bridge.controller;// @ author ninaaano

import bridge.BridgeMaker;
import bridge.model.Bridge;
import bridge.model.GameStatus;
import bridge.model.MoveResult;
import bridge.view.InputView;
import bridge.view.OutputView;

import java.util.List;

public class BridgeGameController {

private InputView inputView = new InputView();
private OutputView outputView = new OutputView();
Copy link
Member

Choose a reason for hiding this comment

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

그 객체가 이렇게 초기화를 시킨다고 본래는 생각하고 있지만 기본 생성자를 이용하여서 초기화를 먼저 해주어야지 진짜로 초기화 해주시는 거라고 하시더라구요.

그래서 앞으로 생성자 안에서 객체 초기화 시켜주시면 좋을 거 같아요

ex)
BridgeGameController{
this.inputView=new InputView();

}

private BridgeMaker bridgeMaker = new BridgeMaker();

public BridgeGameController() {
inputView.readBridgeSize();


}



public void run(){
Bridge bridge = initGame();
while(GameStatus.isPlay){
}

}


private void createBrigde(){
inputView.readBridgeSize();


}

}
21 changes: 21 additions & 0 deletions src/main/java/bridge/model/Bridge.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package bridge.model;// @ author ninaaano

import java.util.List;

public class Bridge {

private List<String> bridgePath;

public Bridge(List<String> bridgePath) {
this.bridgePath = bridgePath;
}

public MoveResult correctPath(String command, int count){
boolean match = bridgePath.get(count).equals(command);
return MoveResult.toMatch(command,match);
}

public boolean isEnd(int count){
return bridgePath.size() == count;
}
}
70 changes: 70 additions & 0 deletions src/main/java/bridge/model/BridgeGame.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
package bridge.model;

import java.util.LinkedList;
import java.util.List;

/**
* 다리 건너기 게임을 관리하는 클래스
*/
public class BridgeGame {

private List<String> upCommand;
private List<String> downCommand;
private int moveCount;
private int gameCount;

public BridgeGame() {
this.upCommand = new LinkedList<>();
this.downCommand = new LinkedList<>();
this.gameCount = 1;
this.moveCount = 0;
}

public int getMoveCount() {
return moveCount;
}

public int getGameCount() {
return gameCount;
}

/**
* 사용자가 칸을 이동할 때 사용하는 메서드
* <p>
* 이동을 위해 필요한 메서드의 반환 타입(return type), 인자(parameter)는 자유롭게 추가하거나 변경할 수 있다.
*/
public List<List<String>> move(MoveResult moveResult) {
if (moveResult.getCommand().equals(Direction.UP.getCommand())) {
return addUpCount(moveResult);
}
return addDownCount(moveResult);
}

private List<List<String>> addDownCount(MoveResult moveResult) {
downCommand.add(moveResult.getCommand());
upCommand.add(" ");
return List.of(upCommand, downCommand);
}

private List<List<String>> addUpCount(MoveResult moveResult) {
upCommand.add(moveResult.getCommand());
downCommand.add(" ");
return List.of(upCommand, downCommand);
}

/**
* 사용자가 게임을 다시 시도할 때 사용하는 메서드
* <p>
* 재시작을 위해 필요한 메서드의 반환 타입(return type), 인자(parameter)는 자유롭게 추가하거나 변경할 수 있다.
*/
public void retry() {
upCommand.clear();
downCommand.clear();
gameCount++;
}

public int countMove() {
return moveCount++;
}

}
45 changes: 45 additions & 0 deletions src/main/java/bridge/model/Direction.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
package bridge.model;// @ author ninaaano

import java.util.Arrays;
import java.util.stream.Stream;

public enum Direction {
UP(1,"U"),
DOWN(0,"D")
;

private static final String INVALID_INPUT_COMMAND_MESSAGE = "U와 D중 입력해주세요.";

private final Integer code;
private final String command;

Direction(Integer code, String command) {
this.code = code;
this.command = command;
}

public String getCommand(){
return command;
}

public static Direction toCommand(int code) {
return Stream.of(values())
.filter(direction -> direction.code == code)
.findFirst()
.orElseThrow(() -> new IllegalArgumentException(INVALID_INPUT_COMMAND_MESSAGE));
}
//
// public static Direction getCommand(String command){
// return Arrays.stream(values())
// .filter(direction -> direction.command.equals(command))
// .findFirst()
// .orElseThrow(() -> new IllegalArgumentException(INVALID_INPUT_COMMAND_MESSAGE));
// }

public boolean isNotEqualsDirection(Direction direction){
return this != direction;
}



}
16 changes: 16 additions & 0 deletions src/main/java/bridge/model/GameCommand.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package bridge.model;// @ author ninaaano

public enum GameCommand {
PLAY("R"),
STOP("Q");

private String command;

GameCommand(String command) {
this.command = command;
}

public String getProgerss(){
return command;
}
}
Loading