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
29 changes: 13 additions & 16 deletions src/main/java/bowling/Main.java
Original file line number Diff line number Diff line change
@@ -1,31 +1,28 @@
package bowling;

import bowling.domain.Player;
import bowling.domain.Players;
import bowling.view.ResultView;
import bowling.view.UserPrompt;

import java.util.List;

public class Main {
public static void main(String[] args) {
String name = getUserName();
Player player = new Player(name);
startBowl(player);
List<String> playerNames = getUserName();
Players players = new Players(playerNames);
startBowl(players);
}

private static String getUserName() {
try {
return UserPrompt.promptUserForName();
} catch (IllegalArgumentException e) {
System.out.println(e.getMessage());
return getUserName();
}
private static List<String> getUserName() {
return UserPrompt.promptUserForNames();
}

private static void startBowl(Player player) {
while (!player.isDone()) {
private static void startBowl(Players players) {
while (!players.allPlayersAreDone()) {
try {
int pins = UserPrompt.promptUserForBowl(player.getCurrentFrameNumber());
player.bowl(pins);
ResultView.printScoreBoard(player);
int pins = UserPrompt.promptUserForBowl(players.getPlayerName());
players.bowl(pins);
ResultView.printScoreBoard(players);
} catch (IllegalArgumentException e) {
System.out.println(e.getMessage());
}
Expand Down
34 changes: 18 additions & 16 deletions src/main/java/bowling/domain/Player.java
Original file line number Diff line number Diff line change
@@ -1,46 +1,48 @@
package bowling.domain;

import bowling.domain.frame.frame;
import bowling.domain.frame.Frame;
import bowling.domain.frame.NormalFrame;
import bowling.domain.util.Formatter;

public class Player implements Printable {
public class Player {
private static final int FIRST = 1;
private static final int INITIAL = 0;

private final String name;
private final frame frames;
private final Frame headFrame;

public Player(String name) {
Player(String name) {
this.name = name;
this.frames = new NormalFrame(FIRST);
this.headFrame = new NormalFrame(FIRST);
}

public void bowl(int pins) {
frames.bowl(pins);
headFrame.bowl(pins);
}

public boolean isDone() {
return frames.isLast();
boolean turnIsOver() {
return headFrame.isNewFrame();
}

public int getCurrentFrameNumber() {
return frames.getFrameNumber();
boolean hasPlayedAllBowls() {
return headFrame.allBowlsPlayed();
}

@Override
public String convertStatusToPrintable() {
String convertStatusToPrintable() {
return "|"
+ Formatter.formatFrame(name)
+ "|"
+ frames.getPrintableStatus();
+ headFrame.getPrintableStatus();
}

@Override
public String convertScoreToPrintable() {
String convertScoreToPrintable() {
return "|"
+ Formatter.formatFrame("")
+ "|"
+ frames.getPrintableScore(INITIAL);
+ headFrame.getPrintableScore(INITIAL);
}

String getPlayerName() {
return name;
}
}
61 changes: 61 additions & 0 deletions src/main/java/bowling/domain/Players.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
package bowling.domain;

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

public class Players implements Printable {
private final List<Player> players;
private Player currentPlayer;

public Players(List<String> playerNames) {
this.players = createPlayers(playerNames);
this.currentPlayer = players.get(0);
}

private static List<Player> createPlayers(List<String> playerNames) {
List<Player> players = new ArrayList<>();
for (String name : playerNames) {
players.add(new Player(name));
}
return players;
}

public boolean allPlayersAreDone() {
return players
.stream()
.allMatch(Player::hasPlayedAllBowls);
}

public String getPlayerName() {
return currentPlayer.getPlayerName();
}

private void changeCurrentPlayer() {
int maxIndex = players.size() - 1;
int currentIndex = players.indexOf(currentPlayer);
if (currentIndex == maxIndex) {
currentPlayer = players.get(0);
return;
}
currentPlayer = players.get(currentIndex + 1);
}

public void bowl(int pins) {
currentPlayer.bowl(pins);
if (currentPlayer.turnIsOver()) {
changeCurrentPlayer();
}
}

@Override
public String printScoreBoard() {
StringBuilder builder = new StringBuilder();
for (Player player : players) {
builder.append(player.convertStatusToPrintable());
builder.append("\n");
builder.append(player.convertScoreToPrintable());
builder.append("\n");
}
return builder.toString();
}
}
4 changes: 1 addition & 3 deletions src/main/java/bowling/domain/Printable.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,5 @@

public interface Printable {

String convertStatusToPrintable();

String convertScoreToPrintable();
String printScoreBoard();
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,20 +2,20 @@

import bowling.domain.frame.score.Score;

public interface frame {
public interface Frame {
int ONE_BEFORE_LAST = 9;

int getFrameNumber();

void bowl(int pins);

void calculateAdditionalScore(Score score);

void updateScoreFromPrevPrev(Score prevPrev);

boolean isLast();

String getPrintableStatus();

String getPrintableScore(int accumulative);

boolean allBowlsPlayed();

boolean isNewFrame();
}
20 changes: 11 additions & 9 deletions src/main/java/bowling/domain/frame/LastFrame.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,26 +4,25 @@
import bowling.domain.frame.score.Score;
import bowling.domain.util.Formatter;

public class LastFrame implements frame {
private static final int LAST = 10;
public class LastFrame implements Frame {

private final LastFrameStatus status = new LastFrameStatus();

@Override
public int getFrameNumber() {
return LAST;
}

@Override
public void bowl(int pins) {
status.bowl(pins);
}

@Override
public boolean isLast() {
public boolean allBowlsPlayed() {
return status.isComplete();
}

@Override
public boolean isNewFrame() {
return !status.bowlStarted() || status.isComplete();
}

@Override
public String getPrintableStatus() {
return Formatter.formatFrame(status.toString()) + "|";
Expand All @@ -32,7 +31,10 @@ public String getPrintableStatus() {
@Override
public String getPrintableScore(int total) {
Score score = status.createScore();
return score.getScore(total) + "|";
status.updateLastFrameScore(score);
int newTotal = score.calculateNewTotal(total);

return score.getScore(newTotal) + "|";
}

@Override
Expand Down
39 changes: 21 additions & 18 deletions src/main/java/bowling/domain/frame/NormalFrame.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,31 +5,22 @@
import bowling.domain.frame.status.Status;
import bowling.domain.util.Formatter;

public class NormalFrame implements frame {
private final int frameNumber;
private final frame nextFrame;
public class NormalFrame implements Frame {
private final Frame nextFrame;
private Status status;

public NormalFrame(int frameNumber) {
this.frameNumber = frameNumber;
this.nextFrame = createNextFrame();
this.nextFrame = createNextFrame(frameNumber);
this.status = new NotPlayed();
}

private frame createNextFrame() {
private Frame createNextFrame(int frameNumber) {
if (frameNumber == ONE_BEFORE_LAST) {
return new LastFrame();
}
return new NormalFrame(frameNumber + 1);
}

public int getFrameNumber() {
if (status.isComplete()) {
return nextFrame.getFrameNumber();
}
return frameNumber;
}

@Override
public void bowl(int pins) {
if (status.isComplete()) {
Expand All @@ -40,13 +31,21 @@ public void bowl(int pins) {
}

@Override
public boolean isLast() {
public boolean allBowlsPlayed() {
if (status.isComplete()) {
return nextFrame.isLast();
return nextFrame.allBowlsPlayed();
}
return false;
}

@Override
public boolean isNewFrame() {
if (status.isComplete()) {
return nextFrame.isNewFrame();
}
return !status.isPlayed();
}

@Override
public String getPrintableStatus() {
return Formatter.formatFrame(status.toString())
Expand All @@ -57,10 +56,14 @@ public String getPrintableStatus() {
@Override
public String getPrintableScore(int total) {
Score score = status.createScore();
nextFrame.calculateAdditionalScore(score);
return score.getScore(total)
if (status.isStrike() || status.isSpare()) {
nextFrame.calculateAdditionalScore(score);
}

int newTotal = score.calculateNewTotal(total);
return score.getScore(newTotal)
+ "|"
+ nextFrame.getPrintableScore(score.calculateNewTotal(total));
+ nextFrame.getPrintableScore(newTotal);
}

@Override
Expand Down
16 changes: 6 additions & 10 deletions src/main/java/bowling/domain/frame/score/Score.java
Original file line number Diff line number Diff line change
Expand Up @@ -41,28 +41,24 @@ public static Score ofPlayedOnce(int score) {
return new Score(score, ONE_BOWL_AWAY);
}

public static Score ofBonus(int score) {
return new Score(score, READY_FOR_DISPLAY);
}

public boolean isReadyForDisplay() {
return count == READY_FOR_DISPLAY;
}

public void bowl(int score) {
if (!isReadyForDisplay()) {
if (count != 0) {
this.score += score;
count--;
}
}

public boolean isOneBowlAway() {
return count == ONE_BOWL_AWAY;
}

public boolean isTwoBowlsAway() {
return count == TWO_BOWLS_AWAY;
}

public String getScore(int total) {
if (isReadyForDisplay()) {
return Formatter.formatFrame(calculateNewTotal(total) + "");
return Formatter.formatFrame(total + "");
}
return Formatter.formatFrame("");
}
Expand Down
Loading