Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
37 commits
Select commit Hold shift + click to select a range
40957d5
Add function that returns playername/framenumber/score string for eac…
krapeaj Apr 9, 2018
4b86c11
Add function in NormalFrame that responds to requests for score info
krapeaj Apr 9, 2018
5fac97b
Modify functions in NormalFrame so that a toString call would return …
krapeaj Apr 9, 2018
b57bccd
Modify functions in ScoreMarker so that it returns mark string from g…
krapeaj Apr 9, 2018
698a8e0
Create Frame interface and override toString method
krapeaj Apr 9, 2018
257c087
Modify Frame interface to abstract class
krapeaj Apr 9, 2018
1ad68f1
Add score class which is responsible for keeping score for each player
krapeaj Apr 9, 2018
8f48734
Add input validating functions
krapeaj Apr 10, 2018
9610927
Modify so that more responsibility is given to Marker
krapeaj Apr 10, 2018
ec325e5
Create funtions that tell strikes and spares
krapeaj Apr 10, 2018
9aa0ae5
Delete unused class
krapeaj Apr 10, 2018
cafc101
Modify toString function of SecondThrow to match desired string
krapeaj Apr 10, 2018
1f98b61
Add class to abstract bonus throw on the last frame
krapeaj Apr 11, 2018
2be33e8
Abstract score that helps determine strike or spare
krapeaj Apr 11, 2018
5305861
Modify so that last frame inherits properties of a normal frame
krapeaj Apr 11, 2018
4893676
Restructure classes to implement polymorphism
krapeaj Apr 11, 2018
2bbf89b
Complete toString conversion logic
krapeaj Apr 11, 2018
157eb9a
Apply polyphorphism on Score objects
krapeaj Apr 11, 2018
92b2757
Automate score updates
krapeaj Apr 11, 2018
ee662dd
Create user prompt
krapeaj Apr 11, 2018
762e9cb
Restructure packages
krapeaj Apr 11, 2018
2d89cca
Create Frames class
krapeaj Apr 11, 2018
459a421
Create Main
krapeaj Apr 11, 2018
6acb35c
Add string formatter that pads frame string
krapeaj Apr 11, 2018
4a54cab
Add label frames
krapeaj Apr 12, 2018
2c18a09
Add function that takes input and updates scores repeatedly
krapeaj Apr 12, 2018
c457590
Fix bug that did not print out the correct string
krapeaj Apr 12, 2018
e3cb413
Complete whole implementation
krapeaj Apr 12, 2018
bb69d68
Restructure packages
krapeaj Apr 12, 2018
83abb45
Refactor code
krapeaj Apr 12, 2018
9ce7942
Refactor code so it is more readable
krapeaj Apr 12, 2018
1e91d35
Modify test code to reflect changes in code
krapeaj Apr 12, 2018
fb24053
Increase the level of encapsulation by disallowing inheritence and us…
krapeaj Apr 12, 2018
ca381f5
Remove unnecessary interface Score
krapeaj Apr 12, 2018
2facf9f
Reduce number of if statements
krapeaj Apr 12, 2018
8e8ed72
Refactor code
krapeaj Apr 12, 2018
c95b9cf
Make fields that can be final final
krapeaj Apr 12, 2018
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 src/main/java/bowling/Main.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package bowling;

import bowling.view.BowlingGame;
import bowling.domain.Player;
import bowling.domain.Utils.Validator;

import static bowling.view.Prompter.*;

public class Main {
public static void main(String[] args) {
Player player = getPlayer();
BowlingGame game = new BowlingGame(player);

game.startGame();
}

private static Player getPlayer() {
try {
String playerName = promptForName();
Validator.validateName(playerName);
return new Player(playerName);
} catch (IllegalArgumentException e) {
System.out.println(e.getMessage());
return getPlayer();
}
}
}
30 changes: 30 additions & 0 deletions src/main/java/bowling/domain/Player.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package bowling.domain;

