From 0c8ea00bb278bec55db62ecc8b1f0822a48a28e6 Mon Sep 17 00:00:00 2001 From: ssosso Date: Sat, 21 Apr 2018 00:33:17 +0900 Subject: [PATCH] =?UTF-8?q?=EB=B3=BC=EB=A7=81=203=EB=8B=A8=EA=B3=84-Bowlin?= =?UTF-8?q?gGame=EA=B0=9D=EC=B2=B4=20=EC=B6=94=EA=B0=80,=20=EC=9B=B9?= =?UTF-8?q?=ED=99=94=EB=A9=B4=20=EC=B6=9C=EB=A0=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/BowlingGameWebApp.java | 58 +++++++++++++++++++ src/main/java/domain/BowlingGame.java | 42 ++++++++++++++ src/main/java/domain/frame/FinalFrame.java | 6 +- src/main/java/domain/frame/Frame.java | 4 +- src/main/java/domain/frame/NormalFrame.java | 6 +- src/main/java/domain/pitch/Pitches.java | 4 ++ src/main/java/view/OutputView.java | 4 +- src/main/resources/templates/play.html | 57 ++++-------------- .../java/domain/frame/FinalFrameTest.java | 38 ++++++------ .../java/domain/frame/NormalFrameTest.java | 34 +++++------ 10 files changed, 160 insertions(+), 93 deletions(-) create mode 100644 src/main/java/BowlingGameWebApp.java create mode 100644 src/main/java/domain/BowlingGame.java diff --git a/src/main/java/BowlingGameWebApp.java b/src/main/java/BowlingGameWebApp.java new file mode 100644 index 00000000..0c555fd6 --- /dev/null +++ b/src/main/java/BowlingGameWebApp.java @@ -0,0 +1,58 @@ +import domain.BowlingGame; +import spark.ModelAndView; +import spark.template.handlebars.HandlebarsTemplateEngine; + +import java.util.*; + +import static spark.Spark.get; +import static spark.Spark.port; +import static spark.Spark.post; + +public class BowlingGameWebApp { + private static List bowlingGames; + private static int playerIndex; + + public static void main(String[] args) { + port(8080); + + get("/", (request, response) -> { + bowlingGames = new ArrayList<>(); + playerIndex = 0; + return render(null, "/index.html"); + }); + + post("/start", (request, response) -> { + Arrays.stream(request.queryParams("players").split(", |,")) + .forEach(playerName -> bowlingGames.add(new BowlingGame(playerName))); + + Map model = new HashMap<>(); + model.put("bowlingGames", bowlingGames); + model.put("player", bowlingGames.get(playerIndex).getPlayerName()); + model.put("currentFrameNumber", getCurrentFrameNumber()); + return render(model, "/play.html"); + }); + + post("/throw", (request, response) -> { + bowlingGames.get(playerIndex).play(Integer.parseInt(request.queryParams("throwingNo"))); + + Map model = new HashMap<>(); + model.put("bowlingGames", bowlingGames); + model.put("player", getNextPlayer()); + model.put("currentFrameNumber", getCurrentFrameNumber()); + return render(model, "/play.html"); + }); + } + + private static int getCurrentFrameNumber() { + return bowlingGames.get(playerIndex).getFrames().size() + 1; + } + + private static String getNextPlayer() { + playerIndex = (playerIndex + 1) % bowlingGames.size(); + return bowlingGames.get(playerIndex).getPlayerName(); + } + + private static String render(Map model, String templatePath) { + return new HandlebarsTemplateEngine().render(new ModelAndView(model, templatePath)); + } +} diff --git a/src/main/java/domain/BowlingGame.java b/src/main/java/domain/BowlingGame.java new file mode 100644 index 00000000..7734f6ce --- /dev/null +++ b/src/main/java/domain/BowlingGame.java @@ -0,0 +1,42 @@ +package domain; + +import domain.frame.Frame; +import domain.frame.NormalFrame; + +import java.util.ArrayList; +import java.util.List; + +public class BowlingGame { + private List frames; + private String playerName; + + public BowlingGame(String playerName) { + this.playerName = playerName; + this.frames = new ArrayList<>(); + } + + public List getFrames() { + return frames; + } + + public String getPlayerName() { + return playerName; + } + + public List play(int pinCount) { + Frame currentFrame = frames.isEmpty() ? new NormalFrame(pinCount) : frames.get(frames.size() - 1).bowl(pinCount); + if (!frames.contains(currentFrame)) { + frames.add(currentFrame); + } + return frames; + } + + public boolean canPlay() { + if(frames.isEmpty()) { + return true; + } + + Frame lastFrame = frames.get(frames.size() - 1); + return !lastFrame.isFinalFrame() || !lastFrame.isComplete(); + } +} diff --git a/src/main/java/domain/frame/FinalFrame.java b/src/main/java/domain/frame/FinalFrame.java index e0109ab9..6dd6d5ea 100644 --- a/src/main/java/domain/frame/FinalFrame.java +++ b/src/main/java/domain/frame/FinalFrame.java @@ -23,13 +23,13 @@ public boolean isComplete() { } @Override - public boolean canScore() { + public boolean getScoreFlag() { return isComplete(); } @Override - public int score() { - if (!canScore()) { + public int getScore() { + if (!getScoreFlag()) { throw new IllegalStateException(getFrameNumber() + "프레임은 점수를 구할 수 없는 상태입니다."); } return getPitches().sum(); diff --git a/src/main/java/domain/frame/Frame.java b/src/main/java/domain/frame/Frame.java index d93c5c50..9e481f49 100644 --- a/src/main/java/domain/frame/Frame.java +++ b/src/main/java/domain/frame/Frame.java @@ -62,7 +62,7 @@ public PlayStatus getStatus() { return pitches.getLast().getStatus(); } - public abstract boolean canScore(); + public abstract boolean getScoreFlag(); - public abstract int score(); + public abstract int getScore(); } diff --git a/src/main/java/domain/frame/NormalFrame.java b/src/main/java/domain/frame/NormalFrame.java index 3031b12b..5146f9db 100644 --- a/src/main/java/domain/frame/NormalFrame.java +++ b/src/main/java/domain/frame/NormalFrame.java @@ -17,7 +17,7 @@ public boolean isComplete() { } @Override - public boolean canScore() { + public boolean getScoreFlag() { PlayStatus currentStatus = getStatus(); if (!isComplete()) { @@ -45,8 +45,8 @@ public boolean canScore() { } @Override - public int score() { - if (!canScore()) { + public int getScore() { + if (!getScoreFlag()) { throw new IllegalStateException(getFrameNumber() + "프레임은 점수를 구할 수 없는 상태입니다."); } diff --git a/src/main/java/domain/pitch/Pitches.java b/src/main/java/domain/pitch/Pitches.java index d6ba68e6..99685b76 100644 --- a/src/main/java/domain/pitch/Pitches.java +++ b/src/main/java/domain/pitch/Pitches.java @@ -20,6 +20,10 @@ public Pitch getLast() { return pitches.get(pitches.size() - 1); } + public List getList() { + return pitches; + } + public boolean has(int pitchNumber) { return pitchNumber <= pitches.size(); } diff --git a/src/main/java/view/OutputView.java b/src/main/java/view/OutputView.java index 57b1715a..a09cc552 100644 --- a/src/main/java/view/OutputView.java +++ b/src/main/java/view/OutputView.java @@ -15,10 +15,10 @@ public static void showStatusBoardView(String playerName, List playedFram int scoreSum = 0; for(Frame frame : playedFrames) { - scoreSum += frame.canScore() ? frame.score() : 0; + scoreSum += frame.getScoreFlag() ? frame.getScore() : 0; headerBuilder.append(String.format(frame.isFinalFrame() ? " %02d |" : " %02d |", frame.getFrameNumber())); statusBuilder.append(String.format(frame.isFinalFrame() ? " %-5s |" : " %-3s |", getFrameStatus(frame))); - scoreBuilder.append(String.format(frame.isFinalFrame() ? " %-5s |" : " %-3s |", frame.canScore() ? scoreSum : "")); + scoreBuilder.append(String.format(frame.isFinalFrame() ? " %-5s |" : " %-3s |", frame.getScoreFlag() ? scoreSum : "")); } IntStream.range(playedFrames.size(), Frame.MAX_FRAME_NUMBER) diff --git a/src/main/resources/templates/play.html b/src/main/resources/templates/play.html index 1f4f8381..7f1f1b46 100644 --- a/src/main/resources/templates/play.html +++ b/src/main/resources/templates/play.html @@ -55,7 +55,7 @@
- +
@@ -88,56 +88,19 @@

<게임 점수>

+ {{#bowlingGames}} - pobi - X - 8 / - 7 - - X - X - X - 9 / - 8 - - 6 3 - 8 / 9 + {{playerName}} + {{#frames}} + {{#pitches.list}}{{displayValue}} {{/pitches.list}} + {{/frames}} - 20 - 37 - 44 - 74 - 103 - 123 - 141 - 149 - 158 - 177 + {{#frames}} + {{#if scoreFlag}}{{score}}{{/if}} + {{/frames}} - - jk - X - 8 / - 7 - - X - X - X - 9 / - 8 - - 6 3 - 8 / 9 - - - 20 - 37 - 44 - 74 - 103 - 123 - 141 - 149 - 158 - 177 - + {{/bowlingGames}}
diff --git a/src/test/java/domain/frame/FinalFrameTest.java b/src/test/java/domain/frame/FinalFrameTest.java index 45cb8288..0d4491ae 100644 --- a/src/test/java/domain/frame/FinalFrameTest.java +++ b/src/test/java/domain/frame/FinalFrameTest.java @@ -40,34 +40,34 @@ public class FinalFrameTest { @Test public void canScore테스트() { - assertThat(new FinalFrame(0).canScore()).isEqualTo(false); - assertThat(new FinalFrame(0).bowl(1).canScore()).isEqualTo(true); - assertThat(new FinalFrame(0).bowl(10).canScore()).isEqualTo(false); - assertThat(new FinalFrame(0).bowl(10).bowl(10).canScore()).isEqualTo(true); + assertThat(new FinalFrame(0).getScoreFlag()).isEqualTo(false); + assertThat(new FinalFrame(0).bowl(1).getScoreFlag()).isEqualTo(true); + assertThat(new FinalFrame(0).bowl(10).getScoreFlag()).isEqualTo(false); + assertThat(new FinalFrame(0).bowl(10).bowl(10).getScoreFlag()).isEqualTo(true); - assertThat(new FinalFrame(8).canScore()).isEqualTo(false); - assertThat(new FinalFrame(8).bowl(1).canScore()).isEqualTo(true); + assertThat(new FinalFrame(8).getScoreFlag()).isEqualTo(false); + assertThat(new FinalFrame(8).bowl(1).getScoreFlag()).isEqualTo(true); - assertThat(new FinalFrame(1).bowl(9).canScore()).isEqualTo(false); - assertThat(new FinalFrame(1).bowl(9).bowl(10).canScore()).isEqualTo(true); + assertThat(new FinalFrame(1).bowl(9).getScoreFlag()).isEqualTo(false); + assertThat(new FinalFrame(1).bowl(9).bowl(10).getScoreFlag()).isEqualTo(true); - assertThat(new FinalFrame(10).canScore()).isEqualTo(false); - assertThat(new FinalFrame(10).bowl(2).canScore()).isEqualTo(false); - assertThat(new FinalFrame(10).bowl(2).bowl(8).canScore()).isEqualTo(true); - assertThat(new FinalFrame(10).bowl(10).canScore()).isEqualTo(false); - assertThat(new FinalFrame(10).bowl(10).bowl(10).canScore()).isEqualTo(true); + assertThat(new FinalFrame(10).getScoreFlag()).isEqualTo(false); + assertThat(new FinalFrame(10).bowl(2).getScoreFlag()).isEqualTo(false); + assertThat(new FinalFrame(10).bowl(2).bowl(8).getScoreFlag()).isEqualTo(true); + assertThat(new FinalFrame(10).bowl(10).getScoreFlag()).isEqualTo(false); + assertThat(new FinalFrame(10).bowl(10).bowl(10).getScoreFlag()).isEqualTo(true); } @Test public void score테스트() { - assertThat(new FinalFrame(0).bowl(1).score()).isEqualTo(1); - assertThat(new FinalFrame(0).bowl(10).bowl(10).score()).isEqualTo(20); + assertThat(new FinalFrame(0).bowl(1).getScore()).isEqualTo(1); + assertThat(new FinalFrame(0).bowl(10).bowl(10).getScore()).isEqualTo(20); - assertThat(new FinalFrame(8).bowl(1).score()).isEqualTo(9); + assertThat(new FinalFrame(8).bowl(1).getScore()).isEqualTo(9); - assertThat(new FinalFrame(1).bowl(9).bowl(10).score()).isEqualTo(20); + assertThat(new FinalFrame(1).bowl(9).bowl(10).getScore()).isEqualTo(20); - assertThat(new FinalFrame(10).bowl(2).bowl(8).score()).isEqualTo(20); - assertThat(new FinalFrame(10).bowl(10).bowl(10).score()).isEqualTo(30); + assertThat(new FinalFrame(10).bowl(2).bowl(8).getScore()).isEqualTo(20); + assertThat(new FinalFrame(10).bowl(10).bowl(10).getScore()).isEqualTo(30); } } diff --git a/src/test/java/domain/frame/NormalFrameTest.java b/src/test/java/domain/frame/NormalFrameTest.java index 7e01edbd..440a9ec1 100644 --- a/src/test/java/domain/frame/NormalFrameTest.java +++ b/src/test/java/domain/frame/NormalFrameTest.java @@ -48,48 +48,48 @@ public class NormalFrameTest { @Test public void canScore테스트() { - assertThat(new NormalFrame(10).canScore()).isEqualTo(false); - assertThat(new NormalFrame(1).bowl(9).canScore()).isEqualTo(false); - assertThat(new NormalFrame(1).canScore()).isEqualTo(false); - assertThat(new NormalFrame(2).bowl(5).canScore()).isEqualTo(true); - assertThat(new NormalFrame(0).canScore()).isEqualTo(false); - assertThat(new NormalFrame(0).bowl(0).canScore()).isEqualTo(true); + assertThat(new NormalFrame(10).getScoreFlag()).isEqualTo(false); + assertThat(new NormalFrame(1).bowl(9).getScoreFlag()).isEqualTo(false); + assertThat(new NormalFrame(1).getScoreFlag()).isEqualTo(false); + assertThat(new NormalFrame(2).bowl(5).getScoreFlag()).isEqualTo(true); + assertThat(new NormalFrame(0).getScoreFlag()).isEqualTo(false); + assertThat(new NormalFrame(0).bowl(0).getScoreFlag()).isEqualTo(true); Frame frame = new NormalFrame(10); frame.bowl(2); - assertThat(frame.canScore()).isEqualTo(false); + assertThat(frame.getScoreFlag()).isEqualTo(false); frame.bowl(2).bowl(8); - assertThat(frame.canScore()).isEqualTo(true); + assertThat(frame.getScoreFlag()).isEqualTo(true); frame = new NormalFrame(8).bowl(2); frame.bowl(10); - assertThat(frame.canScore()).isEqualTo(true); + assertThat(frame.getScoreFlag()).isEqualTo(true); frame = new NormalFrame(10); frame.bowl(10); - assertThat(frame.canScore()).isEqualTo(false); + assertThat(frame.getScoreFlag()).isEqualTo(false); frame.bowl(10).bowl(10); - assertThat(frame.canScore()).isEqualTo(true); + assertThat(frame.getScoreFlag()).isEqualTo(true); frame.bowl(10).bowl(2); - assertThat(frame.canScore()).isEqualTo(true); + assertThat(frame.getScoreFlag()).isEqualTo(true); } @Test public void score테스트() { NormalFrame frame = new NormalFrame(10); frame.bowl(2).bowl(3); - assertThat(frame.score()).isEqualTo(15); + assertThat(frame.getScore()).isEqualTo(15); frame.bowl(10).bowl(10).bowl(10); - assertThat(frame.score()).isEqualTo(30); + assertThat(frame.getScore()).isEqualTo(30); frame.bowl(10).bowl(1).bowl(9); - assertThat(frame.score()).isEqualTo(21); + assertThat(frame.getScore()).isEqualTo(21); frame = new NormalFrame(1); frame.bowl(9).bowl(1).bowl(2); - assertThat(frame.score()).isEqualTo(11); + assertThat(frame.getScore()).isEqualTo(11); frame = new NormalFrame(1); frame.bowl(8).bowl(1).bowl(2); - assertThat(frame.score()).isEqualTo(9); + assertThat(frame.getScore()).isEqualTo(9); } }