【问题标题】:Switch statements always executing on the first choiceSwitch 语句总是在第一个选项上执行
【发布时间】:2021-07-18 19:00:54
【问题描述】:

我正在尝试创建一个石头、纸、剪刀的游戏。问题是我的 switch 语句总是在第一个选项上执行。 即传递一个值 (摇滚,电脑)总是产生“你赢了!” (剪刀,电脑)返回“它是领带” (纸,电脑)返回“你输了”

我正在运行一组大约 10 个十个测试,我注意到 switch 语句根据我的输出肯定是错误的。

有什么想法吗?提前致谢

var computer = Math.random()

function game(user, computer)
{
    if (computer < .34)
    {
      computer = "rock";
    }

    else if (computer > .33 && computer < .67)
    {
      computer = "paper";
    }

    else 
    {
      computer = "scissors";
    }
    let result = ""; 

    if (user === "rock")
    {
      switch(computer) 
      {
        case "scissors":
          result = "you win!";
          break;

        case "paper":
          result = "you lose";
          break;

        case "rock":
        result = "its a tie";
        break;
      }
    
    return result;
    }

    else if (user === "paper")
    {
      switch(computer) 
      {
        case "scissors":
          result = "you lose!";
          break;

        case "paper":
          result = "its a tie";
          break;

        case "rock":
          result =  "you win!";
          break;
      }
      return result;
    }


    if (user === "scissors")
    {
      switch(computer)
       {
        case "scissors":
          result = "its a tie";
          break;

        case "paper":
          result =  "you win!";
          break;

        case "rock":
          result = "you lose!";
          break;
      }

      return result;
    }   
}```


describe('gameFunction', ()=>{
    it('return win, lose or tie', ()=>{
        expect(functions.game('rock', 'scissors')).toBe('you win!');
    })
    it('return win, lose or tie', ()=>{
        expect(functions.game('rock', 'paper')).toBe('you lose!');
    })
    it('return win, lose or tie', ()=>{
        expect(functions.game('rock', 'rock')).toBe(`it's a tie`);
    })
    it('return win, lose or tie', ()=>{
        expect(functions.game('paper', 'rock')).toBe(`you win!`);
    })
    it('return win, lose or tie', ()=>{
        expect(functions.game('paper', 'scissors')).toBe(`you lose!`);
    })
    it('return win, lose or tie', ()=>{
        expect(functions.game('paper', 'paper')).toBe(`it's a tie`);
    })
    it('return win, lose or tie', ()=>{
        expect(functions.game('scissors', 'paper')).toBe(`you win!`);
    })
    it('return win, lose or tie', ()=>{
        expect(functions.game('scissors', 'rock')).toBe(`you lose!`);
    })
});

【问题讨论】:

  • 请告诉我们你打电话给game的那十个测试。你真的为computer 参数传递了一个数字吗?
  • 您是否将实际数字作为第二个参数传递?否则,您的 if 测试将失败,并且函数内部的 computer 将始终分配为 scissors
  • 你为计算机传递了什么值?在您的所有测试中,计算机的值似乎都大于 0.67。
  • 我已更新以显示测试以及我在顶部声明计算机的位置作为每次调用的随机数。
  • 为什么您使用 if else 语句将其与 .34、.33、.67 进行比较?你的问题就在那里。

标签: javascript switch-statement


【解决方案1】:

在您的测试中,您传入一个字符串作为第二个 (computer) 参数。例如,这个测试通过了“剪刀”:

   it('return win, lose or tie', ()=>{
        expect(functions.game('rock', 'scissors')).toBe('you win!');
    })

但您的 game 函数需要一个数字(由 Math.random() 生成)。

混淆可能与您声明一个名为computer的全局变量有关:

var computer = Math.random()

但是,当您使用相同的标识符作为函数的参数名称时,您的函数对该全局变量不可见。也就是说,函数内对computer 的任何引用都将引用名为computer参数,而不是您声明的名为computer 的全局变量。

解决此问题的一种方法是在测试中将数字传递给您的函数:

 it('return win, lose or tie', ()=>{
        expect(functions.game('rock', 0.1)).toBe('you win!');
 })

【讨论】:

    【解决方案2】:

    虽然您正在使用随机函数为计算机变量生成随机数,但您使用错误。虽然它是全局的,但由于我们在游戏函数中将计算机作为参数,因此将使用该变量。

    它会考虑你传递给它的那些值。

    例如: 在此调用 expect(functions.game('rock', 'scissors')).toBe('you win!'); 中,您正在为计算机变量传递剪刀。您的函数会将scissors.34.33.67 进行比较。在这种情况下,这些检查将始终为 false,否则将执行部分。

    您需要传递随机变量的值,而不是 rockscissorspaper 作为函数中的第二个参数。

    【讨论】:

      猜你喜欢
      • 2010-11-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多