亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何在不打字完整比較的情況下添加無限變化的石頭剪刀布

如何在不打字完整比較的情況下添加無限變化的石頭剪刀布

素胚勾勒不出你 2021-07-01 09:00:09
我想在玩石頭剪刀布游戲(steen, papier, schaar === rock, paper, scissor)時添加無數可供選擇的選項。我查看了 Stackoverflow 并找到了一些解決方案,但我不知道如何在我自己的代碼中實現它。這是解決方案的鏈接,沒有在我自己的代碼中實現它:let userScore = 0;let computerScore = 0;let userScore_span = document.getElementById("user-score");let computerScore_span = document.getElementById("computer-score");let scoreMessage = document.getElementById("score-message");const schaar_div = document.getElementById("schaar");const steen_div = document.getElementById("steen");const papier_div = document.getElementById("papier");// Computer choicefunction getRandomChoise() {const choises = ["schaar", "steen", "papier"];const randomNumber = Math.floor(Math.random() * choises.length);return choises[randomNumber];}function win() {userScore++;userScore_span.innerHTML = userScore;scoreMessage.innerHTML = "<span style='color: green;'>You Won!</span>";}function lose() {computerScore++;computerScore_span.innerHTML = computerScore;scoreMessage.innerHTML = "<span style='color: red;'>You Lost!</span>"}function draw() {scoreMessage.innerHTML = "It's a Draw!"}function Game(userChoise) {const computerChoise = getRandomChoise();if (userChoise + computerChoise === "steenschaar") {    win();} else if (userChoise + computerChoise === "papiersteen") {    win();} else if (userChoise + computerChoise === "schaarpapier") {    win();} else if (userChoise + computerChoise === "steenpapier") {    lose();} else if (userChoise + computerChoise === "papierschaar") {    lose();} else if (userChoise + computerChoise === "schaarsteen") {    lose();} else if (userChoise + computerChoise === "schaarschaar") {    draw();} else if (userChoise + computerChoise === "steensteen") {    draw();} else if (userChoise + computerChoise === "papierpapier") {    draw();}}function main() {schaar_div.addEventListener("click", function () {    Game("schaar");})我希望能夠為游戲添加無限數量的選項(lizzard、spock 等),而無需一遍又一遍地編寫 else if 聲明。
查看完整描述

3 回答

?
函數式編程

TA貢獻1807條經驗 獲得超9個贊

您鏈接的文章為您提供了這種剪刀石頭布的邏輯方法:


泛化 對于 n >= 3 和 n 奇數:


令 d = (n + a - b) % n。然后:


如果 d = 0 => 平局


如果 d % 2 = 1 => a 獲勝


如果 d % 2 = 0 => b 獲勝


你可以這樣實現:


// convert names to numbers

const options = {

  rock: 0,

  paper: 1,

  scissors: 2

}


// length of object

const length = Object.keys(options).length


// user input

const user = options[prompt().toLowerCase()]


// randomly generate input for opponent

const comp = Math.floor(Math.random() * Math.floor(length));


// debug

console.log(user, comp)


// conditions

const win = () => console.log('win')

const lose = () => console.log('lose')

const tie = () => console.log('tie')


// calculate output

const d = (length + user - comp) % length


// d = 0 -> tie

// d % 2 = 1 -> win

// d % 2 = 0 -> lose

d ? d % 2 ? win() : lose() : tie()

這種方法是自動擴展的;您可以在對象中再添加兩個條目,代碼將自動適應它。我將代碼提取到一個函數中,讓它更像一個游戲:


// convert names to numbers

const options = {

  rock: 0,

  paper: 1,

  scissors: 2,

  spock: 3,

  lizard: 4

}


const condition = (input, comp, condition) => {

  switch (condition) {

    case 'win':

      order = [input, comp]

      break

    case 'lose':

      order = [comp, input]

      break

    case 'tie':

      order = [input]

      break

  }

  

  console.log(`You chose ${input}, and the opponent chose ${comp},`)


  order.length > 1

    ? console.log(`${order[0]} beats ${order[1]}.`)

    : console.log(`${order[0]} cannot beat iself.`)

    

  console.log(`You ${condition}.`)

  

}



const play = (input, options) => {

  input = options[input.toLowerCase()]


  var length = Object.keys(options).length

  var comp = Math.floor(Math.random() * Math.floor(length))

  var d = (length + input - comp) % length

  

  input = Object.keys(options)[input]

  comp = Object.keys(options)[comp]

  

  condition(input, comp, d ? d % 2 ? 'win' : 'lose' : 'tie')

}



const input = prompt()

play(input, options)


查看完整回答
反對 回復 2021-07-08
?
肥皂起泡泡

TA貢獻1829條經驗 獲得超6個贊

我和喬納斯威爾姆斯有同樣的想法,但它讓我有更多時間詳細說明


const win3 = { Rock:     { e: [ 'Scissors' ], m: [ 'Rock crushes Scissors'] }

,              Paper:    { e: [ 'Rock' ],     m: ['Paper cover Rock']       }

,              Scissors: { e: [ 'Paper'],     m: ['Scissors cuts Paper']    }

            }


const win5 = { Rock:     { e: [ 'Scissors', 'Lizard'   ], m: [ 'Rock crushes Scissors', 'Rock crushes Lizard'         ] }

,              Paper:    { e: [ 'Rock'    , 'Spock'    ], m: [ 'Paper cover Rock',      'Paper disproves Spock'       ] }

,              Scissors: { e: [ 'Paper'   , 'Lizard'   ], m: [ 'Scissors cuts Paper',   'Scissors decapitates Lizard' ] }

,              Lizard:   { e: [ 'Paper'   , 'Spock'    ], m: [ 'Lizard eats Paper',     'Lizard poisons Spock'        ] }

,              Spock:    { e: [ 'Rock'    , 'Scissors' ], m: [ 'Spock vaporizes Rock',  'Spock smashes Scissors'      ] }

            }



let play          = win3  // win5 .. win1000...

,   userScore     = 0

,   computerScore = 0

;

function game ( userChoice, computerChoice )

{

  if (userChoice == computerChoice )

  {

    console.log(' same values , no one score')

    return

  }

  if (play[userChoice].includes(computerChoice) )

  {

    userScore++

    let n = play[userChoice].e.findIndex(e=>e===computerChoice )

    console.log( play[userChoice].m[n] )

  }

  else

  {

    computerScore++

    let n = play[computerChoice].e.findIndex(e=>e===userChoice )

    console.log( play[computerChoice].m[n] )

  }

}


查看完整回答
反對 回復 2021-07-08
?
RISEBY

TA貢獻1856條經驗 獲得超5個贊

您可以將兩個可能選項之間的關系表示為一棵樹:


  const winsOver = {

    schaar: ["papier"],

    steen: ["schaar"],

    papier: ["steen"],

 };

現在您的比較變得非常簡單:


 if(userChoice === computerChoice) {

   draw();

 } else if(winsOver[userChoice].includes(computerChoice)) {

   win();

 } else lose();


查看完整回答
反對 回復 2021-07-08
  • 3 回答
  • 0 關注
  • 210 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號