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

Step2 #71

Merged
merged 19 commits into from
Apr 13, 2018
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
19 commits
Select commit Hold shift + click to select a range
bead913
머지 충돌 해결
imjinbro Apr 9, 2018
43649d4
step#2 - 상태값에 따라 보너스 카운트 각각 주어지게 구현
imjinbro Apr 9, 2018
31f0e26
step#2 - 다음 기능 구현에 필요한 객체와 역할 확실히 분리하기위해서 명칭 변경(pin, frameResult)
imjinbro Apr 10, 2018
7df3b09
step#2 - 노말프레임 보너스 점수 기록 구현(메세지 저장까지)
imjinbro Apr 10, 2018
8a9d02e
step#2 - 노말/라스트프레임 중복제거 시도
imjinbro Apr 10, 2018
3a6e6bd
step#2 - 각 프레임 토탈 점수 기능 구현을 위한 로직 구현
imjinbro Apr 10, 2018
43f310e
step#2 - 내부적으로 보너스점수 기록되도록 변경, 토탈 점수 계산 기능 구현
imjinbro Apr 11, 2018
b18fd19
step#2 - 노말, 라스트프레임 정규 투구, 보너스 투구 메소드 이름 변경, Frames 점수 추가 기능 구현
imjinbro Apr 11, 2018
46edac1
step#2 - 출력 기능 구현
imjinbro Apr 11, 2018
bce39f4
step#2 - 점수 기록 기준과 끝나는 기준 분리
imjinbro Apr 11, 2018
88efbb8
step#2 - 라스트 프레임 점수 기록 표시 잘못된 조건 고침
imjinbro Apr 11, 2018
52c7678
step#2 - 노말/라스트 프레임 각각 역할 나눔
imjinbro Apr 12, 2018
777b21e
step#2 - 노말/라스트 프레임 각각 역할 + FrameScore 테스트 코드 뒤늦게 작성해서 확인, 코드 수정
imjinbro Apr 12, 2018
8bca7b4
step#2 - 노말 / 라스트 프레임 테스트 및 코드 수정, 불필요한 코드 삭제
imjinbro Apr 12, 2018
527d2c9
step#2 - 잘못된 기준 메소드 로직 변경
imjinbro Apr 12, 2018
777ebfa
step#2 - 프레임 상황에 맞게 점수판 메세지 출력되도록 변경
imjinbro Apr 13, 2018
f3aea0c
step# - 정규투구 예외처리(합 10개)
imjinbro Apr 13, 2018
7043d94
step# - 정규투구 예외처리(합 10개)
imjinbro Apr 13, 2018
297cae5
step#2 - 머지 충돌 해결
imjinbro Apr 13, 2018
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
10 changes: 6 additions & 4 deletions src/main/java/BowlingMain.java
100644 → 100755
Original file line number Diff line number Diff line change
@@ -1,8 +1,7 @@
import domain.Player;
import view.InputView;
import view.OutputView;

import static view.InputView.getScore;
import static view.InputView.getPinNum;

public class BowlingMain {

Expand All @@ -15,8 +14,11 @@ public static void main(String[] args) {

private static void doGame(Player player) {
try {
player.recordScore(getScore(player.getCurrentFrameNum()));
OutputView.printResult(player);
player.roll(getPinNum(player.getCurrentFrameNum()));
/*
FrameResults results = player.makeResults();
OutputView.printResult(results); 결과 객체를 넘겨야해
*/
} catch (IllegalArgumentException e) {
InputView.printMessage(e.getMessage());
doGame(player);
Expand Down
18 changes: 3 additions & 15 deletions src/main/java/domain/Player.java
100644 → 100755
Original file line number Diff line number Diff line change
@@ -1,37 +1,25 @@
package domain;

import domain.frame.Frames;
import domain.frame.result.FrameResults;

public class Player {
private PlayerName name;
private Frames frames;
private FrameResults results;

public Player(String name) throws IllegalArgumentException {
this.name = new PlayerName(name);
frames = new Frames();
results = new FrameResults();
}

public String getName() {
return name.getName();
public void roll(int num) throws IllegalArgumentException {
frames.roll(num);
}

public boolean isFinish() {
return frames.isFinish();
}

public FrameResults recordScore(int score) {
results.addResult(frames.getCurrentFrameIdx(), frames.recordScore(score));
return results;
}

public int getCurrentFrameNum() {
return frames.getCurrentFrameNum();
}

public FrameResults getResults() {
return results;
return frames.getFrameNum();
}
}
Empty file modified src/main/java/domain/PlayerName.java
100644 → 100755
Empty file.
29 changes: 0 additions & 29 deletions src/main/java/domain/Score.java

This file was deleted.

30 changes: 0 additions & 30 deletions src/main/java/domain/Scores.java

This file was deleted.

57 changes: 53 additions & 4 deletions src/main/java/domain/frame/Frame.java
100644 → 100755
Original file line number Diff line number Diff line change
@@ -1,10 +1,59 @@
package domain.frame;

public interface Frame {
public abstract class Frame {
public static final int REGULAR_COUNT = 2;
public final int frameNum;
private FrameScore score;

String addScore(int score) throws IllegalArgumentException;
public Frame(int frameNum) {
this.frameNum = frameNum;
score = new FrameScore(REGULAR_COUNT);
}

boolean isFinish();
public static Frame of(int frameNum) {
if (Frames.isLimit(frameNum)) {
return new LastFrame(frameNum);
}
return new NormalFrame(frameNum);
}

String convertScore(int score);
public Frame roll(int num) throws IllegalArgumentException {
return doRecord(score, num);
}

public void bonusRoll(int num) throws IllegalArgumentException {
if (score.isRegularFinish() && score.isBonusFinish()) {
score.roll(num);
}
}

public FrameScore getScore() throws RuntimeException {
return score.get();
}

public String getScoreMessage() {
return score.getScoreMessage();
}

abstract Frame doRecord(FrameScore score, int num) throws IllegalArgumentException;

public boolean isFinish() {
return doCheckFinish(score);
}

public boolean isBonusFinish() {
return score.isBonusFinish();
}

abstract boolean doCheckFinish(FrameScore score);

public abstract boolean isLast();

public int getFrameNum() {
return frameNum;
}

public boolean isDiffFrame(Frame ohterFrame) {
return this != ohterFrame;
}
}
86 changes: 86 additions & 0 deletions src/main/java/domain/frame/FrameScore.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
package domain.frame;

import domain.frame.status.FrameStatus;

import java.util.ArrayList;
import java.util.List;

import static java.util.stream.Collectors.joining;

public class FrameScore {
private FrameStatus status;
private List<Pin> pins = new ArrayList<>();
private int leftNumber;

public FrameScore(int leftNumber) {
status = FrameStatus.getInitStatus();
this.leftNumber = leftNumber;
}

public void roll(int num) throws IllegalArgumentException {
if (isOverRecordPin(num)) {
throw new IllegalArgumentException("한 프레임에 정규 투구 기록할 수 있는 개수는 " + Pin.MAX + "개 입니다.");
}
pins.add(new Pin(num));
leftNumber--;
if (!status.isFinish()) {
status = status.changeStatus(getSum(), leftNumber);
}
}

public boolean isOverRecordPin(int num) {
return !status.isFinish() && pins.size() != 0 && pins.get(0).isOverRecordPin(num);
}

public FrameScore get() {
if (!isBonusFinish()) {
// TODO : 예외처리 해줘야함(사용자정의 예외로 변경?)
throw new RuntimeException("완료되지않은 프레임의 점수는 조회할 수 없습니다.");
}
return this;
}

public int getScore() {
return getSum();
}

public String getScoreMessage() {
if (!isBeforeBonusRoll()) {
return status.convertScore(pins) + ScoreMessage.getMessage(ScoreMessage.MODIFIER) + makeBonusPinMessage();
}
return status.convertScore(pins);
}

private String makeBonusPinMessage() {
if (status.isStrike()) {
return pins.stream().filter(pin -> pins.indexOf(pin) >= Frame.REGULAR_COUNT - 1).map(pin -> ScoreMessage.convertMessage(pin.getNum())).collect(joining(ScoreMessage.getMessage(ScoreMessage.MODIFIER)));
}

return pins.stream().filter(pin -> pins.indexOf(pin) >= Frame.REGULAR_COUNT).map(pin -> ScoreMessage.convertMessage(pin.getNum())).collect(joining(ScoreMessage.getMessage(ScoreMessage.MODIFIER)));
}

private int getSum() {
return pins.stream().mapToInt(Pin::getNum).sum();
}

public boolean isRegularFinish() {
return status.isFinish();
}

public boolean isBonusFinish() {
return leftNumber == 0;
}

public void increaseLeftCount() {
if (status.isBonus()) {
leftNumber += 1;
}
}

public boolean isBeforeBonusRoll() {
if (!status.isBonus()) {
return true;
}
return status.isBonus() && status.isRightThrewNum(pins.size());
}
}
46 changes: 16 additions & 30 deletions src/main/java/domain/frame/Frames.java
Original file line number Diff line number Diff line change
@@ -1,52 +1,38 @@
package domain.frame;

import utils.FrameFactory;

import java.util.ArrayList;
import java.util.List;

public class Frames {
public static final int LIMIT_NUM = 10;
private List<Frame> frames;
private int nextFrameIdx;
public static final int LIMIT = 10;
private List<Frame> frames = new ArrayList<>();
private Frame currentFrame;

public Frames() {
frames = new ArrayList<>();
nextFrameIdx = 0;
currentFrame = Frame.of(1);
}

public String recordScore(int score) {
Frame currentFrame = getCurrentFrame();
String convertedScore = currentFrame.addScore(score);
if (currentFrame.isFinish()) {
nextFrameIdx++;
public void roll(int num) throws IllegalArgumentException {
if (!frames.contains(currentFrame)) {
frames.add(currentFrame);
}
return convertedScore;
}

public Frame getCurrentFrame() {
try {
return frames.get(nextFrameIdx);
} catch (IndexOutOfBoundsException e) {
int frameNum = nextFrameIdx + 1;
frames.add(FrameFactory.of(frameNum));
return frames.get(nextFrameIdx);
Frame frame = currentFrame.roll(num);
// 보너스 요청 자리
if (currentFrame.isDiffFrame(frame)) {
currentFrame = frame;
}
}

public int getCurrentFrameIdx() {
return nextFrameIdx;
}

public int getCurrentFrameNum() {
return nextFrameIdx + 1;
public static boolean isLimit(int frameNum) {
return frameNum == LIMIT;
}

public boolean isFinish() {
return frames.size() == LIMIT_NUM && frames.stream().allMatch(Frame::isFinish);
return currentFrame.isLast() && currentFrame.isFinish();
}

public static boolean isLast(int frameNum) {
return frameNum == LIMIT_NUM;
public int getFrameNum() {
return currentFrame.getFrameNum();
}
}