From b3f17a146bfb31170eabc8a7066542793353d7e1 Mon Sep 17 00:00:00 2001 From: Delf-Lee Date: Sat, 8 Feb 2020 20:26:27 +0900 Subject: [PATCH 1/8] =?UTF-8?q?gitignore=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..3be8e77 --- /dev/null +++ b/.gitignore @@ -0,0 +1,8 @@ +.project/ +.gradle/ +.idea/ +bin/ +build/ +.settings +.classpath +out/ \ No newline at end of file From efe54057d1410dd1e1305082e6d8c5c4f07c4e46 Mon Sep 17 00:00:00 2001 From: Delf-Lee Date: Sat, 8 Feb 2020 20:27:05 +0900 Subject: [PATCH 2/8] =?UTF-8?q?=EB=B3=BC=EB=A7=81=20=EA=B2=8C=EC=9E=84=20?= =?UTF-8?q?=ED=9D=90=EB=A6=84=20=EB=B0=8F=20=EC=9E=85=EC=B6=9C=EB=A0=A5=20?= =?UTF-8?q?=ED=8B=80=20=EA=B5=AC=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/BollingApplication.java | 32 +++++++++++++++++++++++++++ src/main/java/domain/BollingGame.java | 21 ++++++++++++++++++ src/main/java/domain/Player.java | 12 ++++++++++ src/main/java/empty.txt | 0 src/test/java/empty.txt | 0 5 files changed, 65 insertions(+) create mode 100644 src/main/java/BollingApplication.java create mode 100644 src/main/java/domain/BollingGame.java create mode 100644 src/main/java/domain/Player.java delete mode 100755 src/main/java/empty.txt delete mode 100755 src/test/java/empty.txt diff --git a/src/main/java/BollingApplication.java b/src/main/java/BollingApplication.java new file mode 100644 index 0000000..d2e5009 --- /dev/null +++ b/src/main/java/BollingApplication.java @@ -0,0 +1,32 @@ +import domain.BollingGame; +import domain.Player; + +import java.util.Collections; +import java.util.List; +import java.util.Scanner; + +public class BollingApplication { + private static final int DEFAULT_BOLLING_MAX_FRAME = 10; + private static Scanner scanner = new Scanner(System.in); + + public static void main(String[] args) { + System.out.println("이름: "); + String playerName = scanner.nextLine(); + Player player = new Player(playerName); + List playerList = Collections.singletonList(player); + BollingGame bollingGame = new BollingGame(DEFAULT_BOLLING_MAX_FRAME, playerList); + + while (bollingGame.hasNext()) { + Player thisTurnPlayer = bollingGame.nextPlayer(); + System.out.println("쓰러트린 핀: "); + int fallingPinCount = scanner.nextInt(); + thisTurnPlayer.bowl(fallingPinCount); + } + + System.out.println("--볼링 게임 끝--"); + } + + private static void printScore(BollingGame bollingGame) { + // print about game score... + } +} diff --git a/src/main/java/domain/BollingGame.java b/src/main/java/domain/BollingGame.java new file mode 100644 index 0000000..32d9f18 --- /dev/null +++ b/src/main/java/domain/BollingGame.java @@ -0,0 +1,21 @@ +package domain; + +import java.util.List; + +public class BollingGame { + public final int MAX_FRAME; + private List players; + + public BollingGame(int maxFrame, List players) { + this.MAX_FRAME = maxFrame; + this.players = players; + } + + public boolean hasNext() { + return false; + } + + public Player nextPlayer() { + return null; + } +} diff --git a/src/main/java/domain/Player.java b/src/main/java/domain/Player.java new file mode 100644 index 0000000..a9fd40c --- /dev/null +++ b/src/main/java/domain/Player.java @@ -0,0 +1,12 @@ +package domain; + +public class Player { + private String name; + public Player(String playerName) { + this.name = playerName; + } + + public void bowl(int fallingPinCount) { + // do something plus score + } +} diff --git a/src/main/java/empty.txt b/src/main/java/empty.txt deleted file mode 100755 index e69de29..0000000 diff --git a/src/test/java/empty.txt b/src/test/java/empty.txt deleted file mode 100755 index e69de29..0000000 From 439677cb29d3ae2f2fa555660949bfebe7ce7a95 Mon Sep 17 00:00:00 2001 From: Delf-Lee Date: Sat, 8 Feb 2020 20:41:10 +0900 Subject: [PATCH 3/8] =?UTF-8?q?=EC=9E=85=EC=B6=9C=EB=A0=A5=20=EC=B1=85?= =?UTF-8?q?=EC=9E=84=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/BollingApplication.java | 19 +++++++++---------- src/main/java/domain/BollingGame.java | 6 ++++++ .../java/input/BollingGameInputtable.java | 6 ++++++ .../ConsoleBollingGameInputInterface.java | 19 +++++++++++++++++++ .../java/output/BollingScorePresentable.java | 7 +++++++ .../output/ConsoleBollingScorePresenter.java | 10 ++++++++++ 6 files changed, 57 insertions(+), 10 deletions(-) create mode 100644 src/main/java/input/BollingGameInputtable.java create mode 100644 src/main/java/input/ConsoleBollingGameInputInterface.java create mode 100644 src/main/java/output/BollingScorePresentable.java create mode 100644 src/main/java/output/ConsoleBollingScorePresenter.java diff --git a/src/main/java/BollingApplication.java b/src/main/java/BollingApplication.java index d2e5009..487cae5 100644 --- a/src/main/java/BollingApplication.java +++ b/src/main/java/BollingApplication.java @@ -1,32 +1,31 @@ import domain.BollingGame; import domain.Player; +import input.BollingGameInputtable; +import input.ConsoleBollingGameInputInterface; +import output.BollingScorePresentable; +import output.ConsoleBollingScorePresenter; import java.util.Collections; import java.util.List; -import java.util.Scanner; public class BollingApplication { private static final int DEFAULT_BOLLING_MAX_FRAME = 10; - private static Scanner scanner = new Scanner(System.in); + private static BollingGameInputtable inputManager = new ConsoleBollingGameInputInterface(); + private static final BollingScorePresentable bollingScorePresenter = new ConsoleBollingScorePresenter(); public static void main(String[] args) { - System.out.println("이름: "); - String playerName = scanner.nextLine(); + String playerName = inputManager.getPlayerName(); Player player = new Player(playerName); List playerList = Collections.singletonList(player); BollingGame bollingGame = new BollingGame(DEFAULT_BOLLING_MAX_FRAME, playerList); while (bollingGame.hasNext()) { Player thisTurnPlayer = bollingGame.nextPlayer(); - System.out.println("쓰러트린 핀: "); - int fallingPinCount = scanner.nextInt(); + int fallingPinCount = inputManager.getFallingPint(); thisTurnPlayer.bowl(fallingPinCount); + bollingGame.printScore(bollingScorePresenter); } System.out.println("--볼링 게임 끝--"); } - - private static void printScore(BollingGame bollingGame) { - // print about game score... - } } diff --git a/src/main/java/domain/BollingGame.java b/src/main/java/domain/BollingGame.java index 32d9f18..63dab18 100644 --- a/src/main/java/domain/BollingGame.java +++ b/src/main/java/domain/BollingGame.java @@ -1,5 +1,7 @@ package domain; +import output.BollingScorePresentable; + import java.util.List; public class BollingGame { @@ -18,4 +20,8 @@ public boolean hasNext() { public Player nextPlayer() { return null; } + + public void printScore(BollingScorePresentable presenter) { + presenter.show(this); + } } diff --git a/src/main/java/input/BollingGameInputtable.java b/src/main/java/input/BollingGameInputtable.java new file mode 100644 index 0000000..e9adb2c --- /dev/null +++ b/src/main/java/input/BollingGameInputtable.java @@ -0,0 +1,6 @@ +package input; + +public interface BollingGameInputtable { + String getPlayerName(); + int getFallingPint(); +} diff --git a/src/main/java/input/ConsoleBollingGameInputInterface.java b/src/main/java/input/ConsoleBollingGameInputInterface.java new file mode 100644 index 0000000..3fdad38 --- /dev/null +++ b/src/main/java/input/ConsoleBollingGameInputInterface.java @@ -0,0 +1,19 @@ +package input; + +import java.util.Scanner; + +public class ConsoleBollingGameInputInterface implements BollingGameInputtable { + private Scanner scanner = new Scanner(System.in); + + @Override + public String getPlayerName() { + System.out.println("이름: "); + return scanner.nextLine(); + } + + @Override + public int getFallingPint() { + System.out.println("쓰러트린 핀: "); + return scanner.nextInt(); + } +} diff --git a/src/main/java/output/BollingScorePresentable.java b/src/main/java/output/BollingScorePresentable.java new file mode 100644 index 0000000..617f206 --- /dev/null +++ b/src/main/java/output/BollingScorePresentable.java @@ -0,0 +1,7 @@ +package output; + +import domain.BollingGame; + +public interface BollingScorePresentable { + void show(final BollingGame object); +} diff --git a/src/main/java/output/ConsoleBollingScorePresenter.java b/src/main/java/output/ConsoleBollingScorePresenter.java new file mode 100644 index 0000000..3c2aca5 --- /dev/null +++ b/src/main/java/output/ConsoleBollingScorePresenter.java @@ -0,0 +1,10 @@ +package output; + +import domain.BollingGame; + +public class ConsoleBollingScorePresenter implements BollingScorePresentable { + @Override + public void show(BollingGame object) { + // Print some result about bolling game + } +} From cdb90df9ebc24265ec9e70ae6bd82cc825bac69b Mon Sep 17 00:00:00 2001 From: Delf-Lee Date: Sun, 9 Feb 2020 12:40:52 +0900 Subject: [PATCH 4/8] tmp --- src/main/java/domain/BollingGame.java | 25 ++++++++-- src/main/java/domain/FallingPin.java | 24 +++++++++ src/main/java/domain/Frame.java | 50 +++++++++++++++++++ src/main/java/domain/FrameCollection.java | 18 +++++++ src/main/java/domain/FrameStatus.java | 5 ++ src/main/java/domain/Player.java | 23 +++++++-- src/main/java/domain/Scorable.java | 5 ++ src/main/java/domain/Score.java | 14 ++++++ .../java/output/BollingScorePresentable.java | 11 +++- .../output/ConsoleBollingScorePresenter.java | 43 ++++++++++++++-- .../ConsoleBollingScorePresenterTest.java | 16 ++++++ 11 files changed, 223 insertions(+), 11 deletions(-) create mode 100644 src/main/java/domain/FallingPin.java create mode 100644 src/main/java/domain/Frame.java create mode 100644 src/main/java/domain/FrameCollection.java create mode 100644 src/main/java/domain/FrameStatus.java create mode 100644 src/main/java/domain/Scorable.java create mode 100644 src/main/java/domain/Score.java create mode 100644 src/test/java/ouput/ConsoleBollingScorePresenterTest.java diff --git a/src/main/java/domain/BollingGame.java b/src/main/java/domain/BollingGame.java index 63dab18..4ddf79e 100644 --- a/src/main/java/domain/BollingGame.java +++ b/src/main/java/domain/BollingGame.java @@ -6,22 +6,39 @@ public class BollingGame { public final int MAX_FRAME; - private List players; + private final List players; + private Player currentPlayer; + private int currentFrameNumber; public BollingGame(int maxFrame, List players) { this.MAX_FRAME = maxFrame; this.players = players; + this.currentPlayer = players.get(0); } public boolean hasNext() { - return false; + return MAX_FRAME > currentFrameNumber; } public Player nextPlayer() { - return null; + if (isLastPlayer()) { + currentPlayer = players.get(0); + currentFrameNumber++; + } + + return currentPlayer; + } + private boolean isLastPlayer() { + int lastPlayerIndex = players.size() - 1; + Player lastPlayer = players.get(lastPlayerIndex); + return lastPlayer.equals(currentPlayer); + } + + public int getCurrentFrameNumber() { + return currentFrameNumber; } public void printScore(BollingScorePresentable presenter) { - presenter.show(this); + presenter.show(players); } } diff --git a/src/main/java/domain/FallingPin.java b/src/main/java/domain/FallingPin.java new file mode 100644 index 0000000..d1d90af --- /dev/null +++ b/src/main/java/domain/FallingPin.java @@ -0,0 +1,24 @@ +package domain; + +import output.BollingScorePresentable; + +public class FallingPin { + public final static FallingPin MISS = new FallingPin(0); + public final static FallingPin NONE = new FallingPin(-1); + private int fallingPinCount; + + public FallingPin(int fallingPinCount) { + if(fallingPinCount > Frame.DEFAULT_BOLLING_PIN) { + throw new IllegalArgumentException("10개 이하"); + } + this.fallingPinCount = fallingPinCount; + } + + public int value() { + return fallingPinCount; + } + + public void print(BollingScorePresentable printer) { + printer.show(this); + } +} diff --git a/src/main/java/domain/Frame.java b/src/main/java/domain/Frame.java new file mode 100644 index 0000000..2dd6aaf --- /dev/null +++ b/src/main/java/domain/Frame.java @@ -0,0 +1,50 @@ +package domain; + +import output.BollingScorePresentable; + +public class Frame implements Scorable { + + public final static int DEFAULT_BOLLING_PIN = 10; + + private FallingPin first = FallingPin.NONE; + private FallingPin second = FallingPin.NONE; + + public Frame(FallingPin first, FallingPin second) { + this.first = first; + this.second = second; + } + + public FrameStatus getStatus() { + if (first.value() == DEFAULT_BOLLING_PIN) { + return FrameStatus.STRIKE; + } + + if (first.value() + second.value() == DEFAULT_BOLLING_PIN) { + return FrameStatus.SPARE; + } + + if (first.value() + second.value() == 0) { + return FrameStatus.MISS; + } + + return FrameStatus.SPARE; + } + + @Override + public Score getScore() { + // some way of calculate score + return Score.ZERO_SCORE; + } + + public void print(BollingScorePresentable pinter) { + pinter.show(this); + } + + public FallingPin getFirst() { + return first; + } + + public FallingPin getSecond() { + return second; + } +} diff --git a/src/main/java/domain/FrameCollection.java b/src/main/java/domain/FrameCollection.java new file mode 100644 index 0000000..dfdc66e --- /dev/null +++ b/src/main/java/domain/FrameCollection.java @@ -0,0 +1,18 @@ +package domain; + +import output.BollingScorePresentable; + +import java.util.ArrayList; +import java.util.List; + +public class FrameCollection { + private List frameList = new ArrayList<>(); + + public void add(Frame frame) { + frameList.add(frame); + } + + public void printScore(BollingScorePresentable printer) { + + } +} diff --git a/src/main/java/domain/FrameStatus.java b/src/main/java/domain/FrameStatus.java new file mode 100644 index 0000000..47250e6 --- /dev/null +++ b/src/main/java/domain/FrameStatus.java @@ -0,0 +1,5 @@ +package domain; + +public enum FrameStatus { + STRIKE, SPARE, MISS, HIT, GUTTER, NOMISS; +} diff --git a/src/main/java/domain/Player.java b/src/main/java/domain/Player.java index a9fd40c..dd3b6f4 100644 --- a/src/main/java/domain/Player.java +++ b/src/main/java/domain/Player.java @@ -1,12 +1,29 @@ package domain; +import java.util.ArrayList; +import java.util.List; + public class Player { private String name; + private List frames = new ArrayList<>(); + public Player(String playerName) { + this.name = playerName; } - public void bowl(int fallingPinCount) { - // do something plus score + public int bowl(int fallingPinCount) { + Frame currentFrame = getCurrentFrame(); + return 1; + //return currentFrame.bowl(fallingPinCount); + } + + private Frame getCurrentFrame() { + int lastFrameIndex = frames.size() - 1; + return frames.get(lastFrameIndex); + } + + public boolean isEnd() { + return false; } -} +} \ No newline at end of file diff --git a/src/main/java/domain/Scorable.java b/src/main/java/domain/Scorable.java new file mode 100644 index 0000000..0966d59 --- /dev/null +++ b/src/main/java/domain/Scorable.java @@ -0,0 +1,5 @@ +package domain; + +public interface Scorable { + Score getScore(); +} diff --git a/src/main/java/domain/Score.java b/src/main/java/domain/Score.java new file mode 100644 index 0000000..0a64874 --- /dev/null +++ b/src/main/java/domain/Score.java @@ -0,0 +1,14 @@ +package domain; + +public class Score { + public final static Score ZERO_SCORE = Score.of(FallingPin.MISS); + private int score; + + private Score(FallingPin pins) { + this.score = score; + } + + public static Score of(FallingPin pin) { + return new Score(pin); + } +} diff --git a/src/main/java/output/BollingScorePresentable.java b/src/main/java/output/BollingScorePresentable.java index 617f206..2486957 100644 --- a/src/main/java/output/BollingScorePresentable.java +++ b/src/main/java/output/BollingScorePresentable.java @@ -1,7 +1,16 @@ package output; import domain.BollingGame; +import domain.FallingPin; +import domain.Frame; +import domain.Player; + +import java.util.List; public interface BollingScorePresentable { - void show(final BollingGame object); + void show(final List players); + + void show(Frame frame); + + void show(FallingPin fallingPin); } diff --git a/src/main/java/output/ConsoleBollingScorePresenter.java b/src/main/java/output/ConsoleBollingScorePresenter.java index 3c2aca5..d8dfa63 100644 --- a/src/main/java/output/ConsoleBollingScorePresenter.java +++ b/src/main/java/output/ConsoleBollingScorePresenter.java @@ -1,10 +1,47 @@ package output; -import domain.BollingGame; +import domain.FallingPin; +import domain.Frame; +import domain.Player; + +import java.util.List; public class ConsoleBollingScorePresenter implements BollingScorePresentable { + + private final static String STRIKE_SYMBOL = "X"; + private final static String SPARE_SYMBOL = "/"; + private final static String MISS_SYMBOL = "-"; + + @Override + public void show(final List players) { + // print about player info (score) + } + @Override - public void show(BollingGame object) { - // Print some result about bolling game + public void show(Frame frame) { + StringBuilder stringBuilder = new StringBuilder(); + + FallingPin first = frame.getFirst(); + FallingPin second = frame.getSecond(); + + switch (frame.getStatus()) { + case STRIKE: + stringBuilder.append(STRIKE_SYMBOL); + break; + case SPARE: + stringBuilder.append(first.value() + "|" + SPARE_SYMBOL); + break; + default: + String firstValue = first.value() == 0 ? MISS_SYMBOL : String.valueOf(first.value()); + String secondValue = second.value() == 0 ? MISS_SYMBOL : String.valueOf(second.value()); + stringBuilder.append(firstValue + "|" + secondValue); + break; + } + System.out.println(stringBuilder); + } + + @Override + public void show(FallingPin fallingPin) { + } } diff --git a/src/test/java/ouput/ConsoleBollingScorePresenterTest.java b/src/test/java/ouput/ConsoleBollingScorePresenterTest.java new file mode 100644 index 0000000..ce0d999 --- /dev/null +++ b/src/test/java/ouput/ConsoleBollingScorePresenterTest.java @@ -0,0 +1,16 @@ +package ouput; + +import domain.FallingPin; +import domain.Frame; +import domain.FrameCollection; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +public class ConsoleBollingScorePresenterTest { + @Test + @DisplayName("콘솔 출력 확인") + void scorePrintTest() { + FrameCollection frameCollection = new FrameCollection(); + frameCollection.add(new Frame(new FallingPin(10), new FallingPin(0))); + } +} From 650227a9539d3045d2cbe56d6ed99e5275f403eb Mon Sep 17 00:00:00 2001 From: Delf-Lee Date: Sun, 16 Feb 2020 02:47:19 +0900 Subject: [PATCH 5/8] =?UTF-8?q?=EC=A0=90=EC=88=98=20=ED=99=94=EB=A9=B4=20?= =?UTF-8?q?=EC=B6=9C=EB=A0=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/BollingApplication.java | 31 ------- src/main/java/BowlingApplication.java | 29 ++++++ src/main/java/domain/BollingGame.java | 44 ---------- src/main/java/domain/BowlingGame.java | 41 +++++++++ src/main/java/domain/FallingPin.java | 27 ++++-- src/main/java/domain/Frame.java | 88 ++++++++++++------- src/main/java/domain/FrameCollection.java | 10 ++- src/main/java/domain/FrameStatus.java | 5 -- src/main/java/domain/Player.java | 29 +++--- src/main/java/domain/Players.java | 41 +++++++++ ...ttable.java => BowlingGameInputtable.java} | 2 +- ... => ConsoleBowlingGameInputInterface.java} | 2 +- .../java/output/BollingScorePresentable.java | 16 ---- .../java/output/BowlingScorePresentable.java | 11 +++ .../output/ConsoleBollingScorePresenter.java | 47 ---------- .../output/ConsoleBowlingScorePresenter.java | 53 +++++++++++ .../ConsoleBollingScorePresenterTest.java | 16 ---- .../ConsoleBowlingScorePresenterTest.java | 28 ++++++ 18 files changed, 303 insertions(+), 217 deletions(-) delete mode 100644 src/main/java/BollingApplication.java create mode 100644 src/main/java/BowlingApplication.java delete mode 100644 src/main/java/domain/BollingGame.java create mode 100644 src/main/java/domain/BowlingGame.java delete mode 100644 src/main/java/domain/FrameStatus.java create mode 100644 src/main/java/domain/Players.java rename src/main/java/input/{BollingGameInputtable.java => BowlingGameInputtable.java} (63%) rename src/main/java/input/{ConsoleBollingGameInputInterface.java => ConsoleBowlingGameInputInterface.java} (85%) delete mode 100644 src/main/java/output/BollingScorePresentable.java create mode 100644 src/main/java/output/BowlingScorePresentable.java delete mode 100644 src/main/java/output/ConsoleBollingScorePresenter.java create mode 100644 src/main/java/output/ConsoleBowlingScorePresenter.java delete mode 100644 src/test/java/ouput/ConsoleBollingScorePresenterTest.java create mode 100644 src/test/java/ouput/ConsoleBowlingScorePresenterTest.java diff --git a/src/main/java/BollingApplication.java b/src/main/java/BollingApplication.java deleted file mode 100644 index 487cae5..0000000 --- a/src/main/java/BollingApplication.java +++ /dev/null @@ -1,31 +0,0 @@ -import domain.BollingGame; -import domain.Player; -import input.BollingGameInputtable; -import input.ConsoleBollingGameInputInterface; -import output.BollingScorePresentable; -import output.ConsoleBollingScorePresenter; - -import java.util.Collections; -import java.util.List; - -public class BollingApplication { - private static final int DEFAULT_BOLLING_MAX_FRAME = 10; - private static BollingGameInputtable inputManager = new ConsoleBollingGameInputInterface(); - private static final BollingScorePresentable bollingScorePresenter = new ConsoleBollingScorePresenter(); - - public static void main(String[] args) { - String playerName = inputManager.getPlayerName(); - Player player = new Player(playerName); - List playerList = Collections.singletonList(player); - BollingGame bollingGame = new BollingGame(DEFAULT_BOLLING_MAX_FRAME, playerList); - - while (bollingGame.hasNext()) { - Player thisTurnPlayer = bollingGame.nextPlayer(); - int fallingPinCount = inputManager.getFallingPint(); - thisTurnPlayer.bowl(fallingPinCount); - bollingGame.printScore(bollingScorePresenter); - } - - System.out.println("--볼링 게임 끝--"); - } -} diff --git a/src/main/java/BowlingApplication.java b/src/main/java/BowlingApplication.java new file mode 100644 index 0000000..974cc1e --- /dev/null +++ b/src/main/java/BowlingApplication.java @@ -0,0 +1,29 @@ +import domain.BowlingGame; +import domain.Player; +import domain.Players; +import input.BowlingGameInputtable; +import input.ConsoleBowlingGameInputInterface; +import output.ConsoleBowlingScorePresenter; + +import java.util.Collections; + +public class BowlingApplication { + private static final int DEFAULT_BOWLING_MAX_FRAME = 10; + private static BowlingGameInputtable inputManager = new ConsoleBowlingGameInputInterface(); + + public static void main(String[] args) { + String playerName = inputManager.getPlayerName(); + Player player = new Player(playerName, null); + Players playerList = new Players(Collections.singletonList(player)); + BowlingGame bowlingGame = new BowlingGame(DEFAULT_BOWLING_MAX_FRAME, playerList); + + while (bowlingGame.hasNext()) { + Player thisTurnPlayer = bowlingGame.nextPlayer(); + int fallingPinCount = inputManager.getFallingPint(); + thisTurnPlayer.bowl(fallingPinCount); + ConsoleBowlingScorePresenter.print(bowlingGame); + } + + System.out.println("--볼링 게임 끝--"); + } +} diff --git a/src/main/java/domain/BollingGame.java b/src/main/java/domain/BollingGame.java deleted file mode 100644 index 4ddf79e..0000000 --- a/src/main/java/domain/BollingGame.java +++ /dev/null @@ -1,44 +0,0 @@ -package domain; - -import output.BollingScorePresentable; - -import java.util.List; - -public class BollingGame { - public final int MAX_FRAME; - private final List players; - private Player currentPlayer; - private int currentFrameNumber; - - public BollingGame(int maxFrame, List players) { - this.MAX_FRAME = maxFrame; - this.players = players; - this.currentPlayer = players.get(0); - } - - public boolean hasNext() { - return MAX_FRAME > currentFrameNumber; - } - - public Player nextPlayer() { - if (isLastPlayer()) { - currentPlayer = players.get(0); - currentFrameNumber++; - } - - return currentPlayer; - } - private boolean isLastPlayer() { - int lastPlayerIndex = players.size() - 1; - Player lastPlayer = players.get(lastPlayerIndex); - return lastPlayer.equals(currentPlayer); - } - - public int getCurrentFrameNumber() { - return currentFrameNumber; - } - - public void printScore(BollingScorePresentable presenter) { - presenter.show(players); - } -} diff --git a/src/main/java/domain/BowlingGame.java b/src/main/java/domain/BowlingGame.java new file mode 100644 index 0000000..8a35d40 --- /dev/null +++ b/src/main/java/domain/BowlingGame.java @@ -0,0 +1,41 @@ +package domain; + +public class BowlingGame { + public final int MAX_FRAME; + private final Players players; + private int nowFrameNumber; + + public BowlingGame(int maxFrame, Players players) { + this.MAX_FRAME = maxFrame; + this.players = players; + } + + public boolean hasNext() { + return MAX_FRAME > nowFrameNumber; + } + + public Player nextPlayer() { + if (players.isLastPlayer()) { + nowFrameNumber++; + } + + return players.getCurrentPlayer(); + } + + public int getNowFrameNumber() { + return nowFrameNumber; + } + + @Override + public String toString() { + StringBuilder stringBuilder = new StringBuilder(); + stringBuilder.append("| NAME |"); + for (int i = 0; i < MAX_FRAME; i++) { + stringBuilder.append(" ").append(i + 1).append(" |"); + } + + stringBuilder.append("\n").append(players); + + return stringBuilder.toString(); + } +} diff --git a/src/main/java/domain/FallingPin.java b/src/main/java/domain/FallingPin.java index d1d90af..c40dd36 100644 --- a/src/main/java/domain/FallingPin.java +++ b/src/main/java/domain/FallingPin.java @@ -1,14 +1,12 @@ package domain; -import output.BollingScorePresentable; - public class FallingPin { public final static FallingPin MISS = new FallingPin(0); public final static FallingPin NONE = new FallingPin(-1); private int fallingPinCount; public FallingPin(int fallingPinCount) { - if(fallingPinCount > Frame.DEFAULT_BOLLING_PIN) { + if(fallingPinCount > Frame.DEFAULT_BOWLING_PIN) { throw new IllegalArgumentException("10개 이하"); } this.fallingPinCount = fallingPinCount; @@ -18,7 +16,26 @@ public int value() { return fallingPinCount; } - public void print(BollingScorePresentable printer) { - printer.show(this); + public String getSymbol() { + if (this.equals(MISS)) { + return Frame.FrameStatus.MISS.symbol; + } + return String.valueOf(fallingPinCount); + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + FallingPin that = (FallingPin) o; + + return fallingPinCount == that.fallingPinCount; + + } + + @Override + public int hashCode() { + return fallingPinCount; } } diff --git a/src/main/java/domain/Frame.java b/src/main/java/domain/Frame.java index 2dd6aaf..911a8e3 100644 --- a/src/main/java/domain/Frame.java +++ b/src/main/java/domain/Frame.java @@ -1,50 +1,70 @@ package domain; -import output.BollingScorePresentable; +import static domain.Frame.FrameStatus.*; public class Frame implements Scorable { - public final static int DEFAULT_BOLLING_PIN = 10; + public final static int DEFAULT_BOWLING_PIN = 10; - private FallingPin first = FallingPin.NONE; - private FallingPin second = FallingPin.NONE; + private FallingPin first = FallingPin.NONE; + private FallingPin second = FallingPin.NONE; - public Frame(FallingPin first, FallingPin second) { - this.first = first; - this.second = second; - } + public Frame(FallingPin first, FallingPin second) { + this.first = first; + this.second = second; + } - public FrameStatus getStatus() { - if (first.value() == DEFAULT_BOLLING_PIN) { - return FrameStatus.STRIKE; - } + @Override + public Score getScore() { + // some way of calculate score + return Score.ZERO_SCORE; + } - if (first.value() + second.value() == DEFAULT_BOLLING_PIN) { - return FrameStatus.SPARE; - } + public boolean isEnd() { + if (first.equals(FallingPin.NONE)) { + return false; + } - if (first.value() + second.value() == 0) { - return FrameStatus.MISS; - } + return FrameStatus.of(this).equals(STRIKE); + } - return FrameStatus.SPARE; - } + public enum FrameStatus { + STRIKE("X"), SPARE("/"), MISS("-"), HIT(""); - @Override - public Score getScore() { - // some way of calculate score - return Score.ZERO_SCORE; - } + String symbol; - public void print(BollingScorePresentable pinter) { - pinter.show(this); - } + FrameStatus(String symbol) { + this.symbol = symbol; + } - public FallingPin getFirst() { - return first; - } + public static FrameStatus of(Frame frame) { + FallingPin first = frame.first; - public FallingPin getSecond() { - return second; - } + if (first.value() == DEFAULT_BOWLING_PIN) { + return STRIKE; + } + + FallingPin second = frame.second; + + if (first.value() + second.value() == DEFAULT_BOWLING_PIN) { + return SPARE; + } + + return HIT; + } + } + + @Override + public String toString() { + switch (FrameStatus.of(this)) { + case STRIKE: + return STRIKE.symbol; + + case SPARE: + return first.getSymbol() + "|" + SPARE.symbol; + + default: + return first.getSymbol() + "|" + second.getSymbol(); + } + } } diff --git a/src/main/java/domain/FrameCollection.java b/src/main/java/domain/FrameCollection.java index dfdc66e..b6ac389 100644 --- a/src/main/java/domain/FrameCollection.java +++ b/src/main/java/domain/FrameCollection.java @@ -1,7 +1,5 @@ package domain; -import output.BollingScorePresentable; - import java.util.ArrayList; import java.util.List; @@ -12,7 +10,13 @@ public void add(Frame frame) { frameList.add(frame); } - public void printScore(BollingScorePresentable printer) { + @Override + public String toString() { + StringBuilder stringBuilder = new StringBuilder(); + frameList.stream() + .map(Frame::toString) + .forEach(s -> stringBuilder.append(s).append(" | ")); + return stringBuilder.toString(); } } diff --git a/src/main/java/domain/FrameStatus.java b/src/main/java/domain/FrameStatus.java deleted file mode 100644 index 47250e6..0000000 --- a/src/main/java/domain/FrameStatus.java +++ /dev/null @@ -1,5 +0,0 @@ -package domain; - -public enum FrameStatus { - STRIKE, SPARE, MISS, HIT, GUTTER, NOMISS; -} diff --git a/src/main/java/domain/Player.java b/src/main/java/domain/Player.java index dd3b6f4..bd0752d 100644 --- a/src/main/java/domain/Player.java +++ b/src/main/java/domain/Player.java @@ -1,29 +1,30 @@ package domain; -import java.util.ArrayList; -import java.util.List; - public class Player { private String name; - private List frames = new ArrayList<>(); - - public Player(String playerName) { + private FrameCollection frames = new FrameCollection(); + private Frame currentFrame; + public Player(String playerName, FrameCollection frameCollection) { this.name = playerName; + this.frames = frameCollection; } public int bowl(int fallingPinCount) { - Frame currentFrame = getCurrentFrame(); - return 1; - //return currentFrame.bowl(fallingPinCount); + + return 0; + } + + public FrameCollection getFrames() { + return frames; } - private Frame getCurrentFrame() { - int lastFrameIndex = frames.size() - 1; - return frames.get(lastFrameIndex); + @Override + public String toString() { + return "|" + name + "|" + frames; } - public boolean isEnd() { - return false; + public boolean hasChance() { + return !currentFrame.isEnd(); } } \ No newline at end of file diff --git a/src/main/java/domain/Players.java b/src/main/java/domain/Players.java new file mode 100644 index 0000000..29add0f --- /dev/null +++ b/src/main/java/domain/Players.java @@ -0,0 +1,41 @@ +package domain; + +import java.util.List; + +public class Players { + private List players; + private int currentPlayerIndex; + + public Players(List players) { + this.players = players; + } + + public Player getCurrentPlayer() { + Player currentPlayer = currentPlayer(); + if (currentPlayer.hasChance()) { + return currentPlayer; + } + + return nextPlayer(); + } + + private Player nextPlayer() { + currentPlayerIndex = currentPlayerIndex % players.size(); + return players.get(currentPlayerIndex++); + } + + public boolean isLastPlayer() { + return currentPlayerIndex == players.size(); + } + + private Player currentPlayer() { + return players.get(currentPlayerIndex); + } + + @Override + public String toString() { + StringBuilder stringBuilder = new StringBuilder(); + players.stream().map(Player::toString).forEach(stringBuilder::append); + return stringBuilder.toString(); + } +} diff --git a/src/main/java/input/BollingGameInputtable.java b/src/main/java/input/BowlingGameInputtable.java similarity index 63% rename from src/main/java/input/BollingGameInputtable.java rename to src/main/java/input/BowlingGameInputtable.java index e9adb2c..095787b 100644 --- a/src/main/java/input/BollingGameInputtable.java +++ b/src/main/java/input/BowlingGameInputtable.java @@ -1,6 +1,6 @@ package input; -public interface BollingGameInputtable { +public interface BowlingGameInputtable { String getPlayerName(); int getFallingPint(); } diff --git a/src/main/java/input/ConsoleBollingGameInputInterface.java b/src/main/java/input/ConsoleBowlingGameInputInterface.java similarity index 85% rename from src/main/java/input/ConsoleBollingGameInputInterface.java rename to src/main/java/input/ConsoleBowlingGameInputInterface.java index 3fdad38..e46faa9 100644 --- a/src/main/java/input/ConsoleBollingGameInputInterface.java +++ b/src/main/java/input/ConsoleBowlingGameInputInterface.java @@ -2,7 +2,7 @@ import java.util.Scanner; -public class ConsoleBollingGameInputInterface implements BollingGameInputtable { +public class ConsoleBowlingGameInputInterface implements BowlingGameInputtable { private Scanner scanner = new Scanner(System.in); @Override diff --git a/src/main/java/output/BollingScorePresentable.java b/src/main/java/output/BollingScorePresentable.java deleted file mode 100644 index 2486957..0000000 --- a/src/main/java/output/BollingScorePresentable.java +++ /dev/null @@ -1,16 +0,0 @@ -package output; - -import domain.BollingGame; -import domain.FallingPin; -import domain.Frame; -import domain.Player; - -import java.util.List; - -public interface BollingScorePresentable { - void show(final List players); - - void show(Frame frame); - - void show(FallingPin fallingPin); -} diff --git a/src/main/java/output/BowlingScorePresentable.java b/src/main/java/output/BowlingScorePresentable.java new file mode 100644 index 0000000..0f79448 --- /dev/null +++ b/src/main/java/output/BowlingScorePresentable.java @@ -0,0 +1,11 @@ +package output; + +public interface BowlingScorePresentable { + /*void show(final List players); + + void show(Player player); + + void show(Frame frame); + + void show(FallingPin fallingPin);*/ +} diff --git a/src/main/java/output/ConsoleBollingScorePresenter.java b/src/main/java/output/ConsoleBollingScorePresenter.java deleted file mode 100644 index d8dfa63..0000000 --- a/src/main/java/output/ConsoleBollingScorePresenter.java +++ /dev/null @@ -1,47 +0,0 @@ -package output; - -import domain.FallingPin; -import domain.Frame; -import domain.Player; - -import java.util.List; - -public class ConsoleBollingScorePresenter implements BollingScorePresentable { - - private final static String STRIKE_SYMBOL = "X"; - private final static String SPARE_SYMBOL = "/"; - private final static String MISS_SYMBOL = "-"; - - @Override - public void show(final List players) { - // print about player info (score) - } - - @Override - public void show(Frame frame) { - StringBuilder stringBuilder = new StringBuilder(); - - FallingPin first = frame.getFirst(); - FallingPin second = frame.getSecond(); - - switch (frame.getStatus()) { - case STRIKE: - stringBuilder.append(STRIKE_SYMBOL); - break; - case SPARE: - stringBuilder.append(first.value() + "|" + SPARE_SYMBOL); - break; - default: - String firstValue = first.value() == 0 ? MISS_SYMBOL : String.valueOf(first.value()); - String secondValue = second.value() == 0 ? MISS_SYMBOL : String.valueOf(second.value()); - stringBuilder.append(firstValue + "|" + secondValue); - break; - } - System.out.println(stringBuilder); - } - - @Override - public void show(FallingPin fallingPin) { - - } -} diff --git a/src/main/java/output/ConsoleBowlingScorePresenter.java b/src/main/java/output/ConsoleBowlingScorePresenter.java new file mode 100644 index 0000000..b8fa12d --- /dev/null +++ b/src/main/java/output/ConsoleBowlingScorePresenter.java @@ -0,0 +1,53 @@ +package output; + +import domain.BowlingGame; + +public class ConsoleBowlingScorePresenter implements BowlingScorePresentable { + + private final static String STRIKE_SYMBOL = "X"; + private final static String SPARE_SYMBOL = "/"; + private final static String MISS_SYMBOL = "-"; + + public static void print(BowlingGame bowlingGame) { + + } + + /*@Override + public void show(final List players) { + // print about player info (score) + } + + @Override + public void show(Player player) { + + } + + @Override + public void show(Frame frame) { + StringBuilder stringBuilder = new StringBuilder(); + + + switch (Frame.FrameStatus.of(frame)) { + case STRIKE: + break; + } + + + System.out.println(stringBuilder); + } + + @Override + public void show(FallingPin fallingPin) { + + } + + public static void main(String[] args) { + String s = "5|/"; + String s1 = "X"; + // String s2 = "5|/"; + System.out.print("|"); + + System.out.print(String.format("%-6s|%-6s|%-6s", s, s1, s)); + System.out.print("|"); + }*/ +} diff --git a/src/test/java/ouput/ConsoleBollingScorePresenterTest.java b/src/test/java/ouput/ConsoleBollingScorePresenterTest.java deleted file mode 100644 index ce0d999..0000000 --- a/src/test/java/ouput/ConsoleBollingScorePresenterTest.java +++ /dev/null @@ -1,16 +0,0 @@ -package ouput; - -import domain.FallingPin; -import domain.Frame; -import domain.FrameCollection; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -public class ConsoleBollingScorePresenterTest { - @Test - @DisplayName("콘솔 출력 확인") - void scorePrintTest() { - FrameCollection frameCollection = new FrameCollection(); - frameCollection.add(new Frame(new FallingPin(10), new FallingPin(0))); - } -} diff --git a/src/test/java/ouput/ConsoleBowlingScorePresenterTest.java b/src/test/java/ouput/ConsoleBowlingScorePresenterTest.java new file mode 100644 index 0000000..a7de718 --- /dev/null +++ b/src/test/java/ouput/ConsoleBowlingScorePresenterTest.java @@ -0,0 +1,28 @@ +package ouput; + +import domain.*; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import java.util.Collections; + +public class ConsoleBowlingScorePresenterTest { + @Test + @DisplayName("콘솔 출력 확인") + void scorePrintTest() { + + + FrameCollection frameCollection = new FrameCollection(); + frameCollection.add(new Frame(new FallingPin(10), new FallingPin(0))); + frameCollection.add(new Frame(new FallingPin(3), new FallingPin(7))); + frameCollection.add(new Frame(new FallingPin(4), new FallingPin(4))); + frameCollection.add(new Frame(new FallingPin(4), new FallingPin(0))); + frameCollection.add(new Frame(new FallingPin(0), new FallingPin(4))); + frameCollection.add(new Frame(new FallingPin(0), new FallingPin(0))); + + Player player = new Player("LSH", frameCollection); + + BowlingGame bowlingGame = new BowlingGame(10, new Players(Collections.singletonList(player))); + System.out.println(bowlingGame); + } +} From 969367bb15073041f257890c90c77c67903c87cc Mon Sep 17 00:00:00 2001 From: Delf-Lee Date: Sun, 17 May 2020 12:25:30 +0900 Subject: [PATCH 6/8] =?UTF-8?q?=EC=A0=90=EC=88=98=20=EA=B3=84=EC=82=B0=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 5 + gradle/wrapper/gradle-wrapper.properties | 5 +- src/main/java/BowlingApplication.java | 9 +- src/main/java/domain/BowlingGame.java | 6 +- src/main/java/domain/FallingPin.java | 9 +- src/main/java/domain/Frame.java | 123 +++++++++++------- src/main/java/domain/FrameCollection.java | 9 ++ src/main/java/domain/Player.java | 25 +++- src/main/java/domain/Score.java | 23 +++- .../java/input/BowlingGameInputtable.java | 4 +- .../ConsoleBowlingGameInputInterface.java | 6 +- .../ConsoleBowlingScorePresenterTest.java | 38 +++++- 12 files changed, 189 insertions(+), 73 deletions(-) diff --git a/build.gradle b/build.gradle index 1b85b74..2242c59 100755 --- a/build.gradle +++ b/build.gradle @@ -11,4 +11,9 @@ repositories { dependencies { testCompile('org.junit.jupiter:junit-jupiter:5.4.2') testCompile('org.assertj:assertj-core:3.11.1') + implementation 'junit:junit:4.12' +} + +test { + useJUnitPlatform() } \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 290541c..96038ea 100755 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,6 @@ +#Thu Feb 20 23:25:10 KST 2020 +distributionUrl=https\://services.gradle.org/distributions/gradle-4.10.3-all.zip distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-4.10.3-bin.zip -zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME diff --git a/src/main/java/BowlingApplication.java b/src/main/java/BowlingApplication.java index 974cc1e..743e51b 100644 --- a/src/main/java/BowlingApplication.java +++ b/src/main/java/BowlingApplication.java @@ -1,4 +1,5 @@ import domain.BowlingGame; +import domain.FallingPin; import domain.Player; import domain.Players; import input.BowlingGameInputtable; @@ -11,19 +12,19 @@ public class BowlingApplication { private static final int DEFAULT_BOWLING_MAX_FRAME = 10; private static BowlingGameInputtable inputManager = new ConsoleBowlingGameInputInterface(); - public static void main(String[] args) { + public static void main(String[] args) throws IllegalAccessException { String playerName = inputManager.getPlayerName(); - Player player = new Player(playerName, null); + Player player = new Player(playerName); Players playerList = new Players(Collections.singletonList(player)); BowlingGame bowlingGame = new BowlingGame(DEFAULT_BOWLING_MAX_FRAME, playerList); while (bowlingGame.hasNext()) { Player thisTurnPlayer = bowlingGame.nextPlayer(); - int fallingPinCount = inputManager.getFallingPint(); + FallingPin fallingPinCount = inputManager.getFallingPint(); thisTurnPlayer.bowl(fallingPinCount); ConsoleBowlingScorePresenter.print(bowlingGame); } System.out.println("--볼링 게임 끝--"); } -} +} \ No newline at end of file diff --git a/src/main/java/domain/BowlingGame.java b/src/main/java/domain/BowlingGame.java index 8a35d40..53648a7 100644 --- a/src/main/java/domain/BowlingGame.java +++ b/src/main/java/domain/BowlingGame.java @@ -29,13 +29,13 @@ public int getNowFrameNumber() { @Override public String toString() { StringBuilder stringBuilder = new StringBuilder(); - stringBuilder.append("| NAME |"); + stringBuilder.append("| NAME |"); for (int i = 0; i < MAX_FRAME; i++) { - stringBuilder.append(" ").append(i + 1).append(" |"); + stringBuilder.append(" ").append(i + 1).append(" |"); } stringBuilder.append("\n").append(players); - return stringBuilder.toString(); + return stringBuilder.toString() + "\n"; } } diff --git a/src/main/java/domain/FallingPin.java b/src/main/java/domain/FallingPin.java index c40dd36..1553362 100644 --- a/src/main/java/domain/FallingPin.java +++ b/src/main/java/domain/FallingPin.java @@ -6,7 +6,7 @@ public class FallingPin { private int fallingPinCount; public FallingPin(int fallingPinCount) { - if(fallingPinCount > Frame.DEFAULT_BOWLING_PIN) { + if (fallingPinCount > Frame.DEFAULT_BOWLING_PIN) { throw new IllegalArgumentException("10개 이하"); } this.fallingPinCount = fallingPinCount; @@ -16,10 +16,15 @@ public int value() { return fallingPinCount; } - public String getSymbol() { + public String getSymbol() { if (this.equals(MISS)) { return Frame.FrameStatus.MISS.symbol; } + + if (this.equals(NONE)) { + return Frame.FrameStatus.NONE.symbol; + } + return String.valueOf(fallingPinCount); } diff --git a/src/main/java/domain/Frame.java b/src/main/java/domain/Frame.java index 911a8e3..23623d1 100644 --- a/src/main/java/domain/Frame.java +++ b/src/main/java/domain/Frame.java @@ -3,68 +3,103 @@ import static domain.Frame.FrameStatus.*; public class Frame implements Scorable { - public final static int DEFAULT_BOWLING_PIN = 10; private FallingPin first = FallingPin.NONE; - private FallingPin second = FallingPin.NONE; + private FallingPin second = FallingPin.NONE; - public Frame(FallingPin first, FallingPin second) { - this.first = first; - this.second = second; - } + private Frame previousFrame; - @Override - public Score getScore() { - // some way of calculate score - return Score.ZERO_SCORE; - } + public Frame() { + this.previousFrame = this; + } - public boolean isEnd() { - if (first.equals(FallingPin.NONE)) { - return false; + public Frame(Frame previousFrame) { + this.previousFrame = previousFrame; + } + + public void fall(FallingPin pins) throws IllegalAccessException { + if(first.equals(FallingPin.NONE)) { + this.first = pins; + return; } + this.second = pins; - return FrameStatus.of(this).equals(STRIKE); + if (pinCount() > DEFAULT_BOWLING_PIN) { + throw new IllegalAccessException(); + } + } + + private int pinCount() { + return first.value() + second.value(); } - public enum FrameStatus { - STRIKE("X"), SPARE("/"), MISS("-"), HIT(""); + @Override + public Score getScore() { + if (previousFrame.isSpareOrStrike()) { + return Score.NOT_DETERMINED; + } - String symbol; + if (previousFrame.equals(this)) { + return Score.ZERO; + } - FrameStatus(String symbol) { - this.symbol = symbol; - } + Score previousScore = previousFrame.getScore(); + return Score.of(pinCount() + previousScore.value()); + } - public static FrameStatus of(Frame frame) { - FallingPin first = frame.first; + private boolean isSpareOrStrike() { + return (FrameStatus.of(this).equals(STRIKE)) || (FrameStatus.of(this).equals(SPARE)); + } - if (first.value() == DEFAULT_BOWLING_PIN) { - return STRIKE; - } + public boolean isEnd() { + if(FrameStatus.of(this).equals(STRIKE)) { + return true; + } + return second != FallingPin.NONE; + } - FallingPin second = frame.second; + public enum FrameStatus { + STRIKE("X"), SPARE("/"), MISS("-"), HIT(""), NONE(" "); - if (first.value() + second.value() == DEFAULT_BOWLING_PIN) { - return SPARE; - } + String symbol; - return HIT; - } - } + FrameStatus(String symbol) { + this.symbol = symbol; + } - @Override - public String toString() { - switch (FrameStatus.of(this)) { - case STRIKE: - return STRIKE.symbol; + public static FrameStatus of(Frame frame) { + FallingPin first = frame.first; - case SPARE: - return first.getSymbol() + "|" + SPARE.symbol; + if (first.equals(FallingPin.NONE)) { + return NONE; + } - default: - return first.getSymbol() + "|" + second.getSymbol(); - } - } + if (first.value() == DEFAULT_BOWLING_PIN) { + return STRIKE; + } + + FallingPin second = frame.second; + + if (first.value() + second.value() == DEFAULT_BOWLING_PIN) { + return SPARE; + } + + return HIT; + } + } + + @Override + public String toString() { + switch (FrameStatus.of(this)) { + case STRIKE: + return " " + STRIKE.symbol + " "; + + case SPARE: + return first.getSymbol() + "|" + SPARE.symbol; + + default: + return first.getSymbol() + "|" + second.getSymbol(); + } + } } diff --git a/src/main/java/domain/FrameCollection.java b/src/main/java/domain/FrameCollection.java index b6ac389..fed651f 100644 --- a/src/main/java/domain/FrameCollection.java +++ b/src/main/java/domain/FrameCollection.java @@ -19,4 +19,13 @@ public String toString() { return stringBuilder.toString(); } + + public String getScore() { + StringBuilder stringBuilder = new StringBuilder(); + frameList.stream() + .map(Frame::getScore) + .forEach(s -> stringBuilder.append(s).append(" | ")); + + return stringBuilder.toString(); + } } diff --git a/src/main/java/domain/Player.java b/src/main/java/domain/Player.java index bd0752d..e830d3b 100644 --- a/src/main/java/domain/Player.java +++ b/src/main/java/domain/Player.java @@ -3,16 +3,25 @@ public class Player { private String name; private FrameCollection frames = new FrameCollection(); - private Frame currentFrame; + private Frame currentFrame = new Frame(); - public Player(String playerName, FrameCollection frameCollection) { + public Player(String playerName) { this.name = playerName; - this.frames = frameCollection; + frames.add(currentFrame); } - public int bowl(int fallingPinCount) { + public void bowl(FallingPin pins) throws IllegalAccessException { + currentFrame = currentFrame(); + currentFrame.fall(pins); + } - return 0; + private Frame currentFrame() { + if(currentFrame.isEnd()) { + currentFrame = new Frame(currentFrame); + frames.add(currentFrame); + return currentFrame; + } + return currentFrame; } public FrameCollection getFrames() { @@ -21,7 +30,11 @@ public FrameCollection getFrames() { @Override public String toString() { - return "|" + name + "|" + frames; + StringBuilder sb = new StringBuilder(); + sb.append("| ").append(name).append(" |").append(frames).append("\n"); + sb.append(" |").append(frames.getScore()); + + return sb.toString(); } public boolean hasChance() { diff --git a/src/main/java/domain/Score.java b/src/main/java/domain/Score.java index 0a64874..847ff51 100644 --- a/src/main/java/domain/Score.java +++ b/src/main/java/domain/Score.java @@ -1,14 +1,29 @@ package domain; public class Score { - public final static Score ZERO_SCORE = Score.of(FallingPin.MISS); + public final static Score ZERO = Score.of(0); + public final static Score NOT_DETERMINED = Score.of(-1); + private int score; - private Score(FallingPin pins) { + private Score(int score) { this.score = score; } - public static Score of(FallingPin pin) { - return new Score(pin); + public static Score of(int score) { + return new Score(score); + } + + public int value() { + return score; + } + + @Override + public String toString() { + if (this.equals(NOT_DETERMINED)) { + return " "; + } + + return String.valueOf(score); } } diff --git a/src/main/java/input/BowlingGameInputtable.java b/src/main/java/input/BowlingGameInputtable.java index 095787b..b67d6cd 100644 --- a/src/main/java/input/BowlingGameInputtable.java +++ b/src/main/java/input/BowlingGameInputtable.java @@ -1,6 +1,8 @@ package input; +import domain.FallingPin; + public interface BowlingGameInputtable { String getPlayerName(); - int getFallingPint(); + FallingPin getFallingPint(); } diff --git a/src/main/java/input/ConsoleBowlingGameInputInterface.java b/src/main/java/input/ConsoleBowlingGameInputInterface.java index e46faa9..12700e7 100644 --- a/src/main/java/input/ConsoleBowlingGameInputInterface.java +++ b/src/main/java/input/ConsoleBowlingGameInputInterface.java @@ -1,5 +1,7 @@ package input; +import domain.FallingPin; + import java.util.Scanner; public class ConsoleBowlingGameInputInterface implements BowlingGameInputtable { @@ -12,8 +14,8 @@ public String getPlayerName() { } @Override - public int getFallingPint() { + public FallingPin getFallingPint() { System.out.println("쓰러트린 핀: "); - return scanner.nextInt(); + return new FallingPin(scanner.nextInt()); } } diff --git a/src/test/java/ouput/ConsoleBowlingScorePresenterTest.java b/src/test/java/ouput/ConsoleBowlingScorePresenterTest.java index a7de718..929e049 100644 --- a/src/test/java/ouput/ConsoleBowlingScorePresenterTest.java +++ b/src/test/java/ouput/ConsoleBowlingScorePresenterTest.java @@ -9,20 +9,48 @@ public class ConsoleBowlingScorePresenterTest { @Test @DisplayName("콘솔 출력 확인") - void scorePrintTest() { + void scorePrintTest() throws IllegalAccessException { - FrameCollection frameCollection = new FrameCollection(); + /* FrameCollection frameCollection = new FrameCollection(); frameCollection.add(new Frame(new FallingPin(10), new FallingPin(0))); frameCollection.add(new Frame(new FallingPin(3), new FallingPin(7))); frameCollection.add(new Frame(new FallingPin(4), new FallingPin(4))); frameCollection.add(new Frame(new FallingPin(4), new FallingPin(0))); frameCollection.add(new Frame(new FallingPin(0), new FallingPin(4))); - frameCollection.add(new Frame(new FallingPin(0), new FallingPin(0))); - - Player player = new Player("LSH", frameCollection); + frameCollection.add(new Frame(new FallingPin(0), new FallingPin(0)));*/ + Player player = new Player("LSH"); BowlingGame bowlingGame = new BowlingGame(10, new Players(Collections.singletonList(player))); + + player = bowlingGame.nextPlayer(); + + player.bowl(new FallingPin(10)); + System.out.println(bowlingGame); + + player.bowl(new FallingPin(0)); + System.out.println(bowlingGame); + player.bowl(new FallingPin(3)); + System.out.println(bowlingGame); + + player.bowl(new FallingPin(7)); + System.out.println(bowlingGame); + player.bowl(new FallingPin(3)); + System.out.println(bowlingGame); + + player.bowl(new FallingPin(4)); + System.out.println(bowlingGame); + player.bowl(new FallingPin(4)); + System.out.println(bowlingGame); + + player.bowl(new FallingPin(0)); + System.out.println(bowlingGame); + player.bowl(new FallingPin(4)); + System.out.println(bowlingGame); + + player.bowl(new FallingPin(4)); + System.out.println(bowlingGame); + player.bowl(new FallingPin(0)); System.out.println(bowlingGame); } } From c6bf834b8062b52213c5a4c10890ceb3515174b9 Mon Sep 17 00:00:00 2001 From: Delf-Lee Date: Thu, 21 May 2020 23:39:43 +0900 Subject: [PATCH 7/8] =?UTF-8?q?Frame=20=EC=83=9D=EC=84=B1=20=EC=B1=85?= =?UTF-8?q?=EC=9E=84=EC=9D=84=20FrameCollection=EC=9D=B4=20=EC=A0=84?= =?UTF-8?q?=EB=8B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/Frame.java | 29 ++++++++++++----------- src/main/java/domain/FrameCollection.java | 22 ++++++++++++++--- src/main/java/domain/Player.java | 14 ++--------- 3 files changed, 36 insertions(+), 29 deletions(-) diff --git a/src/main/java/domain/Frame.java b/src/main/java/domain/Frame.java index 23623d1..78d4e6b 100644 --- a/src/main/java/domain/Frame.java +++ b/src/main/java/domain/Frame.java @@ -3,36 +3,37 @@ import static domain.Frame.FrameStatus.*; public class Frame implements Scorable { - public final static int DEFAULT_BOWLING_PIN = 10; + public final static int DEFAULT_BOWLING_PIN = 10; + public final static Frame NONE_FRAME = new Frame(null); - private FallingPin first = FallingPin.NONE; + private FallingPin first = FallingPin.NONE; private FallingPin second = FallingPin.NONE; private Frame previousFrame; - public Frame() { + /*public Frame() { this.previousFrame = this; - } + }*/ public Frame(Frame previousFrame) { this.previousFrame = previousFrame; } public void fall(FallingPin pins) throws IllegalAccessException { - if(first.equals(FallingPin.NONE)) { - this.first = pins; - return; - } + if (first.equals(FallingPin.NONE)) { + this.first = pins; + return; + } this.second = pins; - if (pinCount() > DEFAULT_BOWLING_PIN) { - throw new IllegalAccessException(); - } + if (pinCount() > DEFAULT_BOWLING_PIN) { + throw new IllegalAccessException(); + } } private int pinCount() { - return first.value() + second.value(); - } + return first.value() + second.value(); + } @Override public Score getScore() { @@ -53,7 +54,7 @@ private boolean isSpareOrStrike() { } public boolean isEnd() { - if(FrameStatus.of(this).equals(STRIKE)) { + if (FrameStatus.of(this).equals(STRIKE)) { return true; } return second != FallingPin.NONE; diff --git a/src/main/java/domain/FrameCollection.java b/src/main/java/domain/FrameCollection.java index fed651f..4caf1c4 100644 --- a/src/main/java/domain/FrameCollection.java +++ b/src/main/java/domain/FrameCollection.java @@ -1,13 +1,23 @@ package domain; import java.util.ArrayList; +import java.util.LinkedList; import java.util.List; +import java.util.Optional; public class FrameCollection { - private List frameList = new ArrayList<>(); + private LinkedList frameList = new LinkedList<>(); - public void add(Frame frame) { - frameList.add(frame); + public Frame getCurrent() { + if(frameList.isEmpty()) { + frameList.add(Frame.NONE_FRAME); + } + + Frame currentFrame = frameList.getLast(); + if (currentFrame.isEnd()) { + currentFrame = new Frame(currentFrame); + } + return currentFrame; } @Override @@ -28,4 +38,10 @@ public String getScore() { return stringBuilder.toString(); } + + public static void main(String[] args) { + LinkedList frameList = new LinkedList<>(); + + System.out.println(Optional.of(frameList.getLast()).orElse(Frame.NONE_FRAME)); + } } diff --git a/src/main/java/domain/Player.java b/src/main/java/domain/Player.java index e830d3b..7dd32b3 100644 --- a/src/main/java/domain/Player.java +++ b/src/main/java/domain/Player.java @@ -3,27 +3,16 @@ public class Player { private String name; private FrameCollection frames = new FrameCollection(); - private Frame currentFrame = new Frame(); public Player(String playerName) { this.name = playerName; - frames.add(currentFrame); } public void bowl(FallingPin pins) throws IllegalAccessException { - currentFrame = currentFrame(); + Frame currentFrame = frames.getCurrent(); currentFrame.fall(pins); } - private Frame currentFrame() { - if(currentFrame.isEnd()) { - currentFrame = new Frame(currentFrame); - frames.add(currentFrame); - return currentFrame; - } - return currentFrame; - } - public FrameCollection getFrames() { return frames; } @@ -38,6 +27,7 @@ public String toString() { } public boolean hasChance() { + Frame currentFrame = frames.getCurrent(); return !currentFrame.isEnd(); } } \ No newline at end of file From 198440fb44620ba6ef46620ed9316c54a125611d Mon Sep 17 00:00:00 2001 From: Delf-Lee Date: Sun, 31 May 2020 13:23:35 +0900 Subject: [PATCH 8/8] =?UTF-8?q?=EC=A0=90=EC=88=98=20=EA=B3=84=EC=82=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/BowlingGame.java | 6 +- src/main/java/domain/FallingPin.java | 3 + src/main/java/domain/Frame.java | 89 ++++++++++++++--------- src/main/java/domain/FrameCollection.java | 35 +++++---- src/main/java/domain/Player.java | 12 +-- src/main/java/domain/Score.java | 12 +-- 6 files changed, 87 insertions(+), 70 deletions(-) diff --git a/src/main/java/domain/BowlingGame.java b/src/main/java/domain/BowlingGame.java index 53648a7..d230b85 100644 --- a/src/main/java/domain/BowlingGame.java +++ b/src/main/java/domain/BowlingGame.java @@ -22,16 +22,12 @@ public Player nextPlayer() { return players.getCurrentPlayer(); } - public int getNowFrameNumber() { - return nowFrameNumber; - } - @Override public String toString() { StringBuilder stringBuilder = new StringBuilder(); stringBuilder.append("| NAME |"); for (int i = 0; i < MAX_FRAME; i++) { - stringBuilder.append(" ").append(i + 1).append(" |"); + stringBuilder.append(String.format(" %2d |", i + 1)); } stringBuilder.append("\n").append(players); diff --git a/src/main/java/domain/FallingPin.java b/src/main/java/domain/FallingPin.java index 1553362..e83de30 100644 --- a/src/main/java/domain/FallingPin.java +++ b/src/main/java/domain/FallingPin.java @@ -13,6 +13,9 @@ public FallingPin(int fallingPinCount) { } public int value() { + if(this.equals(NONE)) { + return 0; + } return fallingPinCount; } diff --git a/src/main/java/domain/Frame.java b/src/main/java/domain/Frame.java index 78d4e6b..ca77914 100644 --- a/src/main/java/domain/Frame.java +++ b/src/main/java/domain/Frame.java @@ -1,23 +1,17 @@ package domain; +import java.util.Objects; + import static domain.Frame.FrameStatus.*; public class Frame implements Scorable { public final static int DEFAULT_BOWLING_PIN = 10; - public final static Frame NONE_FRAME = new Frame(null); + public final static Frame NONE_FRAME = new Frame(); private FallingPin first = FallingPin.NONE; private FallingPin second = FallingPin.NONE; - private Frame previousFrame; - - /*public Frame() { - this.previousFrame = this; - }*/ - - public Frame(Frame previousFrame) { - this.previousFrame = previousFrame; - } + private Frame nextFrame = NONE_FRAME; public void fall(FallingPin pins) throws IllegalAccessException { if (first.equals(FallingPin.NONE)) { @@ -35,29 +29,66 @@ private int pinCount() { return first.value() + second.value(); } + public void setNextFrame(Frame nextFrame) { + this.nextFrame = nextFrame; + } + + public boolean isEnd() { + if (FrameStatus.of(this).equals(STRIKE)) { + return true; + } + return !second.equals(FallingPin.NONE); + } + @Override - public Score getScore() { - if (previousFrame.isSpareOrStrike()) { + public Score getScore() { // 다듬을 여지 있음 + if (Objects.isNull(nextFrame) || !isEnd()) { return Score.NOT_DETERMINED; } - if (previousFrame.equals(this)) { - return Score.ZERO; + Score nextFrameScore = Score.of(0); + + if (FrameStatus.of(this).equals(STRIKE)) { + if (!nextFrame.isEnd()) { + return Score.NOT_DETERMINED; + } + nextFrameScore = nextFrame.getFallingPinCount(); } - Score previousScore = previousFrame.getScore(); - return Score.of(pinCount() + previousScore.value()); + if (FrameStatus.of(this).equals(SPARE)) { + if (nextFrame.isEndFirstTry()) { + return Score.NOT_DETERMINED; + } + nextFrameScore = nextFrame.getFallingPinCountAtFirstTry(); + } + + return getFallingPinCount().add(nextFrameScore); } - private boolean isSpareOrStrike() { - return (FrameStatus.of(this).equals(STRIKE)) || (FrameStatus.of(this).equals(SPARE)); + private boolean isEndFirstTry() { + return first.equals(FallingPin.NONE); } - public boolean isEnd() { - if (FrameStatus.of(this).equals(STRIKE)) { - return true; + private Score getFallingPinCountAtFirstTry() { + return Score.of(first.value()); + } + + private Score getFallingPinCount() { + return Score.of(first.value() + second.value()); + } + + @Override + public String toString() { + switch (FrameStatus.of(this)) { + case STRIKE: + return " " + STRIKE.symbol + " "; + + case SPARE: + return " " + first.getSymbol() + "|" + SPARE.symbol + " "; + + default: + return " " + first.getSymbol() + "|" + second.getSymbol() + " "; } - return second != FallingPin.NONE; } public enum FrameStatus { @@ -89,18 +120,4 @@ public static FrameStatus of(Frame frame) { return HIT; } } - - @Override - public String toString() { - switch (FrameStatus.of(this)) { - case STRIKE: - return " " + STRIKE.symbol + " "; - - case SPARE: - return first.getSymbol() + "|" + SPARE.symbol; - - default: - return first.getSymbol() + "|" + second.getSymbol(); - } - } } diff --git a/src/main/java/domain/FrameCollection.java b/src/main/java/domain/FrameCollection.java index 4caf1c4..f44af30 100644 --- a/src/main/java/domain/FrameCollection.java +++ b/src/main/java/domain/FrameCollection.java @@ -8,16 +8,25 @@ public class FrameCollection { private LinkedList frameList = new LinkedList<>(); + // 현재 유효한 Frame 반환 public Frame getCurrent() { - if(frameList.isEmpty()) { - frameList.add(Frame.NONE_FRAME); + Frame currentFrame; + if (frameList.isEmpty()) { // 비어있으면 List에 새 Frame 추가 후 반환 + currentFrame = new Frame(); + frameList.add(currentFrame); + return currentFrame; } - Frame currentFrame = frameList.getLast(); - if (currentFrame.isEnd()) { - currentFrame = new Frame(currentFrame); + // 비어있지 않지만 + currentFrame = frameList.getLast(); + if (currentFrame.isEnd()) { // 마지막 Frame이 끝났으면 새 Frame 추가 후 반환 + Frame nextFrame = new Frame(); + currentFrame.setNextFrame(nextFrame); + frameList.add(nextFrame); + return nextFrame; } - return currentFrame; + + return currentFrame; // 안끝났으면 해당 Frame 반환 } @Override @@ -25,7 +34,10 @@ public String toString() { StringBuilder stringBuilder = new StringBuilder(); frameList.stream() .map(Frame::toString) - .forEach(s -> stringBuilder.append(s).append(" | ")); + .forEach(s -> stringBuilder.append(s).append("|")); + for (int i = 0; i < Frame.DEFAULT_BOWLING_PIN - frameList.size(); i++) { + stringBuilder.append(" |"); + } return stringBuilder.toString(); } @@ -34,14 +46,7 @@ public String getScore() { StringBuilder stringBuilder = new StringBuilder(); frameList.stream() .map(Frame::getScore) - .forEach(s -> stringBuilder.append(s).append(" | ")); - + .forEach(s -> stringBuilder.append(s).append(" | ")); return stringBuilder.toString(); } - - public static void main(String[] args) { - LinkedList frameList = new LinkedList<>(); - - System.out.println(Optional.of(frameList.getLast()).orElse(Frame.NONE_FRAME)); - } } diff --git a/src/main/java/domain/Player.java b/src/main/java/domain/Player.java index 7dd32b3..d195651 100644 --- a/src/main/java/domain/Player.java +++ b/src/main/java/domain/Player.java @@ -13,21 +13,17 @@ public void bowl(FallingPin pins) throws IllegalAccessException { currentFrame.fall(pins); } - public FrameCollection getFrames() { - return frames; + public boolean hasChance() { + Frame currentFrame = frames.getCurrent(); + return !currentFrame.isEnd(); } @Override public String toString() { StringBuilder sb = new StringBuilder(); sb.append("| ").append(name).append(" |").append(frames).append("\n"); - sb.append(" |").append(frames.getScore()); + sb.append(" | ").append(frames.getScore()); return sb.toString(); } - - public boolean hasChance() { - Frame currentFrame = frames.getCurrent(); - return !currentFrame.isEnd(); - } } \ No newline at end of file diff --git a/src/main/java/domain/Score.java b/src/main/java/domain/Score.java index 847ff51..27b2bc7 100644 --- a/src/main/java/domain/Score.java +++ b/src/main/java/domain/Score.java @@ -1,8 +1,7 @@ package domain; public class Score { - public final static Score ZERO = Score.of(0); - public final static Score NOT_DETERMINED = Score.of(-1); + public final static Score NOT_DETERMINED = Score.of(0); private int score; @@ -14,16 +13,17 @@ public static Score of(int score) { return new Score(score); } - public int value() { - return score; + public Score add(Score score) { + this.score += score.score; + return Score.of(this.score); } @Override public String toString() { if (this.equals(NOT_DETERMINED)) { - return " "; + return " "; } - return String.valueOf(score); + return String.format("%2d", score); } }