public class TMScorer extends Scorer
{
// 最高評価時の基準点数
private int BEST = 100;
// 通常評価時の基準点数
private int NORMAL = 50;
// 悪い評価時の基準点数
private int BAD = -50;
// 最悪評価時の基準点数
private int WORST = -100;
// 評価BESTが連続して続いた回数
private int bestNum = 0;
public int score(TimingLane lane)
{
if(!lane.hasNextTiming())
return 0;
int def = lane.input();
if(def<200) // 差が200ms以内
{
// 点数はBEST+0.05×連続BEST回数の1の位の値
int point = (int)(BEST*(1+0.05*(bestNum%10)));
// BESTの連続10回毎に(連続数÷10の整数値)×BEST×2のボーナス店を加点
if(bestNum%10==0)
point+=bestNum/10*BEST*2;
currentScore+=point;
lane.setNextTiming();
return point;
}
else if(def<400) // 差が400ms以内
{
currentScore+=NORMAL;
lane.setNextTiming();
bestNum = 0;
return NORMAL;
}
else if(def<600) // 差が600ms以内
{
currentScore+=BAD;
bestNum = 0;
return BAD;
}
else // 差が600ms以上
{
currentScore+=WORST;
bestNum = 0;
return WORST;
}
}
public void miss()
{
currentScore+=BAD;
bestNum = 0;
manager.updateScore();
}
}
また、上のアクティビティ図であるとおり、採点結果によって行う処理
がありますが、GUI部分を下位のライブラリと切り離すために評価を
表示するクラスと得点を表示するクラスはインタフェースを作り、GUI
コンポーネントクラスがそれらを実装することでライブラリ部分から
GUI側を不可視化しています。そのインタフェースが、Evaluater
インタフェースとScoreBoardインタフェースです。これらはManager
クラス内で使用します。