簡體   English   中英

剪刀石頭布游戲(js)-如何創建圓形函數

[英]Rock Paper Scissors Game (js) - How can to create a round function

問題

  • 在playRound函數中,我返回一個函數,一旦結果對象等於5(應轉換為5個回合),該函數應停止。 但是,它只會玩一個游戲,然后在您嘗試再次玩游戲時; 它反復記錄領帶。

這是我嘗試過的

我只使用了convertMoves()函數,而不在返回函數中同時使用了我的playRound()函數

預期成績

回答提示后,我不希望它記錄日志,而是有意義的不同結果。 它不應該總是“ tie”,“ tie”,“ tie”,而應該是“ win”,“ tie”,“ lose”,“ win”,“ tie”

  var moves, result; moves = { rock: 0, paper: 1, scissors: 2, }; result = { win: 0, tie: 0, lose: 0 }; function convertMoves() { playerSelection = prompt('Please choose rock, paper, or scissors').toLowerCase(); return moves[playerSelection]; } function computerPlay() { var movesValues = Object.values(moves); var random = Math.floor(Math.random() * movesValues.length); return movesValues[random]; } function playRound(playerSelection, computerSelection) { var processResult = (3 + computerSelection - playerSelection) % 3; if (!processResult) { ++result.tie; console.log('tie'); } else if (1 == processResult) { ++result.lose; console.log('You lost'); } else { ++result.win; console.log('You won'); } return function() { var rounds = 0; var resultValues = Object.values(result); for (var i = 0; i < resultValues.length; i++) { rounds += resultValues[i]; } console.log(rounds); if (rounds !== 5) { convertMoves(); playRound(playerSelection, computerSelection)(); } return result; } } var computerSelection = computerPlay(); var playerSelection = convertMoves(); console.log(playRound(playerSelection, computerSelection)()); 

playerSelection只是undefined因為在閉包函數中一次設置后,其值不會更新。 通過執行此playerSelection = convertMoves(); 它的工作現在被罰款。 希望這能解決您的問題。

 var moves, result; moves = { rock: 0, paper: 1, scissors: 2, }; result = { win: 0, tie: 0, lose: 0 }; function convertMoves() { playerSelection = prompt('Please choose rock, paper, or scissors').toLowerCase(); return moves[playerSelection]; } function computerPlay() { var movesValues = Object.values(moves); var random = Math.floor(Math.random() * movesValues.length); return movesValues[random]; } function playRound(playerSelection, computerSelection) { debugger var processResult = (3 + computerSelection - playerSelection) % 3; if (!processResult) { ++result.tie; console.log('tie'); } else if (1 == processResult) { ++result.lose; console.log('You lost'); } else { ++result.win; console.log('You won'); } return function() { var rounds = 0; var resultValues = Object.values(result); for (var i = 0; i < resultValues.length; i++) { rounds += resultValues[i]; } console.log(rounds); if (rounds !== 5) { playerSelection = convertMoves(); playRound(playerSelection, computerSelection)(); } return result; } } var computerSelection = computerPlay(); var playerSelection = convertMoves(); console.log(playRound(playerSelection, computerSelection)()); 

您的代碼存在的問題:

  • 您只調用一次computerPlay,然后在所有其他回合中使用相同的值。

  • 您有兩個不同的playerSelection變量,一個在最外層范圍中聲明,另一個是playRound的參數。

  • 在調用playRound之前,您調用了convertMoves,但是不使用返回值,而是傳遞了函數已接收的相同參數。

一些技巧:

  • 避免在全局范圍內聲明變量。
  • 避免在函數的外部作用域中設置變量的值,最好返回該值並讓調用者決定如何處理它。
  • 盡量不要在同一函數中做太多事情。 playRound在計算一個回合的結果,但它還返回運行另外5個回合的函數。 也許最好讓playRound玩一輪,然后循環調用5次?

通過閉包間接使用遞歸的方式會引起這種麻煩-尤其是因為這不是通常需要使用遞歸的問題。

解決您問題的快速方法是在每次迭代中調用選擇函數。

通過不傳遞不必要的參數,我對此進行了一些簡化。 我還添加了一條日志消息,以演示如何調試此消息。

您可以通過取消遞歸來進一步簡化它。 請注意,當您在頂層調用playRound()()時,它實際上是在玩所有回合。

  var moves, result; moves = { rock: 0, paper: 1, scissors: 2, }; result = { win: 0, tie: 0, lose: 0 }; function convertMoves() { playerSelection = prompt('Please choose rock, paper, or scissors').toLowerCase(); return moves[playerSelection]; } function computerPlay() { var movesValues = Object.values(moves); var r = Math.random() var random = Math.floor(r * movesValues.length); //console.log(r,movesValues.length,random) return movesValues[random]; } function playRound() { // call the *choice* functions var c = computerPlay() var p = convertMoves() console.log(c,p) // *** debugging *** var processResult = (3 + c - p) % 3; if (!processResult) { ++result.tie; console.log('tie'); } else if (1 == processResult) { ++result.lose; console.log('You lost'); } else { ++result.win; console.log('You won'); } return function() { var rounds = 0; var resultValues = Object.values(result); for (var i = 0; i < resultValues.length; i++) { rounds += resultValues[i]; } console.log("rounds:",rounds) if (rounds !== 5) { playRound()(); // *** recursion *** } return result; } } console.log(playRound()()); 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM