2016-06-26 2 views
0

私は10ピンボウリングスコアリングシステムのために以下のコードを持っており、スコアが上がるにつれてコンソール内の「スコア」変数にアクセスしようとしています。 var game = new BowlingGame()と入力して新しいゲームを作成すると、というコマンドを実行してスコアを取得しますが、var myScore = game.score()と入力してmyScoreと入力してNaNを取得します。私もちょうどgame.score()を入力しようとしましたが、それを取得することはできません。新しいロールを作成し続けるうちに、更新されたスコアを取得する方法はありますか?コンソールのJavascript関数内のいくつかの変数の1つにアクセスします。

var BowlingGame = function() { 
 
    this.rolls = []; 
 
    this.currentRoll = 0; 
 
}; 
 

 
BowlingGame.prototype.roll = function(pins) { 
 
    this.rolls[this.currentRoll++] = pins; 
 
}; 
 

 
BowlingGame.prototype.score = function() { 
 
    var score = 0; 
 
    var frameIndex = 0; 
 
    var self = this; 
 

 
    function sumOfBallsInFrame() { 
 
     return self.rolls[frameIndex] + self.rolls[frameIndex + 1]; 
 
    } 
 

 
    function spareBonus() { 
 
     return self.rolls[frameIndex + 2]; 
 
    } 
 

 
    function strikeBonus() { 
 
     return self.rolls[frameIndex + 1] + self.rolls[frameIndex + 2]; 
 
    } 
 

 
    function isStrike() { 
 
     return self.rolls[frameIndex] === 10; 
 
    } 
 

 
    function isSpare() { 
 
     return self.rolls[frameIndex] + self.rolls[frameIndex + 1] === 10; 
 
    } 
 

 
    for (var frame = 0; frame < 10; frame++) { 
 
     if (isStrike()) { 
 
      score += 10 + strikeBonus(); 
 
      frameIndex++; 
 
     } else if (isSpare()) { 
 
      score += 10 + spareBonus(); 
 
      frameIndex += 2; 
 
     } else { 
 
      score += sumOfBallsInFrame(); 
 
      frameIndex += 2; 
 
     } 
 
    } 
 
    return score; 
 
};

答えて

1

var BowlingGame = function() { 
 
    this.rolls = []; 
 
    this.currentRoll = 0; 
 
}; 
 

 
BowlingGame.prototype.roll = function(pins) { 
 
    this.rolls[this.currentRoll++] = pins; 
 
}; 
 

 
BowlingGame.prototype.score = function() { 
 
    var score = 0; 
 
    var frameIndex = 0; 
 
    var self = this; 
 

 
    function sumOfBallsInFrame() { 
 
    if (typeof self.rolls[frameIndex + 1] == 'undefined') return self.rolls[frameIndex]; 
 
    return self.rolls[frameIndex] + self.rolls[frameIndex + 1]; 
 
    } 
 

 
    function spareBonus() { 
 
    if (typeof self.rolls[frameIndex + 2] == 'undefined') return 0; 
 
    return self.rolls[frameIndex + 2]; 
 
    } 
 

 
    function strikeBonus() { 
 
    if (typeof self.rolls[frameIndex + 2] == 'undefined') return 0; 
 
    return self.rolls[frameIndex + 1] + self.rolls[frameIndex + 2]; 
 
    } 
 

 
    function isStrike() { 
 
    return self.rolls[frameIndex] === 10; 
 
    } 
 

 
    function isSpare() { 
 
    if (typeof self.rolls[frameIndex + 1] == 'undefined') return false; // cannot be a spare yet 
 
    return self.rolls[frameIndex] + self.rolls[frameIndex + 1] === 10; 
 
    } 
 

 
    for (var frame = 0; frame < this.currentRoll; frame++) { 
 
    if (isStrike()) { 
 
     score += 10 + strikeBonus(); 
 
     frameIndex++; 
 
    } else if (isSpare()) { 
 
     score += 10 + spareBonus(); 
 
     frameIndex += 2; 
 
    } else { 
 
     score += sumOfBallsInFrame(); 
 
     frameIndex += 2; 
 
    } 
 
    } 
 
    return score; 
 
}; 
 

 
var game = new BowlingGame(); 
 

 
game.roll(5); 
 
console.log(game.score());

1

バグがself.rolls[frameIndex + 1]が値を持たないrollsアレイ内の位置にアクセスしようとしている関数sumOfBallsInFrameです。これにより、関数5 + undefinedの結果はNaNになります。なぜなら、未定義は数値ではないからです。

関連する問題