ペアプロワークショップで書いたプログラムがバグっていたので修正した

ペアプロワークショップで書いたボーリングプログラムが間違っているという連絡をいただきました。o....rz

原因はダブルとかターキーを全然考慮できてなかった点。例によってツメが甘い。修正したソースは下のとおり。

package bowling;

public class Main {

    private int bowlIndex = 0;
    private int[] scoreLog = new int[21];
    private boolean beforeStrike = false;
    private boolean beforeSpare = false;

    public Main() {
        // スコアの初期化
        for (int i = 0; i < scoreLog.length ; i++){
            scoreLog[i] = 0;
        }
    }

    // 与えられたピンの数に対して現在のスコアを計算する
    public void bowl(int pins) {
        scoreLog[bowlIndex] = pins;
        bowlIndex++;
        if (bowlIndex > 2*9) {
            // 10ピン倒しても何もしない
        } else if (pins == 10 && bowlIndex % 2 == 1) {
            scoreLog[bowlIndex] = 0;
            bowlIndex++;
        }
    }

    public int score() {
        return score(scoreLog);
    }

    // 与えられた配列に対してスコアを計算する
    static public int score(int[] pins) {
        int rval = 0;
        for (int i = 0; i < pins.length ; i++) {
            if (i < 16) {
                // 第8フレームまでの処理
                if (i % 2 == 0 && pins[i] == 10) {
                    rval += pins[i + 2];
                    if (pins[i + 2] == 10) {
                        rval += pins[i + 4];
                    } else {
                        rval += pins[i + 3];
                    }
                } else if(i % 2 == 0 && pins[i] + pins[i + 1] == 10) {
                    rval += pins[i + 2];
                }
            } else if (i < 18) {
                // 第9フレームの処理
                if (i % 2 == 0 && pins[i] == 10) {
                    rval += pins[i + 2] + pins[i + 3];
                } else if(i % 2 == 0 && pins[i] + pins[i + 1] == 10) {
                    rval += pins[i + 2];
                }
            } else {
                // 第10フレームの処理は3投の合計のみとなる。
            }
            rval += pins[i];
        }
        return rval;

    }

}

つ〜かね、こういうソースはgithubに載せればいいんじゃね?という思いつきから、githubのアカウントを作ってリポジトリとして公開してみた。

こうやってツッコミを受けるのもソースをオープンにした結果だという前向きに捉えておこう。