import bowling.domain.Utils.Formatter;
import bowling.domain.frame.Frames;

public class Player {
private final Frames frames = new Frames();
private final String playerName;

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

public boolean throwBall(int frameNumber, int pinsKnocked) {
return frames.knockPins(frameNumber, pinsKnocked);
}

public boolean isStrike(int frameNumber) {
return frames.isStrike(frameNumber);
}

public boolean isSpare(int frameNumber) {
return frames.isSpare(frameNumber);
}

@Override
public String toString() {
return "|" + Formatter.formatFrame(" " + playerName) + frames.toString();
}
}
24 changes: 24 additions & 0 deletions src/main/java/bowling/domain/Utils/Formatter.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package bowling.domain.Utils;

public class Formatter {
private static final int LAST_FRAME = 10;

public static String formatFrame(String frame) {
return String.format("%-6s", frame);
}

public static String formatLabel(int frameNumber) {
if (frameNumber < LAST_FRAME) {
return "0" + frameNumber;
}
return String.valueOf(frameNumber);
}

public static int convertToInt(String number) throws IllegalArgumentException {
try {
return Integer.parseInt(number);
} catch (NumberFormatException e) {
throw new IllegalArgumentException("숫자만 입력해 주세요.");
}
}
}
12 changes: 12 additions & 0 deletions src/main/java/bowling/domain/Utils/Validator.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package bowling.domain.Utils;

public class Validator {
private static final int MAX_NAME_LENGTH = 3;

public static String validateName(String name) throws IllegalArgumentException {
if (name.length() != MAX_NAME_LENGTH) {
throw new IllegalArgumentException("세 자만 입력해 주세요.");
}
return name;
}
}
13 changes: 13 additions & 0 deletions src/main/java/bowling/domain/frame/Frame.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package bowling.domain.frame;

public interface Frame {

public abstract boolean isStrike();

public abstract boolean isSpare();

public abstract boolean knockPins(int pinsKnocked);

@Override
public abstract String toString();
}
50 changes: 50 additions & 0 deletions src/main/java/bowling/domain/frame/Frames.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
package bowling.domain.frame;

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

import static bowling.domain.Utils.Formatter.formatFrame;

public class Frames {
private final List<Frame> frames;

public Frames() {
this.frames = initializeFrames();
}

private List<Frame> initializeFrames() {
List<Frame> frames = new ArrayList<>();
for (int frameNumber = 0; frameNumber < 9; frameNumber++) {
frames.add(new NormalFrame());
}
frames.add(new LastFrame());
return frames;
}

public boolean knockPins(int frameNumber, int pinsKnocked) {
return onFrame(frameNumber).knockPins(pinsKnocked);
}

public boolean isStrike(int frameNumber) {
return onFrame(frameNumber).isStrike();
}

public boolean isSpare(int frameNumber) {
return onFrame(frameNumber).isSpare();
}

private Frame onFrame(int frameNumber) {
return frames.get(frameNumber);
}

@Override
public String toString() {
StringBuilder builder = new StringBuilder();
builder.append("|");
for (Frame frame : frames) {
builder.append(formatFrame(frame.toString()));
builder.append("|");
}
return builder.toString();
}
}
16 changes: 16 additions & 0 deletions src/main/java/bowling/domain/frame/LabelFrame.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package bowling.domain.frame;

import static bowling.domain.Utils.Formatter.formatLabel;

public class LabelFrame {
private final int frameNumber;

public LabelFrame(int frameNumber) {
this.frameNumber = frameNumber;
}

@Override
public String toString() {
return " " + formatLabel(frameNumber);
}
}
33 changes: 33 additions & 0 deletions src/main/java/bowling/domain/frame/LabelFrames.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package bowling.domain.frame;

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

import static bowling.domain.Utils.Formatter.formatFrame;

