Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
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
4 changes: 2 additions & 2 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ apply plugin: 'java'
apply plugin: 'eclipse'

version = '1.0.0'
sourceCompatibility = 1.8
sourceCompatibility = 11

repositories {
mavenCentral()
Expand All @@ -11,4 +11,4 @@ repositories {
dependencies {
testCompile('org.junit.jupiter:junit-jupiter:5.4.2')
testCompile('org.assertj:assertj-core:3.11.1')
}
}
49 changes: 49 additions & 0 deletions src/main/java/bowling/Bowling.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
package bowling;

import bowling.frame.FirstPitchingFrame;
import bowling.frame.Frame;
import bowling.frame.result.FrameResult;
import bowling.score.Score;
import bowling.score.ScoreBoard;

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

public class Bowling {
private final List<FrameResult> frameResults = new ArrayList<>();

public void bowl(final Score score) {
if (frameResults.isEmpty()) {
firstBowl(score);
return;
}
final Frame frame = getLastFrameResult().nextFrame();
bowl(score, frame);
}

private void firstBowl(final Score score) {
frameResults.clear();
final Frame firstFrame = new FirstPitchingFrame(Frame.MIN_NO);
bowl(score, firstFrame);
}

private void bowl(final Score score, final Frame frame) {
frameResults.add(frame.pitch(score));
}

public boolean hasNext() {
return frameResults.isEmpty() || getLastFrameResult().getNextFrameNo() <= Frame.MAX_NO;
}

public int getNextFrameNo() {
return getLastFrameResult().getNextFrameNo();
}

private FrameResult getLastFrameResult() {
return frameResults.get(frameResults.size() - 1);
}

public ScoreBoard getScoreBoard() {
return new ScoreBoard(frameResults);
}
}
19 changes: 19 additions & 0 deletions src/main/java/bowling/BowlingGame.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package bowling;

import bowling.frame.Frame;
import bowling.view.InputView;
import bowling.view.ResultView;

public class BowlingGame {
public static void main(String[] args) {
final Player player = InputView.askPlayerName();
final Bowling bowling = new Bowling();

int nextFrameNo = Frame.MIN_NO;
while (bowling.hasNext()) {
bowling.bowl(InputView.askScore(nextFrameNo));
ResultView.printScoreBoard(player, bowling.getScoreBoard());
nextFrameNo = bowling.getNextFrameNo();
}
}
}
21 changes: 21 additions & 0 deletions src/main/java/bowling/Player.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package bowling;

public class Player {
private final String name;

private static final int MAX_LENGTH = 3;

public static Player of(final String name) {
return new Player(name);
}

private Player(final String name) {
if (name.length() > MAX_LENGTH)
throw new IllegalArgumentException("3글자까지 가능");
this.name = name;
}

public String getName() {
return name;
}
}
17 changes: 17 additions & 0 deletions src/main/java/bowling/frame/FinalFrame.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package bowling.frame;

import bowling.frame.result.FinalResult;
import bowling.frame.result.FrameResult;
import bowling.score.Score;

public class FinalFrame implements Frame {
@Override
public FrameResult pitch(final Score score) {
return FinalResult.of(score);
}

@Override
public int getFrameNo() {
return Frame.MAX_NO;
}
}
31 changes: 31 additions & 0 deletions src/main/java/bowling/frame/FirstPitchingFrame.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package bowling.frame;

import bowling.frame.result.FrameResult;
import bowling.frame.result.Gutter;
import bowling.frame.result.Hit;
import bowling.frame.result.Strike;
import bowling.score.Score;

public class FirstPitchingFrame implements Frame {
private final int frameNo;

public FirstPitchingFrame(final int frameNo) {
this.frameNo = frameNo;
}

@Override
public FrameResult pitch(final Score score) {
if (score.isTen()) {
return Strike.of(frameNo);
}
if (score.isZero()){
return Gutter.of(frameNo, true);
}
return Hit.of(frameNo, score);
}

@Override
public int getFrameNo() {
return frameNo;
}
}
13 changes: 13 additions & 0 deletions src/main/java/bowling/frame/Frame.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package bowling.frame;

import bowling.frame.result.FrameResult;
import bowling.score.Score;

public interface Frame {
int MIN_NO = 1;
int MAX_NO = 10;

FrameResult pitch(final Score score);

int getFrameNo();
}
34 changes: 34 additions & 0 deletions src/main/java/bowling/frame/SecondPitchingFrame.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package bowling.frame;

import bowling.frame.result.FrameResult;
import bowling.frame.result.Gutter;
import bowling.frame.result.Miss;
import bowling.frame.result.Spare;
import bowling.score.Score;

public class SecondPitchingFrame implements Frame {
private final int frameNo;
private final Score beforeScore;

public SecondPitchingFrame(final int frameNo, final Score beforeScore) {
this.frameNo = frameNo;
this.beforeScore = beforeScore;
}

@Override
public FrameResult pitch(final Score score) {
final Score totalScore = beforeScore.add(score);
if (totalScore.isTen()) {
return Spare.of(getFrameNo(), score);
}
if (totalScore.isZero()) {
return Gutter.of(getFrameNo(), false);
}
return Miss.of(getFrameNo(), score);
}

@Override
public int getFrameNo() {
return frameNo;
}
}
47 changes: 47 additions & 0 deletions src/main/java/bowling/frame/result/FinalResult.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
package bowling.frame.result;

import bowling.frame.Frame;
import bowling.score.Score;

public class FinalResult implements FrameResult {
private final Score score;

public static FinalResult of(final Score score) {
return new FinalResult(score);
}

private FinalResult(final Score score) {
this.score = score;
}

@Override
public Frame nextFrame() {
throw new IllegalArgumentException("마지막 프레임");
}

@Override
public Score getScore() {
return score;
}

@Override
public int getFrameNo() {
return Frame.MAX_NO;
}

@Override
public int getNextFrameNo() {
return Frame.MAX_NO;
}

@Override
public String toString() {
if (score.isTen()) {
return Strike.DISPLAY_STRING;
}
if (score.isZero()) {
return Gutter.DISPLAY_STRING;
}
return String.valueOf(score.toInt());
}
}
14 changes: 14 additions & 0 deletions src/main/java/bowling/frame/result/FrameResult.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package bowling.frame.result;

import bowling.frame.Frame;
import bowling.score.Score;

public interface FrameResult {
Frame nextFrame(); // TODO: FinalFrame 조건 추가

Score getScore();

int getFrameNo();

int getNextFrameNo();
}
51 changes: 51 additions & 0 deletions src/main/java/bowling/frame/result/Gutter.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
package bowling.frame.result;

import bowling.frame.FirstPitchingFrame;
import bowling.frame.Frame;
import bowling.frame.SecondPitchingFrame;
import bowling.score.Score;

public class Gutter implements FrameResult {
static final String DISPLAY_STRING = "-";
private final int frameNo;
private final boolean isFirstPitching;

public static Gutter of(final int frameNo, final boolean isFirstPitching) {
return new Gutter(frameNo, isFirstPitching);
}

private Gutter(final int frameNo, final boolean isFirstPitching) {
this.frameNo = frameNo;
this.isFirstPitching = isFirstPitching;
}

@Override
public Frame nextFrame() {
if (isFirstPitching) {
return new SecondPitchingFrame(getNextFrameNo(), Score.ZERO);
}
return new FirstPitchingFrame(getNextFrameNo());
}

@Override
public Score getScore() {
return Score.ZERO;
}

@Override
public int getFrameNo() {
return frameNo;
}

@Override
public int getNextFrameNo() {
if (isFirstPitching)
return frameNo;
return frameNo + 1;
}

@Override
public String toString() {
return DISPLAY_STRING;
}
}
44 changes: 44 additions & 0 deletions src/main/java/bowling/frame/result/Hit.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
package bowling.frame.result;

import bowling.frame.Frame;
import bowling.frame.SecondPitchingFrame;
import bowling.score.Score;

public class Hit implements FrameResult {
private final int frameNo;
private final Score score;

public static Hit of(final int frameNo, final Score score) {
return new Hit(frameNo, score);
}

private Hit(final int frameNo, final Score score) {
this.frameNo = frameNo;
this.score = score;
}

@Override
public Frame nextFrame() {
return new SecondPitchingFrame(frameNo, score);
}

@Override
public Score getScore() {
return score;
}

@Override
public int getFrameNo() {
return frameNo;
}

@Override
public int getNextFrameNo() {
return frameNo;
}

@Override
public String toString() {
return String.valueOf(score.toInt());
}
}
Loading