// Copyright (C) 2003,2004,2005 by Object Mentor, Inc. All rights reserved.
// Released under the terms of the GNU General Public License version 2 or later.
package eg.bowling;
public class BowlingScorer {
private int[] rolls = new int[21];
protected int rollNumber = 0;
public void roll(int pins) {
rolls[rollNumber++] = pins;
}
public int score(int frame) {
int score = 0;
int roll = 0;
for (int f = 0; f < frame; f++) {
if (strike(roll)) {
score += 10 + nextTwoBallsForStrike(roll);
roll++;
} else if (spare(roll)) {
score += 10 + nextBallForSpare(roll);
roll += 2;
} else {
score += ballsInFrame(roll);
roll += 2;
}
}
return score;
}
private int ballsInFrame(int roll) {
return rolls[roll] + rolls[roll + 1];
}
private int nextBallForSpare(int roll) {
return rolls[roll + 2];
}
private int nextTwoBallsForStrike(int roll) {
return (rolls[roll + 1] + rolls[roll + 2]);
}
private boolean spare(int roll) {
return rolls[roll] + rolls[roll + 1] == 10;
}
private boolean strike(int roll) {
return rolls[roll] == 10;
}
protected boolean lastRollWasStrike() {
return rolls[rollNumber - 1] == 10;
}
protected boolean lastRollWasSpare() {
return rolls[rollNumber - 2] + rolls[rollNumber - 1] == 10;
}
}