public class LabelFrames {
private final List<LabelFrame> labelFrames;

public LabelFrames() {
this.labelFrames = initializeLabels();
}

private List<LabelFrame> initializeLabels() {
List<LabelFrame> labelFrames = new ArrayList<>();
for (int i = 1; i < 11; i++) {
labelFrames.add(new LabelFrame(i));
}
return labelFrames;
}

@Override
public String toString() {
StringBuilder builder = new StringBuilder();
builder.append("| NAME |");
for (LabelFrame frame : labelFrames) {
builder.append(formatFrame(frame.toString()));
builder.append("|");
}
return builder.toString();
}
}
38 changes: 38 additions & 0 deletions src/main/java/bowling/domain/frame/LastFrame.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
package bowling.domain.frame;

import bowling.domain.score.BonusScore;
import bowling.domain.score.Scores;

public class LastFrame implements Frame{
private Scores scores = new Scores();
private BonusScore bonusScore = new BonusScore();

public boolean knockPins(int pinsKnocked) {
if (!scores.firstThrowIsPlayed()) {
scores.updateFirstThrow(pinsKnocked);
return true;
}
if (!scores.secondThrowIsPlayed() && !scores.isStrike()) {
scores.updateSecondThrow(pinsKnocked);
return true;
}
if (!bonusScore.isPlayed()) {
bonusScore.updateScore(pinsKnocked);
return true;
}
return false;
}

public boolean isStrike() {
return scores.isStrike();
}

public boolean isSpare() {
return scores.isSpare();
}

@Override
public String toString() {
return " " + scores.toString() + bonusScore.toString();
}
}
32 changes: 32 additions & 0 deletions src/main/java/bowling/domain/frame/NormalFrame.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package bowling.domain.frame;

import bowling.domain.score.Scores;

public class NormalFrame implements Frame {
private Scores scores = new Scores();

public boolean knockPins(int pinsKnocked) {
if (!scores.firstThrowIsPlayed()) {
scores.updateFirstThrow(pinsKnocked);
return true;
}
if (!scores.secondThrowIsPlayed()) {
scores.updateSecondThrow(pinsKnocked);
return true;
}
return false;
}

public boolean isStrike() {
return scores.isStrike();
}

public boolean isSpare() {
return scores.isSpare();
}

@Override
public String toString() {
return " " + scores.toString();
}
}
33 changes: 33 additions & 0 deletions src/main/java/bowling/domain/score/BonusScore.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package bowling.domain.score;

import static bowling.domain.score.Scores.ALL;
import static bowling.domain.score.Scores.NONE;

public class BonusScore {
private Integer bonusScore;

public int updateScore(int pinsKnocked) {
if (bonusScore == null) {
bonusScore = pinsKnocked;
}
return bonusScore;
}

public boolean isPlayed() {
return bonusScore != null;
}

@Override
public String toString() {
if (!isPlayed()) {
return " ";
}
if (bonusScore == ALL) {
return "|X";
}
if (bonusScore == NONE) {
return "|-";
}
return "|" + bonusScore;
}
}
46 changes: 46 additions & 0 deletions src/main/java/bowling/domain/score/FirstScore.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
package bowling.domain.score;

import static bowling.domain.score.Scores.ALL;
import static bowling.domain.score.Scores.NONE;

public class FirstScore {
private Integer firstScore;

public int updateScore(int pinsKnocked) {
if (firstScore == null) {
firstScore = pinsKnocked;
}
return firstScore;
}

boolean isPlayed() {
return firstScore != null;
}

boolean isStrike() {
return firstScore == ALL;
}

boolean isSpare(int secondScore) {
return firstScore + secondScore == ALL;
}

boolean isMoreThanPinsStanding(int pinsKnocked){

return pinsKnocked > ALL - firstScore;
}

@Override
public String toString() {
if (!isPlayed()) {
return " ";
}
if (isStrike()) {
return "X";
}
if (firstScore == NONE) {
return "-";
}
return String.valueOf(firstScore);
}
}
Loading