2016-11-24 4 views
2

私のロック・ハサミ・ペーパー・ゲームは機能していません。ロック・シザーズ・ペーパー・ゲーム - コードが機能しない

私はJavaScriptの初心者であり、あなたの助けが必要です。ここで

は私のコードです:

function user(x) { 
 
    var element_user = document.getElementById('user'); 
 
    return element_user.innerHTML = x; 
 
} 
 

 
function enemy() { 
 
    random_number = Math.ceil(Math.random() * 3); 
 

 
    if (random_number == 1) { 
 
    random_number = "Stein"; 
 
    } else if (random_number == 2) { 
 
    random_number = "Schere"; 
 
    } else { 
 
    random_number = "Papier"; 
 
    } 
 
    var element_enemy = document.getElementById('enemy'); 
 
    return element_enemy.innerHTML = random_number; 
 
}  
 

 
function winner() { 
 
    if (user() === 'Stein' && random_number === 'Schere') { 
 
    return "User hat gewonnen!"; 
 
    } else if (user() === 'Stein' && random_number === 'Papier') { 
 
    return "Enemy hat gewonnen!"; 
 
    } else if (user() === 'Schere' && random_number === 'Stein') { 
 
    return "Enemy hat gewonnen!"; 
 
    } else if (user() === 'Schere' && random_number === 'Papier') { 
 
    return "User hat gewonnen!"; 
 
    } else if (user() === 'Papier' && random_number === 'Stein') { 
 
    return "User hat gewonnen!"; 
 
    } else if (user() === 'Papier' && random_number === 'Schere') { 
 
    return "Enemy hat gewonnen!"; 
 
    } else { 
 
    return "Unentschieden!"; 
 
    } 
 
    var winner_element = document.getElementById('winner'); 
 
    winner_element.innerHTML = winner(); 
 
}
<!DOCTYPE html> 
 
<html lang="de"> 
 
<head> 
 
    <meta charset="UTF-8"> 
 
    <title>S+S+P</title> 
 
</head> 
 
<body> 
 
    
 
    <p id="user"></p> 
 
    <p id="enemy"></p> 
 
    
 
    <button onclick="user('Stein'), enemy();">Stein</button> 
 
    <button onclick="user('Schere'), enemy();">Schere</button> 
 
    <button onclick="user('Papier'), enemy();">Papier</button> 
 
    
 
    <p id="winner"></p> 
 
    
 
    <button onclick="winner();">Gewinner</button> 
 

 
<script src="game.js"></script> 
 
</body> 
 
</html>

  1. ユーザーがロック、はさみや紙の上のいずれかをクリックすることができます。
  2. 私のJSプログラムでは、上記の結果が+ランダムに表示されます。
  3. [Gewinner]をクリックすると、誰がゲームに勝つかが表示されます。

私は#3で立ち往生しています。勝者は表示されません。

おかげで、

ヨーゼフ

+2

小さなヒント、 'return'の後に' else'は必要ありません。 'if'を続けるだけです。 –

答えて

2

問題

あなたuser()関数はパラメータなしで呼ばれることを意味しません、。あなたは一つの引数を期待し、名前xを与えると言う最初の行で

function user(x) { 
    var element_user = document.getElementById('user'); 
    return element_user.innerHTML = x; 
} 
  1. だが詳細に機能を確認してみましょう。パラメータを指定しないで関数を呼び出すと、xは未定義になります。

  2. 2行目では、#user要素を探して、それをローカル変数に割り当てます。これは問題ありません。
  3. は今、あなたは基本的には、1行に二つのことをやっている:あなたも何をしているinnerHTMLのはundefinedをすることになりますが、引数を渡すことはありませんwinner()内からこの関数を、

    element_user.innerHTML = x; 
    return element_user.innerHTML; 
    

を呼び出すときあなたは結果を見ている。関数を呼び出す代わりに、要素自体から結果を取得することもできます。

別の問題は、winner()からのwinner()への呼び出しであり、返されることはありません。これは、関数が制限に達してブラウザが停止するまで再帰的に呼び出しているためです。

これらの2つの問題で

が固定迅速な解決策は、あなたのコードは次のようになります。

function user(x) { 
 
    var element_user = document.getElementById('user'); 
 
    return element_user.innerHTML = x; 
 
} 
 

 
function enemy() { 
 
    random_number = Math.ceil(Math.random() * 3); 
 

 
    if (random_number == 1) { 
 
    random_number = "Stein"; 
 
    } else if (random_number == 2) { 
 
    random_number = "Schere"; 
 
    } else { 
 
    random_number = "Papier"; 
 
    } 
 
    var element_enemy = document.getElementById('enemy'); 
 
    return element_enemy.innerHTML = random_number; 
 
}  
 

 
function winner() { 
 
    var userChoice = document.getElementById('user').innerHTML; 
 
    console.log(userChoice); 
 
    console.log(random_number); 
 
    if (userChoice === 'Stein' && random_number === 'Schere') { 
 
    return "User hat gewonnen!"; 
 
    } else if (userChoice === 'Stein' && random_number === 'Papier') { 
 
    return "Enemy hat gewonnen!"; 
 
    } else if (userChoice === 'Schere' && random_number === 'Stein') { 
 
    return "Enemy hat gewonnen!"; 
 
    } else if (userChoice === 'Schere' && random_number === 'Papier') { 
 
    return "User hat gewonnen!"; 
 
    } else if (userChoice === 'Papier' && random_number === 'Stein') { 
 
    return "User hat gewonnen!"; 
 
    } else if (userChoice === 'Papier' && random_number === 'Schere') { 
 
    return "Enemy hat gewonnen!"; 
 
    } else { 
 
    return "Unentschieden!"; 
 
    } 
 
} 
 

 
function writeResult() { 
 
    var winner_element = document.getElementById('winner'); 
 
    winner_element.innerHTML = winner(); 
 
}
<!DOCTYPE html> 
 
<html lang="de"> 
 
<head> 
 
    <meta charset="UTF-8"> 
 
    <title>S+S+P</title> 
 
</head> 
 
<body> 
 
    
 
    <p id="user"></p> 
 
    <p id="enemy"></p> 
 
    
 
    <button onclick="user('Stein'), enemy();">Stein</button> 
 
    <button onclick="user('Schere'), enemy();">Schere</button> 
 
    <button onclick="user('Papier'), enemy();">Papier</button> 
 
    
 
    <p id="winner"></p> 
 
    
 
    <button onclick="writeResult();">Gewinner</button> 
 

 
<script src="game.js"></script> 
 
</body> 
 
</html>

それは動作しますが、それでも多くのバグがあり、におい:

  • 機能の名前が不正であり、文書化されていません。それらの機能は推測するのが難しいです。
  • グローバル変数が関数から漏れています。

    /** 
     
    * Sets the given user choice as html text on the #userOutput element. 
     
    */ 
     
    function setUserChoice(choice) { 
     
        document.getElementById('userOutput').innerHTML = choice; 
     
    } 
     
    
     
    /** 
     
    * Choses a random choice for the enemy and sets it as html on the 
     
    * #enemyOutput element. Possible outputs are "Stein", "Schere" and "Paper". 
     
    */ 
     
    function setRandomEnemyChoice() { 
     
        var enemyPossibleChoices = ["Stein", "Schere", "Papier"]; 
     
        var enemyChoiceNum = Math.floor(Math.random() * 3); 
     
        var enemyChoice = enemyPossibleChoices[enemyChoiceNum]; 
     
        document.getElementById('enemyOutput').innerHTML = enemyChoice; 
     
    }  
     
    
     
    /** 
     
    * Given two strings where each is one of "Stein", "Schere" or "Paper", 
     
    * determines the winner and returns the result of the match as string. 
     
    */ 
     
    function determineWinner(userChoice, enemyChoice) { 
     
        if (userChoice === 'Stein' && enemyChoice === 'Schere') { 
     
        return "User hat gewonnen!"; 
     
        } else if (userChoice === 'Stein' && enemyChoice === 'Papier') { 
     
        return "Enemy hat gewonnen!"; 
     
        } else if (userChoice === 'Schere' && enemyChoice === 'Stein') { 
     
        return "Enemy hat gewonnen!"; 
     
        } else if (userChoice === 'Schere' && enemyChoice === 'Papier') { 
     
        return "User hat gewonnen!"; 
     
        } else if (userChoice === 'Papier' && enemyChoice === 'Stein') { 
     
        return "User hat gewonnen!"; 
     
        } else if (userChoice === 'Papier' && enemyChoice === 'Schere') { 
     
        return "Enemy hat gewonnen!"; 
     
        } else { 
     
        return "Unentschieden!"; 
     
        } 
     
    } 
     
    
     
    /** 
     
    * Gathers the user and enemy choices, and uses them to determine the 
     
    * result of the match. The result is then written as html to 
     
    * #resultOutput. 
     
    */ 
     
    function writeResult() { 
     
        var userChoice = document.getElementById('userOutput').innerHTML; 
     
        var enemyChoice = document.getElementById('enemyOutput').innerHTML; 
     
        var resultText = determineWinner(userChoice, enemyChoice); 
     
        document.getElementById('resultOutput').innerHTML = resultText; 
     
    }
    <!DOCTYPE html> 
     
    <html lang="de"> 
     
    <head> 
     
        <meta charset="UTF-8"> 
     
        <title>S+S+P</title> 
     
    </head> 
     
    <body> 
     
        
     
        <p id="userOutput"></p> 
     
        <p id="enemyOutput"></p> 
     
        
     
        <button onclick="setUserChoice('Stein'); setRandomEnemyChoice();">Stein</button> 
     
        <button onclick="setUserChoice('Schere'); setRandomEnemyChoice();">Schere</button> 
     
        <button onclick="setUserChoice('Papier'); setRandomEnemyChoice();">Papier</button> 
     
        
     
        <p id="resultOutput"></p> 
     
        
     
        <button onclick="writeResult();">Gewinner</button> 
     
    
     
    <script src="game.js"></script> 
     
    </body> 
     
    </html>

    :あなたはドイツ語と英語の混合され
  • ...

リファクタリングは反復1

私自身は少しのコードをクリーンアップすることができました

ご覧のとおり、メソッド名とIDはもう少し明確です。リファクタリングの次のステップでは、要素にバインドされた文字列ではなく、1つのグローバルオブジェクトでより良い状態保存を導入できます。選択肢はおそらく文字列表現の定数でなければなりません。したがって、SCISSORS,STONEPAPERというコードで作業し、必要に応じてドイツ語の文字列を出力します。 if..elseの構造は、すでに述べたように大幅に単純化することができます。私は反復2をあなたに残します:-)

幸運。

0

機能の勝者()の最後の2行はそのせいで前に戻っての実行されることはありません。 "return ..."を "result = ..."に変更し、 "winner_element.innterHTML = result;"で終了できますか? ?このように:

function winner() { 
     var result = "" 
     if (user() === 'Stein' && random_number === 'Schere') { 
     result = "User hat gewonnen!"; 
     ... 
     } else if (user() === 'Papier' && random_number === 'Schere') { 
     result = "Enemy hat gewonnen!"; 
     } else { 
     result = "Unentschieden!"; 
     } 
     var winner_element = document.getElementById('winner'); 
     winner_element.innerHTML = result; 
    } 

また、user()関数は正しくありません。このような何かにそれを変更します。

function user() { 
    var element_user = document.getElementById('user'); 
    return element_user.innerHTML; 
} 
+0

チップをありがとう!今、ボタン "Gewinner"がこの機能を実行しています。私はまだ問題を抱えています。その結果、私はいつも「Unentschieden」を得ています。私はまた、ユーザーの選択肢を未定義に変更します...まだ何か間違っています。 –

+1

あなたのuser()メソッドは正しくありません。引数を関数にドロップし、 "= x"を削除します。私は答えを編集してあなたを見せてくれました。 – Jelle

0

下図のようにあなたが作業コードスニペットを試すことができ、

<!DOCTYPE html> 
 
<html lang="de"> 
 
<head> 
 
<meta charset="UTF-8"> 
 
<title>S+S+P</title> 
 
</head> 
 
<body> 
 

 
\t <p id="user"></p> 
 
\t <p id="enemy"></p> 
 

 
\t <button onclick="user('Stein'), enemy();">Stein</button> 
 
\t <button onclick="user('Schere'), enemy();">Schere</button> 
 
\t <button onclick="user('Papier'), enemy();">Papier</button> 
 

 
\t <p id="winner"></p> 
 

 
\t <button onclick="winner();">Gewinner</button> 
 

 
\t <script> 
 
\t \t function user(x) { 
 
\t \t \t var element_user = document.getElementById('user'); 
 
\t \t \t return element_user.innerHTML = x; 
 
\t \t } 
 

 
\t \t function enemy() { 
 
\t \t \t random_number = Math.ceil(Math.random() * 3); 
 

 
\t \t \t if (random_number == 1) { 
 
\t \t \t \t random_number = "Stein"; 
 
\t \t \t } else if (random_number == 2) { 
 
\t \t \t \t random_number = "Schere"; 
 
\t \t \t } else { 
 
\t \t \t \t random_number = "Papier"; 
 
\t \t \t } 
 
\t \t \t var element_enemy = document.getElementById('enemy'); 
 
\t \t \t return element_enemy.innerHTML = random_number; 
 
\t \t } 
 

 
\t \t function winner() { 
 
\t \t \t var user = document.getElementById('user').innerHTML; 
 
\t \t \t var winner=""; 
 
\t \t \t if (user === 'Stein' && random_number === 'Schere') { 
 
\t \t \t \t winner = "User hat gewonnen!"; 
 
\t \t \t } else if (user === 'Stein' && random_number === 'Papier') { 
 
\t \t \t \t winner = "Enemy hat gewonnen!"; 
 
\t \t \t } else if (user === 'Schere' && random_number === 'Stein') { 
 
\t \t \t \t winner = "Enemy hat gewonnen!"; 
 
\t \t \t } else if (user === 'Schere' && random_number === 'Papier') { 
 
\t \t \t \t winner = "User hat gewonnen!"; 
 
\t \t \t } else if (user === 'Papier' && random_number === 'Stein') { 
 
\t \t \t \t winner = "User hat gewonnen!"; 
 
\t \t \t } else if (user === 'Papier' && random_number === 'Schere') { 
 
\t \t \t \t winner = "Enemy hat gewonnen!"; 
 
\t \t \t } else { 
 
\t \t \t \t winner = "Unentschieden!"; 
 
\t \t \t } 
 
\t \t \t var winner_element = document.getElementById('winner'); 
 
\t \t \t winner_element.innerHTML = winner; 
 
\t \t } 
 
\t </script> 
 
</body> 
 
</html>

+0

ありがとう!これはうまくいきます! –

0

申し訳ありませんが私は英語に単語を変更した場合。私はドイツ語を理解できない?あなたはwinner()機能でやっている

var element_user = document.getElementById('user'); 
 
var element_enemy = document.getElementById('enemy'); 
 
var winner_element = document.getElementById('winner'); 
 

 
function user(x) { 
 
    return element_user.innerHTML = x; 
 
} 
 

 
function enemy() { 
 
    random_number = Math.ceil(Math.random() * 3); 
 

 
    if (random_number == 1) { 
 
    random_number = "Stein"; 
 
    } else if (random_number == 2) { 
 
    random_number = "Schere"; 
 
    } else { 
 
    random_number = "Papier"; 
 
    } 
 
    return element_enemy.innerHTML = random_number; 
 
}  
 

 
function checkWinner(user, enemy){ 
 
    if (user === enemy) { 
 
    return "Its a tie"; 
 
    } 
 

 
    if(user === "Stein"){ 
 
     if(enemy === "Papier"){ 
 
     return "Enemy wins"; 
 
     } 
 
     return "User wins"; 
 
    } 
 

 
    if(user === "Papier"){ 
 
     if(enemy === "Stein"){ 
 
      return "User wins"; 
 
     } 
 
     return "Enemy wins"; 
 
    } 
 

 
    if(user === "Schere"){ 
 
    if(enemy === "Stein"){ 
 
     return "Enemy wins"; 
 
    } 
 

 
    return "User wins"; 
 
    } 
 
} 
 

 
function winner() { 
 
    var user = element_user.innerHTML; 
 
    var enemy = element_enemy.innerHTML; 
 
    winner_element.innerHTML = checkWinner(user, enemy); 
 
}
<p id="user"></p> 
 
    <p id="enemy"></p> 
 
    
 
    <button onclick="user('Stein'), enemy();">Stein</button> 
 
    <button onclick="user('Schere'), enemy();">Schere</button> 
 
    <button onclick="user('Papier'), enemy();">Papier</button> 
 
    
 
    <p id="winner"></p> 
 
    
 
    <button onclick="winner();">Gewinner</button>

+0

ありがとうございました。それでおしまい!申し訳ありません、ドイツ語の言葉です。次回は英語の単語でコードを投稿します! –

関連する問題