open:java-bowling-score

Bowling Score

snippet.java
package main;
 
public class start {
 
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		BowlingGame bg = new BowlingGame();
		bg.start();
	}
 
}
snippet.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();
		}
	}
 
}
snippet.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<Frame> mListFrmae = new ArrayList<Frame>();
	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);
			}
 
		}
	}
 
}
snippet.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<Frame> 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<Frame> 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<Frame> mListFrmae) {
		// TODO Auto-generated method stub
		setSecondScore(secondScore);
 
		Frame beforeFrame = getBeforeFrame(mListFrmae, 1);
		if (beforeFrame == null) return;
 
		if (beforeFrame.mIsStrike) {
			beforeFrame.addAdditionalPoint(secondScore);
		}
	}
 
}

  • open/java-bowling-score.txt
  • 마지막으로 수정됨: 2020/06/02 09:25
  • 저자 127.0.0.1