【问题标题】:Game counter for a JavaScript Rock Paper Scissors Game is not workingJavaScript 石头剪刀布游戏的游戏计数器不工作
【发布时间】:2018-10-30 04:06:42
【问题描述】:

我创建了一个在控制台中玩 5 轮的 Rock Paper Scissors 游戏,现在我正在尝试将其重构为在带有按钮的浏览器中使用 DOM 操作。

按钮和圆形功能分别是:

rock_btn.addEventListener('click',function(){
round('rock');
})

paper_btn.addEventListener('click',function(){
round('paper');
})

scissors_btn.addEventListener('click',function(){
round('scissors');
})


function round (playerSelection) {
let computerSelection = computerPlay();
if (playerSelection === 'rock' && computerSelection === 'scissors') {
        playerScore++
        userScore_span.innerHTML = playerScore;
        result_div.innerHTML = 'You Win\! Rock beats Scissors\!';
    } else if (playerSelection === 'scissors' && computerSelection === 'rock') {
        computerScore++;
        compScore_span.innerHTML = computerScore;
        result_div.innerHTML = 'You Lose\! Rock beats Scissors\!';
    } else if(playerSelection === 'paper' && computerSelection === 'rock') {
        playerScore++;
        userScore_span.innerHTML = playerScore;
        result_div.innerHTML ='You Win\! Paper beats Rock\!';
    } else if(playerSelection === 'rock' && computerSelection === 'paper') {
        computerScore++;
        compScore_span.innerHTML = computerScore;
        result_div.innerHTML = 'You Lose\! Paper beats Rock\!';
    } else if(playerSelection === 'scissors' && computerSelection === 'paper') {
        playerScore++;
        userScore_span.innerHTML = playerScore;
        result_div.innerHTML ='You Win\! Scissors beats Paper\!';
    } else if(playerSelection === 'paper' && computerSelection === 'scissors') {
        computerScore++;
        compScore_span.innerHTML = computerScore;
        result_div.innerHTML = 'You Lose\! Scissors beats Paper\!';
    } else {
        result_div.innerHTML = ('A draw! Please play again!');
    }
}

用于计算回合数的游戏函数在控制台中调用时有效,但现在无效:

let playerScore = 0;
let computerScore = 0;

function game () {
while (playerScore <= 5 || computerScore <= 5) {
round();
if(playerScore === 5) {
    result_div.innerHTML = 'Player Wins!!!';
}
if(computerScore === 5) {
    result_div.innerHTML = 'Computer Wins!!!';
    }
    }
}

有人可以告诉我如何将游戏功能插入序列中以便计数器工作吗?

【问题讨论】:

    标签: javascript function dom while-loop


    【解决方案1】:

    欢迎来到 Stackoverflow。

    由于您依赖 DOM 上的按钮来玩游戏,因此您应该在我们的 round 函数结束时检查获胜条件:

    获胜条件:

    function win_condition () {
      if(playerScore === 5) {
        result_div.innerHTML = 'Player Wins!!!';
      }
      if(computerScore === 5) {
        result_div.innerHTML = 'Computer Wins!!!';
      }
    }
    

    在您的 round 函数中:

    ...
    
    else if(playerSelection === 'paper' && computerSelection === 'scissors') {
            computerScore++;
            compScore_span.innerHTML = computerScore;
            result_div.innerHTML = 'You Lose\! Scissors beats Paper\!';
        } else {
            result_div.innerHTML = ('A draw! Please play again!');
        }
    
      win_condition();
    }
    

    您可以通过DRYing 重构您的一些代码,也许将规则抽象掉(即石头战胜剪刀但输给纸等)
    我在另一个帖子上做了类似的事情。 See this CodePen:

    • 第 66 到 79 行定义了获胜条件;
    • 第 93 到 99 行如何使用。

    请注意,它位于 ReactJS,因此您需要稍微不同地应用它,但原则不变:抽象逻辑并干燥您的代码。

    (顺便说一句:全局可变状态最终会咬你一口,making your functions pure 会大大改进你的代码)

    【讨论】:

    • 不客气。如果它解决了您的问题,您可以接受答案。
    • the other Stackoverflow post 我在引用。
    • 谢谢,老实说,我一直在考虑 switch 语句,但我更关心的是让事情先工作!非常同意 DRYing,不过我对此有点新意,是否有任何文章或资源可以推荐,只是为了提供一个体面的参考框架?
    • 太好了:首先是 KISS 方法(即让它工作),然后是优化。 Early optimization 是一种反模式。
    • 我会先尝试在您的示例中使用更多函数,然后尝试使它们成为纯函数(即您使用的所有内容都必须作为参数传递以快速说明,但您应该阅读Mostly Adequate book我参考过)。 Do Factory book on design pattern in javascript 也是一本好书。我还会通过Angular's tutorial 这是一个现代 JS 框架,并尝试 ReactJS,另一个现代前端框架。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-16
    • 2022-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多