2016-06-26 5 views
0

Ich habe den unten stehenden Code für ein 10-Pin-Bowling-Scoring-System und versuche, mit zunehmender Punktzahl auf die Variable 'score' in der Konsole zuzugreifen. Wenn ich ein neues Spiel erstelle, indem ich var game = new BowlingGame() eintippe, dann führe ich den Befehl game.roll(5) aus, um ein Ergebnis zu erhalten, aber wenn ich dann var myScore = game.score() gebe und dann myScore in die Konsole einspiele, bekomme ich NaN. Ich habe gerade versucht, game.score() einzugeben, kann es aber nicht abrufen. Kann ich die aktualisierte Punktzahl trotzdem abrufen, wenn ich weiterhin neue Rollen erstelle?Zugriff auf eine von mehreren Variablen innerhalb einer JavaScript-Funktion in der Konsole.

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; 
 
};

Antwort

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

ist der Fehler in der Funktion sumOfBallsInFrame wo self.rolls[frameIndex + 1] eine Position in dem rolls Array zuzugreifen versuchen, die keinen Wert hat. Dies ergibt das Ergebnis der Funktion 5 + undefined, die NaN wird, weil undefined keine Zahl ist.