2016-08-15 2 views
0

여기에 행맨 게임이 있습니다. 일하는 것 같지만, 중복 된 캐릭터 추측을 올바르게 할 수는 없습니다. 현재 은행에는 "팝콘"과 "사과"라는 단어가 두 개뿐입니다. 처음으로 사과를 "p"로 추측하면 첫 번째 p를 채우지 만 초를 채우지는 않습니다.문자열의 중복 문자를 바꾸는 방법 - Javascript

<!DOCTYPE html> 
<html lang="en"> 
<head> 
    <meta charset="UTF-8"> 
    <title>Hangman!</title> 
</head> 
<body> 
<h1>Hangman</h1> 
<h2>Press a letter to guess.</h2> 
<div id="secret"> </div> 

<script> 
var computerChoices = ['apples', 'popcorn']; 
var progress = ""; 
// This chooses a word from the set randomly. 

    var secretWord = computerChoices[Math.floor(Math.random() * computerChoices.length)]; 
    for (i=0; i < secretWord.length; i++){ 
     progress += "_"; 
    } 
// When the user presses the key it records the keypress and then sets it to userguess 
    document.onkeyup = function(event) { 
    var letter = String.fromCharCode(event.keyCode).toLowerCase(); 


    if (secretWord.indexOf(letter) > -1){ 
     console.log("Good Guess!"); 
     index = secretWord.indexOf(letter); 
     progress = progress.substr(0, index) + letter + progress.substr(index + 1); 

     // Placing the html into the secret ID 
     document.querySelector('#secret').innerHTML = progress; 

      if ((/([a-zA-Z]).*?\1/).test(secretWord)) {    
       console.log("Yep, there's a duplicate here") 
    }}else{ 
     console.log ("Eeeeeennnnnghh! Wrong! Try again dumbassss!"); 
    } 



} 
</script> 
</body> 
</html> 

답변

1

당신의 현재 코드는 처음으로 일치하는 문자를 독점적으로 찾습니다. 한 가지 또는 다른 방법으로, 중복 문자를 처리하는 루프가 필요합니다.

그러나 나는 '진행 마스크'를 추적하는 대신, 지금까지 시도 된 모든 문자 목록을 유지해야합니다.

secretWordprogress은 이미 시도한 잘못된 문자를 감지하는 데 충분한 정보를 제공하지 않습니다. 이는 결국 구현하려는 기능 일 것입니다. 반면에 secretWord 및 시도한 문자 목록을 사용하여 필요할 때마다 progress을 신속하게 다시 작성할 수 있습니다.

시도한 문자가 letters 문자열에 저장되어 있다고 가정 해 보겠습니다. 이어서 progress는 계산 될 수 중 명시 루프 등으로 :

// classic for loop 
for(i = 0, progress = ''; i < secretWord.length; i++) { 
    progress += letters.indexOf(secretWord[i]) == -1 ? '_' : secretWord[i] 
} 

또는 암시 루프 등 :

// functional programming 
progress = secretWord.split('').map(function(letter) { 
    return letters.indexOf(letter) == -1 ? '_' : letter; 
}).join(''); 

또는 :

// regular expression: replace() with custom callback 
progress = secretWord.replace(/./g, function(letter) { 
    return letters.indexOf(letter) == -1 ? '_' : letter; 
}); 

또는 :

// regular expression: replace() without callback 
progress = secretWord.replace(new RegExp('[^' + letters + ']', 'g'), '_'); 

다음은 일부 예입니다. 이 접근 방식으로 게임 논리를 보여주는 충분한 코드.

var secretWord = 'apple', 
 
    letters = ''; 
 

 
function play(letter) { 
 
    if(letters.indexOf(letter) != -1) { 
 
    console.log("You've already tried '" + letter + "' ..."); 
 
    } 
 
    else { 
 
    letters += letter; 
 

 
    if(secretWord.indexOf(letter) == -1) { 
 
     console.log(letter + ' -> wrong!'); 
 
    } 
 
    else { 
 
     var progress = secretWord.replace(new RegExp('[^' + letters + ']', 'g'), '_'); 
 

 
     console.log(letter + ' -> ' + progress); 
 
     
 
     if(progress == secretWord) { 
 
     console.log('Well done!'); 
 
     } 
 
    } 
 
    } 
 
} 
 

 
play('i'); 
 
play('e'); 
 
play('p'); 
 
play('e'); 
 
play('a'); 
 
play('l');

1

두 번째 인수를 사용하여, 당신은 루프에서 같이 IndexOf를 호출해야

<!DOCTYPE html> 
<html lang="en"> 
<head> 
    <meta charset="UTF-8"> 
    <title>Hangman!</title> 
</head> 
<body> 
<h1>Hangman</h1> 
<h2>Press a letter to guess.</h2> 
<div id="secret"> </div> 

<script> 
var computerChoices = ['apples', 'popcorn']; 
var progress = ""; 
// This chooses a word from the set randomly. 

    var secretWord = computerChoices[Math.floor(Math.random() * computerChoices.length)]; 
    for (i=0; i < secretWord.length; i++){ 
     progress += "_"; 
    } 
// When the user presses the key it records the keypress and then sets it to userguess 
    document.onkeyup = function(event) { 
    var letter = String.fromCharCode(event.keyCode).toLowerCase(); 


    if (secretWord.indexOf(letter) > -1){ 
     console.log("Good Guess!"); 
     index = secretWord.indexOf(letter); 
     progress = progress.substr(0, index) + letter + progress.substr(index + 1); 
     secretWord = secretWord.substr(0, index) + '*' + secretWord.substr(index + 1); 
     console.log('Secret Word is: ' + secretWord); 

     // Placing the html into the secret ID 
     document.querySelector('#secret').innerHTML = progress; 

      if ((/([a-zA-Z]).*?\1/).test(secretWord)) {    
       console.log("Yep, there's a duplicate here") 
    }}else{ 
     console.log ("Eeeeeennnnnghh! Wrong! Try again dumbassss!"); 
    } 



} 
</script> 
</body> 
</html> 
1

보십시오. 예 :

var word = "popcorn"; 
var result = word.indexOf("p"); 
console.log(result); // Shows "0" 

다시이 작업을 실행하지만, 두 번째 인수에 변수를 "결과를"제공 :

var previousResult = 0; 
var word = "popcorn"; 
// Give as second argument the previous result increased by 1 
var result = word.indexOf("p", previousResult + 1); 
console.log(result); // Shows "2" 

그리고 당신은 while 루프 로직을 수행 할 수 있습니다

var secretWord = "popcorn"; 
var letter = "p"; 
var result = -2; // Initialize to (-1 - 1) 
while ((result = secretWord.indexOf(letter, result + 1)) > -1) { 
    console.log(result); // Shows "0" then "2" 
    /* Do stuff */ 
} 
관련 문제