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
58 changes: 58 additions & 0 deletions src/main/java/BowlingGameWebApp.java
Original file line number Diff line number Diff line change
@@ -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<BowlingGame> 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<String, Object> 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<String, Object> 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<String, Object> model, String templatePath) {
return new HandlebarsTemplateEngine().render(new ModelAndView(model, templatePath));
}
}
42 changes: 42 additions & 0 deletions src/main/java/domain/BowlingGame.java
Original file line number Diff line number Diff line change
@@ -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<Frame> frames;
private String playerName;

public BowlingGame(String playerName) {
this.playerName = playerName;
this.frames = new ArrayList<>();
}

public List<Frame> getFrames() {
return frames;
}

public String getPlayerName() {
return playerName;
}

public List<Frame> 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();
}
}
6 changes: 3 additions & 3 deletions src/main/java/domain/frame/FinalFrame.java
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand Down
4 changes: 2 additions & 2 deletions src/main/java/domain/frame/Frame.java
Original file line number Diff line number Diff line change
Expand Up @@ -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();
}
6 changes: 3 additions & 3 deletions src/main/java/domain/frame/NormalFrame.java
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ public boolean isComplete() {
}

@Override
public boolean canScore() {
public boolean getScoreFlag() {
PlayStatus currentStatus = getStatus();

if (!isComplete()) {
Expand Down Expand Up @@ -45,8 +45,8 @@ public boolean canScore() {
}

@Override
public int score() {
if (!canScore()) {
public int getScore() {
if (!getScoreFlag()) {
throw new IllegalStateException(getFrameNumber() + "프레임은 점수를 구할 수 없는 상태입니다.");
}

Expand Down
4 changes: 4 additions & 0 deletions src/main/java/domain/pitch/Pitches.java
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,10 @@ public Pitch getLast() {
return pitches.get(pitches.size() - 1);
}

public List<Pitch> getList() {
return pitches;
}

public boolean has(int pitchNumber) {
return pitchNumber <= pitches.size();
}
Expand Down
4 changes: 2 additions & 2 deletions src/main/java/view/OutputView.java
Original file line number Diff line number Diff line change
Expand Up @@ -15,10 +15,10 @@ public static void showStatusBoardView(String playerName, List<Frame> 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)
Expand Down
57 changes: 10 additions & 47 deletions src/main/resources/templates/play.html
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@
<div class="container">
<form class="form-show" method="post" action="/throw">
<div class="form-show-div form-group">
<label for="throwingNo">pobi의 4 프레임 첫번째 시도</label>
<label for="throwingNo">{{player}}의 {{currentFrameNumber}} 프레임 첫번째 시도</label>
<input type="text" id="throwingNo" class="form-control"
name="throwingNo" placeholder="10" required autofocus>
</div>
Expand Down Expand Up @@ -88,56 +88,19 @@ <h4 class="text-center"><게임 점수></h4>
</thead>
</thead>
<tbody>
{{#bowlingGames}}
<tr>
<th rowspan=2 class="text-center">pobi</th>
<td class="text-center">X</td>
<td class="text-center">8&nbsp;/</td>
<td class="text-center">7&nbsp;-</td>
<td class="text-center">X</td>
<td class="text-center">X</td>
<td class="text-center">X</td>
<td class="text-center">9&nbsp;/</td>
<td class="text-center">8&nbsp;-</td>
<td class="text-center">6&nbsp;3</td>
<td class="text-center">8&nbsp;/&nbsp;9</td>
<th rowspan=2 class="text-center">{{playerName}}</th>
{{#frames}}
<td class="text-center">{{#pitches.list}}{{displayValue}} {{/pitches.list}}</td>
{{/frames}}
</tr>
<tr>
<td class="text-center">20</td>
<td class="text-center">37</td>
<td class="text-center">44</td>
<td class="text-center">74</td>
<td class="text-center">103</td>
<td class="text-center">123</td>
<td class="text-center">141</td>
<td class="text-center">149</td>
<td class="text-center">158</td>
<td class="text-center">177</td>
{{#frames}}
<td class="text-center">{{#if scoreFlag}}{{score}}{{/if}}</td>
{{/frames}}
</tr>
<tr>
<th rowspan=2 class="text-center">jk</th>
<td class="text-center">X</td>
<td class="text-center">8&nbsp;/</td>
<td class="text-center">7&nbsp;-</td>
<td class="text-center">X</td>
<td class="text-center">X</td>
<td class="text-center">X</td>
<td class="text-center">9&nbsp;/</td>
<td class="text-center">8&nbsp;-</td>
<td class="text-center">6&nbsp;3</td>
<td class="text-center">8&nbsp;/&nbsp;9</td>
</tr>
<tr>
<td class="text-center">20</td>
<td class="text-center">37</td>
<td class="text-center">44</td>
<td class="text-center">74</td>
<td class="text-center">103</td>
<td class="text-center">123</td>
<td class="text-center">141</td>
<td class="text-center">149</td>
<td class="text-center">158</td>
<td class="text-center">177</td>
</tr>
{{/bowlingGames}}
</tbody>
</table>
</div>
Expand Down
38 changes: 19 additions & 19 deletions src/test/java/domain/frame/FinalFrameTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
}
34 changes: 17 additions & 17 deletions src/test/java/domain/frame/NormalFrameTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
}