2016-07-18 9 views
0

Ich programmiere ein einfaches Hangman-Spiel. Aus dem Wort "BANK" wird ein zufälliges Wort ausgewählt, und dann bestimmt das Wort "Länge" die Platzhalterfolge von Unterstrichen. Zum Beispiel wird 'Hund' als '_ _ _' angezeigt.Javascript: Ersetzen von Zeichen in String von keyCode-Ereignis

Ich möchte, dass die Buchstaben die Unterstriche ersetzen, wenn sie gedrückt werden, aber aus irgendeinem Grund, wenn dies passiert, wird ein zusätzlicher Unterstrich hinzugefügt. Wenn ich also 'd' auf meiner Tastatur drücke, geht der Platzhalter von '_ _ _' nach 'd _ _'. Wenn ich dann 'o' drücke, geht das Wort zu 'do _ _'. Gibt es einen Grund für diesen zusätzlichen Unterstrich?

// Game Variables 

var remainingGuesses = 12; 
var wins = 0; 
var losses = 0; 
var wordBank = ['caat', 'dog', 'tiger']; 

// Select Random Word from Array 

var word = wordBank[Math.floor(Math.random(2) * wordBank.length)]; 
var wordLength = word.length; 


// Create Placeholders Based on Word Length 

var placeholders = new Array(wordLength + 1).join('_ '); 

// Captures Key Clicks 

document.onkeyup = function(event) { 
var userGuess = String.fromCharCode(event.keyCode).toLowerCase(); 


// Check Word with Letter 

    if (word.indexOf(userGuess) > -1) { 
     alert('correct!'); 
     placeholders = placeholders.replace(placeholders[(word.indexOf(userGuess))], userGuess); 
} 
else { 
    alert('wrong'); 
    remainingGuesses--; 
} 

console.log(placeholders); 
console.log(word); 
} 

Antwort

0

Überlegen Sie, was Sie hier eine Zeichenfolge namens placeholders von Unterstrichen bestehend Stellen tatsächlich tun,

1) und Räume
2) Überprüfen Sie, ob ein Benutzer Wahl in eine zu einem bestimmten Index vorhanden Wort.
3) Ersetzen Sie einen Teil der placeholders Zeichenfolge basierend auf dem Index dieses Buchstabens im Wort.

Die fehlerhafte Annahme ist, dass die Zeichen in der Zeichenfolge word mit den Zeichen in der Zeichenfolge placeholder übereinstimmen. Sie sind nicht doppelt vorhanden, so dass die Indizes nicht übereinstimmen. Sie werden das erwartete Verhalten für den ersten Buchstaben haben und dann nicht für jeden weiteren Buchstaben.

Zum Beispiel:

word = "dog" // 3 characters 
placeholders = "_ _ _ " // 6 characters 

Ein besserer Ansatz wäre Ihre Logik von Ihrer Anzeige zu trennen. Eine Möglichkeit, dies zu tun (ohne Objekt voll zu gehen orientiert) wäre eine Wortkette haben, wie Sie tun, sondern auch eine entsprechende Anordnung von Anzeigewerten, die Sie initialisieren auf false

word = "dog" 
display = [false, false, false] 

// and this is what you return to your user: 

function makeDisplayString (word, display) { 
    display.map(function(el, idx) { return el ? word[idx] : "_" }).join(" "); 
} 

makeDisplayString("dog", [false, true, false]) 
// => "_ o _" 

Wenn der Benutzer macht einen Wählen Sie den falschen Wert durch true und führen Sie die gleiche Funktion aus, um Ihre Anzeige zu aktualisieren.