All Downloads are FREE. Search and download functionalities are using the official Maven repository.

eg.bowling.BowlingGame Maven / Gradle / Ivy

There is a newer version: 20241026
Show newest version
// 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 BowlingGame implements Bowling {
  private static final int FIRST_BALL_IN_FRAME = 0;
  private static final int SECOND_BALL_IN_FRAME = 1;
  private static final int GAME_OVER = 2;
  private static final int BALL_AFTER_SPARE = 3;
  private static final int BALL_AFTER_TENTH_FRAME_SPARE = 4;
  private static final int BALL_AFTER_FIRST_STRIKE = 5;
  private static final int BALL_AFTER_SECOND_STRIKE = 6;

  private int currentFrame = 1;
  private int currentBall = 1;
  private int scoreableFrame = 0;
  private boolean gameOver = false;

  private int state = FIRST_BALL_IN_FRAME;
  private final BowlingScorer bowlingScorer = new BowlingScorer();

  private void changeState() {
    switch (state) {
      case FIRST_BALL_IN_FRAME:
        firstBallInFrame();
        break;

      case SECOND_BALL_IN_FRAME:
        secondBallInFrame();
        break;

      case BALL_AFTER_SPARE:
        ballAfterSpare();
        break;

      case BALL_AFTER_TENTH_FRAME_SPARE:
        endGame();
        break;

      case BALL_AFTER_FIRST_STRIKE:
        ballAfterFirstStrike();
        break;

      case BALL_AFTER_SECOND_STRIKE:
        ballAfterSecondStrike();
        break;
    }
  }

  private void firstBallInFrame() {
    if (bowlingScorer.lastRollWasStrike()) {
      state = BALL_AFTER_FIRST_STRIKE;
      incrementFrame();
    } else {
      state = SECOND_BALL_IN_FRAME;
      currentBall = 2;
    }
  }

  private void secondBallInFrame() {
    if (bowlingScorer.lastRollWasSpare() && currentFrame == 10) {
      state = BALL_AFTER_TENTH_FRAME_SPARE;
      currentBall = 3;
    } else if (bowlingScorer.lastRollWasSpare()) {
      state = BALL_AFTER_SPARE;
      incrementFrame();
    } else if (currentFrame == 10) {
      endGame();
    } else {
      state = FIRST_BALL_IN_FRAME;
      scoreableFrame = currentFrame;
      incrementFrame();
    }
  }

  private void ballAfterSpare() {
    if (bowlingScorer.lastRollWasStrike()) {
      state = BALL_AFTER_FIRST_STRIKE;
      scoreableFrame++;
      incrementFrame();
    } else {
      state = SECOND_BALL_IN_FRAME;
      currentBall = 2;
      scoreableFrame++;
    }
  }

  private void ballAfterFirstStrike() {
    if (bowlingScorer.lastRollWasStrike()) {
      state = BALL_AFTER_SECOND_STRIKE;
      incrementFrame();
    } else {
      state = SECOND_BALL_IN_FRAME;
      currentBall = 2;
    }
  }

  private void ballAfterSecondStrike() {
    if (bowlingScorer.lastRollWasStrike() && currentFrame == 10 && currentBall == 3) {
      endGame();
    } else if (bowlingScorer.lastRollWasStrike()) {
      incrementFrame();
      scoreableFrame++;
    } else {
      state = SECOND_BALL_IN_FRAME;
      currentBall = 2;
      scoreableFrame++;
    }
  }

  private void endGame() {
    state = GAME_OVER;
    currentBall = 0;
    scoreableFrame = 10;
    gameOver = true;
  }

  private void incrementFrame() {
    if (currentFrame < 10) {
      currentFrame++;
      currentBall = 1;
    } else
      currentBall++;
  }

  @Override
  public int currentFrame() {
    return currentFrame;
  }

  @Override
  public int currentBall() {
    return currentBall;
  }

  @Override
  public int scoreableFrame() {
    return scoreableFrame;
  }

  @Override
  public boolean validGame() {
    return true;
  }

  @Override
  public boolean gameOver() {
    return currentFrame == 10 && currentBall == 0;
  }

  @Override
  public boolean isGameOver() {
    return gameOver;
  }

  @Override
  public void roll(int pins) {
    bowlingScorer.roll(pins);
    changeState();
  }

  @Override
  public int score(int frame) {
    return bowlingScorer.score(frame);
  }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy