2016-05-05 24 views
0

コードアカデミーのコースに従う初心者として、私はロックペーパーはさみのゲームを構築する問題に遭遇しました。未定義のロックペーパーはさみのゲームを返す初心者のJavascript関数

プログラム全体を含む2つの関数を作成しましたが、2つの選択肢が異なる場合は正常に動作しますが、選択肢が同じで、なぜ理解できないのかは不明です。

選択肢が結ばれていると、新しい選択肢が異なるまで割り当てられ続け、次に異なる選択肢に対してcompare関数が呼び出され、勝利結果が返されます。

コードを修正したいのですが、コード全体を書き直すのではなく、コードカルチャーでこの演習を終えましたが、私は2つの異なる方法でそれをやろうとしています含まれる関数。あなたは再帰呼び出しの結果を返す必要が

おかげ

var makeChoices = function() { 
userChoice = ""; 
computerChoice = ""; 

userChoice = prompt("Do you choose rock, paper or scissors?"); 
computerChoice = Math.random(); 

if (computerChoice < 0.34) { 
    computerChoice = "rock"; 
} else if(computerChoice <= 0.67) { 
    computerChoice = "paper"; 
} else { 
    computerChoice = "scissors"; 
} 

console.log("Computer: " + computerChoice + " " + "User: " + userChoice); 
}; 

var compare = function(choice1, choice2) { 
    if (choice1 === choice2) { 
     makeChoices(); 
     compare(userChoice, computerChoice); 
    } 
    else if (choice1 === "rock") { 
     if (choice2 === "scissors") { 
      return "rock wins"; 
     } 
     else { 
      return "paper wins"; 
     } 
    } 
    else if (choice1 === "paper") { 
     if (choice2 === "rock") { 
      return "paper wins"; 
     } 
     else { 
      return "scissors wins"; 
     } 
    } 
    else if (choice1 === "scissors") { 
     if (choice2 === "rock") { 
      return "rock wins"; 
     } 
     else { 
      return "scissors wins"; 
     } 
    } 
    else { 
     return "invalid choice by user"; 
    } 
}; 

makeChoices(); 
compare (userChoice, computerChoice); 
+0

私は誰かからDamonが言ったように理由を知っていますが、return文はありませんが、なぜcompare関数が答えを返してくれるのかは分かりません。 誰もがこれを私が理解できる方法で説明するのを助けることができますか?ありがとう:) –

+0

私の答えの下の応答を参照してください:) – Damon

答えて

0

。私は前にこのようなゲームを作っ

... 
return compare(userChoice, computerChoice); 
... 
+0

ああありがとうDamon ...しかし、なぜですか?選択肢が異なれば、すでに結果を返す他のif文の1つにコードが落ちてはいけませんか? –

+0

@jobeはこう考えています。再帰呼び出しを行うときには、新しい関数が呼び出されます。この関数は値を返します。今度は親関数に戻りますが、その値は空間に浮かんでいますが、それで何をしたいのですか?親関数からもそれを返さなければなりません。それ以外の場合、親関数は明示的な戻り値を持たず、未定義値を返します。子が親に値を返すという理由だけで、親が自動的にその値を返すわけではありません。 – Damon

+0

ありがとう、非常に有用な方法を理解するのを助けるために:) –

0

... 
compare(userChoice, computerChoice); 
... 

を変更してみてください:

var prsStatements = { 
    paperBeatsRock: 'Paper Beats Rock', 
    rockBeatsScissors: 'Rock Beats Scissors', 
    scissorsBeatsPaper: 'Scissors Beats Paper', 
    seperator: ' - ', 
    player1: 'Player One', 
    player2: 'Player Two', 
    wins: ' Wins!', 
    tie: "It's a Tie!", 
    tally: 'Final Tally: ' 
} 
function PaperRockScissors(player1, player2){ 
    var p = /^paper$/i, r = /^rock$/i, s = /^scissors$/i, prss = prsStatements, sep = prss.seperator, win = prss.wins; 
    var pbr = prss.paperBeatsRock+sep, rbs = prss.rockBeatsScissors+sep, sbp = prss.scissorsBeatsPaper+sep; 
    var plr1 = player1 ? player1 : prss.player1; 
    var plr2 = player2 ? player2 : prss.player2; 
    var p1w = plr1+win, p2w = plr2+win; 
    this.p1 = 0; this.p2 = 0; 
    this.rand = function(){ 
    switch(Math.floor(Math.random()*3)){ 
     case 0: 
     return 'rock'; 
     case 1: 
     return 'paper'; 
     case 2: 
     return 'scissors'; 
    } 
    } 
    this.play = function(in1, in2){ 
    var i2 = in2 || this.rand(); 
    if(in1.match(p) && i2.match(r)){ 
     ++this.p1; 
     return pbr+p1w; 
    } 
    else if(i2.match(p) && in1.match(r)){ 
     ++this.p2; 
     return pbr+p2w; 
    } 
    else if(in1.match(r) && i2.match(s)){ 
     ++this.p1; 
     return rbs+p1w; 
    } 
    else if(i2.match(r) && in1.match(s)){ 
     ++this.p2; 
     return rbs+p2w; 
    } 
    else if(in1.match(s) && i2.match(p)){ 
     ++this.p1; 
     return sbp+p1w; 
    } 
    else if(i2.match(s) && in1.match(p)){ 
     ++this.p2; 
     return sbp+p2w; 
    } 
    else if(in1.match(i2r)){ 
     return prss.tie; 
    } 
    else{ 
     return this; 
    } 
    } 
    this.tally = function(){ 
    var pt = prss.tally; 
    if(this.p1 > this.p2){ 
     return pt+p1w; 
    } 
    else if(this.p2 > this.p1){ 
     return pt+p2w; 
    } 
    else{ 
     return pt+prss.tie; 
    } 
    } 
} 
var pr = new PaperRockScissors('Joe', 'Bob'); 
console.log(pr.play('paper', 'rock')); 
console.log(pr.play('rock', 'Paper')); 
console.log(pr.play('scissors', 'paper')); 
console.log(pr.play('rock', 'Paper')); 
console.log(pr.play('paper', 'rock')); 
console.log(pr.play('Paper', 'Scissors')); 
console.log(pr.play('Paper', 'paper')); 
console.log(pr.play('paper', 'Rock')); 
console.log(pr.tally()); 

あなたは単に同じように、ユーザーの入力値を渡します。このウェブ機能するようにしたい場合は:

もちろん、イベントを使用し、正しい値の 'paper'、 'rock'、または 'scissors'を渡すことができます。 "(userChoice、computerChoice)を比較;"

var pc = new PaperRockScissors('Joe', 'Comupter'); 
console.log(pc.play('paper')); 
console.log(pc.play('rock')); 
console.log(pc.play('scissors')); 
console.log(pc.play('rock')); 
console.log(pc.play('paper')); 
console.log(pc.play('Paper')); 
console.log(pc.play('Paper')); 
console.log(pc.play('paper')); 
console.log(pc.tally()); 
+0

申し訳ありません私のJavascriptの知識はあまり進歩していないとあなたのコードを理解するのは簡単ではありませんでした。 –

+0

それは素晴らしいです。あなたはこれを将来見ることができ、最初にこの質問をしてからどれくらい学んだか分かりました。 – PHPglue

0

それは同じである、あなたが持っている:

コンピュータのプレイは、次のようになります。変数userChoiceとcomputerChoiceは、makeChoices()関数で定義されています。 compare()関数では使用できません。それらをグローバル変数にすることも、compare()関数の呼び出しをmakeChoices()の最後に移動することもできます。

+0

これらはグローバル変数です。 –

0

我々は、すべての初心者であることについて心配しないでくださいあなたが降伏していない場合、あなたはすぐに教師になります!、この印象的な言語と同じように起動し、ここでは以下のこの演習のための完全なコードです:!

var userChoice = prompt("Do you choose rock, paper or scissors?"); 
var computerChoice = Math.random(); 
if (computerChoice < 0.34) { 
    computerChoice = "rock"; 
} else if(computerChoice <= 0.67) { 
    computerChoice = "paper"; 
} else { 
    computerChoice = "scissors"; 
} 
var compare = function(computerChoice, userChoice) { 
if (computerChoice===userChoice) { 
    return("The result is a tie!"); 
} 
if (userChoice === "rock"){ 
    if (computerChoice === "paper") { 
return("paper wins"); 
} 
else if (computerChoice === "scissors") { 
    return("rock wins"); 
} 
} 
if (userChoice === "scissors") { 
    if (computerChoice==="paper") { 
     return("scissors wins"); 
} 
else if (computerChoice === "rock") { 
    return("rock wins"); 
     } 
    } 
if (userChoice === "rock") { 
if (computerChoice==="scissors") { 
    return "rock wins"; 
} 
else if (computerChoice=== "paper") { 
    return "paper wins"; 
} 
} 
if (userChoice === "paper") { 
if (computerChoice ==="scissors") { 
    return "scissors wins"; 
} 
else if (computerChoice==="rock") { 
    return "paper wins"; 
    } 
    } 
}; 
compare(); 
は、
+0

ありがとうございましたCesar前に、私は元のコメントを明確にする必要があります、私は選択肢と比較の両方の機能を作成するコードを開発しようとしました。なぜ私はそれを構造化しようとした新しい方法で動作していないのか理解しようとしています。 –

関連する問題