# Bowling Score
```java
package main;
public class start {
public static void main(String[] args) {
// TODO Auto-generated method stub
BowlingGame bg = new BowlingGame();
bg.start();
}
}
```
```java
package main;
public class BowlingGame {
BowlingManager bm = new BowlingManager();
public void start() {
// TODO Auto-generated method stub
while (false == bm.isEnd()) {
bm.playFrame();
bm.printScore();
}
}
}
```
```java
package main;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
public class BowlingManager {
List mListFrmae = new ArrayList();
final int TOTAL_FRAME_COUNT = 10;
final int STRIKE_SCORE = 10;
final int MAXIMUM_FRAME = 12;
int mCurrentFrame = 0;
boolean mIsEnd = false;
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
public boolean isEnd() {
return mIsEnd;
}
public void playFrame() {
// TODO Auto-generated method stub
mCurrentFrame++;
Frame f = new Frame(mCurrentFrame);
mListFrmae.add(f);
// ask first score
int firstScore = getScore(mCurrentFrame + " Frmae, First Score:");
f.setFirstScore(firstScore, mListFrmae);
// if not strike, ask second score
if (firstScore != STRIKE_SCORE) {
int secondScore = getScore(mCurrentFrame + " Frame, Second Score:");
f.setSecondScore(secondScore, mListFrmae);
}
// 종료를 판단한다.
if (mCurrentFrame >= TOTAL_FRAME_COUNT) {
if (mCurrentFrame == TOTAL_FRAME_COUNT){
if (f.mIsSpare || f.mIsStrike) {
mIsEnd = false;
}
else {
setEndFlag();
}
}
else if (mCurrentFrame == TOTAL_FRAME_COUNT + 1) {
if (f.mIsStrike) {
mIsEnd = false;
}
else {
setEndFlag();
}
}
else{
setEndFlag();
}
}
}
private void setEndFlag() {
mIsEnd = true;
}
private int getScore(String msg) {
System.out.println(msg);
int score = 0;
try{
score = Integer.parseInt(br.readLine());
}catch(NumberFormatException nfe){
System.err.println("Invalid Format!");
}catch(IOException e){
System.err.println("Read Error");
}
return score;
}
public void printScore() {
int totalScore = 0;
for (int i =0; i < mListFrmae.size(); i++){
Frame f = mListFrmae.get(i);
String currentScore = "";
if (f.mIsStrike) {
currentScore = "X";
} else if (f.mIsSpare) {
currentScore = f.mFirstScore + "-/";
} else {
currentScore = f.mFirstScore + "-" + f.mSecondScore;
}
String totalScoreShow = "";
totalScore += f.mFirstScore + f.mSecondScore + f.mAdditionalPoint;
totalScoreShow = totalScore + "";
if (f.mAddPointCount != 0) {
totalScoreShow = "";
}
if (f.mFrame <= TOTAL_FRAME_COUNT) {
System.out.println(f.mFrame + " Frame:\t" + currentScore + "\tTotal:"+totalScoreShow);
}
}
}
}
```
```java
package main;
import java.util.List;
public class Frame {
int mFrame;
int mFirstScore;
int mSecondScore;
int mAdditionalPoint;
int mAddPointCount = 0;
final int ADD_POINT_STRIKE = 2;
final int ADD_POINT_SPARE = 1;
boolean mIsStrike = false;
boolean mIsSpare = false;
final int STRIKE_SCORE = 10;
public Frame(int currentFrame) {
mFrame = currentFrame;
}
public void setFirstScore(int firstScore) {
mFirstScore = firstScore;
if (mFirstScore == STRIKE_SCORE) {
mIsStrike = true;
mAddPointCount = ADD_POINT_STRIKE;
}
}
public void setSecondScore(int secondScore) {
mSecondScore = secondScore;
if (mIsStrike == false && mFirstScore + mSecondScore == STRIKE_SCORE) {
mIsSpare = true;
mAddPointCount = ADD_POINT_SPARE;
}
}
public int getFirstScore() {
return mFirstScore;
}
public void setFirstScore(int firstScore, List mListFrmae) {
// TODO Auto-generated method stub
setFirstScore(firstScore);
Frame beforeFrame = getBeforeFrame(mListFrmae, 1);
if (beforeFrame == null) return;
if (beforeFrame.mIsSpare) {
beforeFrame.addAdditionalPoint(firstScore);
}
else if (beforeFrame.mIsStrike){
beforeFrame.addAdditionalPoint(firstScore);
Frame b2Frame = getBeforeFrame(mListFrmae, 2);
if (b2Frame == null) return;
if (b2Frame.mIsStrike) {
b2Frame.addAdditionalPoint(firstScore);
}
}
}
private Frame getBeforeFrame(List mListFrmae, int diff) {
if (mListFrmae.size() >= diff + 1) {
return mListFrmae.get(mListFrmae.size() - (diff+1));
}
return null;
}
private void addAdditionalPoint(int addScore) {
mAdditionalPoint += addScore;
mAddPointCount += -1;
}
public void setSecondScore(int secondScore, List mListFrmae) {
// TODO Auto-generated method stub
setSecondScore(secondScore);
Frame beforeFrame = getBeforeFrame(mListFrmae, 1);
if (beforeFrame == null) return;
if (beforeFrame.mIsStrike) {
beforeFrame.addAdditionalPoint(secondScore);
}
}
}
```