Skip to content
Merged
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
33 changes: 33 additions & 0 deletions src/main/java/BowlingMain.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
import domain.Frame;
import domain.NormalFrame;
import domain.Player;
import view.InputView;
import view.ResultView;

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

public class BowlingMain {
public static void main(String[] args) {
final int MAX_FRAME_NO = 10;

Scanner scanner = new Scanner(System.in);
Player player = new Player(InputView.getUserName(scanner));
List<Frame> frames = new ArrayList<>();
ResultView.printFrames(frames, player.getName());

Frame frame = new NormalFrame(1);
frames.add(frame);
for (int index = 1; index < MAX_FRAME_NO + 1; index++) {
do {
frame.throwing(InputView.getThrowing(scanner, index));
ResultView.printFrames(frames, player.getName());
} while (!frame.isEnd());
if (index != MAX_FRAME_NO) {
frame = frame.next();
frames.add(frame);
}
}
}
}
32 changes: 32 additions & 0 deletions src/main/java/domain/Frame.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package domain;

import state.State;

abstract public class Frame {
private static final int MAX_FRAME_NO = 10;
private final int no;

public Frame(int no) {
isValidNo(no);
this.no = no;
}

abstract public void throwing(int throwing);
abstract public State updateState(int throwing);
abstract public boolean isEnd();
abstract public String printState();

public boolean isValidNo(int no) {
if ( no < 0 || no > 10 ) {
throw new RuntimeException("프레임의 번호는 0부터 10사이 입니다. 생성 시도한 프레임 번호는 " + no);
}
return true;
}

public Frame next() {
if (no == MAX_FRAME_NO - 1) {
return new LastFrame(no + 1);
}
return new NormalFrame(no + 1);
}
}
62 changes: 62 additions & 0 deletions src/main/java/domain/LastFrame.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
package domain;

import state.*;

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

public class LastFrame extends Frame {
private static final int FIRST_STATE = 0;
private static final int MAX = 3;

private List<State> states = new ArrayList<>();
private State state = new Ready();
private int index;

public LastFrame(int no) {
super(no);
}

@Override
public void throwing(int throwing) {
state = updateState(throwing);
if (FirstBowl.isFirstBowl(state) || Strike.isStrike(state)) {
states.add(state);
return;
}
try {
states.set(index, state.clone());
index++;
if (!Open.isOpen(state)) {
state = new Ready();
}
} catch (CloneNotSupportedException e) {
e.getMessage();
}
}

@Override
public State updateState(int throwing) {
return state.throwing(throwing);
}

@Override
public boolean isEnd() {
if (Open.isOpen(state) || states.size() == MAX) {
return true;
}
if (Spare.isSpare(states.get(FIRST_STATE)) && states.size() == 2) {
return true;
}
return false;
}

@Override
public String printState() {
StringBuilder sb = new StringBuilder();
for (State state : states) {
sb.append(state.printState());
}
return sb.toString();
}
}
29 changes: 29 additions & 0 deletions src/main/java/domain/NormalFrame.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package domain;

import state.*;

public class NormalFrame extends Frame {
private State state = new Ready();

public NormalFrame(int no) {
super(no);
}

public void throwing(int throwing) {
state = updateState(throwing);
}

public State updateState(int throwing) {
return state.throwing(throwing);
}

@Override
public boolean isEnd() {
return state.isEnd();
}

@Override
public String printState() {
return state.printState();
}
}
13 changes: 13 additions & 0 deletions src/main/java/domain/Player.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package domain;

public class Player {
private String name;

public Player(String name) {
this.name = name;
}

public String getName() {
return name;
}
}
Empty file removed src/main/java/empty.txt
Empty file.
34 changes: 34 additions & 0 deletions src/main/java/state/FirstBowl.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package state;

public class FirstBowl extends State {
private static final String GUTTER = "-";
private static final String PIPE = "|";
private static final int TEN_PINS = 10;

private int falledPins;

public FirstBowl(int throwing) {
super(false);
falledPins = throwing;
}

public State throwing(int throwing) {
if (falledPins + throwing == TEN_PINS) {
return new Spare(falledPins, throwing);
}
return new Open(falledPins, throwing);
}

@Override
public String printState() {
String falledPins = String.valueOf(this.falledPins);
if (this.falledPins == 0) {
falledPins = GUTTER;
}
return falledPins;
}

public static boolean isFirstBowl(State state) {
return state instanceof FirstBowl;
}
}
43 changes: 43 additions & 0 deletions src/main/java/state/Open.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
package state;

public class Open extends State implements Cloneable{
private static final int NO_PINS = 0;
private static final String GUTTER = "-";
private static final String PIPE = "|";

private final int first;
private final int second;

public Open(int first, int second) {
super(true);
this.first = first;
this.second = second;
}

@Override
public String printState() {
String first = String.valueOf(this.first);
String second = String.valueOf(this.second);
if (this.first == NO_PINS) {
first = GUTTER;
}
if (this.second == NO_PINS) {
second = GUTTER;
}
return first + PIPE + second;
}

@Override
public State throwing(int throwing) {
throw new RuntimeException("Open 프레임에서는 더이상 투구할 수 없습니다.");
}

public static boolean isOpen(State state) {
return state instanceof Open;
}

@Override
public State clone() throws CloneNotSupportedException {
return super.clone();
}
}
26 changes: 26 additions & 0 deletions src/main/java/state/Ready.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package state;

public class Ready extends State {
private static final int TEN_PINS = 10;
private static final String EMPTY = "";

public Ready() {
super(false);
}

public State throwing(int throwing) {
if (throwing == TEN_PINS) {
return new Strike();
}
return new FirstBowl(throwing);
}

@Override
public String printState() {
return EMPTY;
}

public static boolean isReady(State state) {
return state instanceof Ready;
}
}
43 changes: 43 additions & 0 deletions src/main/java/state/Spare.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
package state;

public class Spare extends State {
private static final String PIPE = "|";
private static final String SPARE = "/";
private static final String GUTTER = "-";
private static final int TEN_PINS = 10;
private static final int NO_PINS = 0;

private final int first;
private final int second;

public Spare(int first, int second) {
super(true);
this.first = first;
this.second = second;
}

@Override
public String printState() {
String first = String.valueOf(this.first);
if (this.first == NO_PINS) {
first = GUTTER;
}
return first + PIPE + SPARE;
}

public State throwing(int throwing) {
if (throwing == TEN_PINS) {
return new Strike();
}
return new FirstBowl(throwing);
}

public static boolean isSpare(State state) {
return state instanceof Spare;
}

@Override
public State clone() throws CloneNotSupportedException {
return super.clone();
}
}
5 changes: 5 additions & 0 deletions src/main/java/state/Statable.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package state;

public interface Statable {
String printState();
}
36 changes: 36 additions & 0 deletions src/main/java/state/State.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
package state;

import java.util.Objects;

abstract public class State implements Statable, Cloneable{
private final boolean state;

public State(boolean state) {
this.state = state;
}

public boolean isEnd() {
return state;
}

abstract public State throwing(int throwing);

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

@Override
public int hashCode() {

return Objects.hash(this);
}

@Override
public State clone() throws CloneNotSupportedException {
return (State)super.clone();
}
}
Loading