【问题标题】:Using an array through a switch() statement in Javascript通过 Javascript 中的 switch() 语句使用数组
【发布时间】:2023-03-22 09:18:01
【问题描述】:

我正在尝试通过 Javascript 开发一个简化的扑克游戏。我列出了给定玩家手中所有可能的牌组合,按其价值排序,如下所示:

switch(sortedHand)
{           
 //Pair
     case [1,1,4,3,2]: sortedHand.push(1,"Pair"); break;
     case [1,1,5,3,2]: sortedHand.push(2,"Pair"); break; 
     case [1,1,5,4,2]: sortedHand.push(3,"Pair"); break;
     case [1,1,5,4,3]: sortedHand.push(4,"Pair"); break;
     case [1,1,6,3,2]: sortedHand.push(5,"Pair"); break;
     case [1,1,6,4,2]: sortedHand.push(6,"Pair"); break;
     case [1,1,6,4,3]: sortedHand.push(7,"Pair"); break;
     case [1,1,6,5,2]: sortedHand.push(8,"Pair"); break;
     case [1,1,6,5,3]: sortedHand.push(9,"Pair"); break;
     case [1,1,6,5,4]: sortedHand.push(10,"Pair"); break;

即使“sortedHand”数组成功地存储了值(正如我通过 console.log 看到的那样),switch() 语句总是返回默认情况,并且每个人都得到了同花顺。我担心这是我用来声明可能的数组值与整个“sortedHand”进行比较的文字方法的问题,但我不知道更好。甚至可以以这种方式使用 switch() 吗?

【问题讨论】:

  • case (Array) 将永远为假...

标签: javascript arrays switch-statement


【解决方案1】:

您可以在数组的文本表示上尝试switching。

switch(sortedHand.join(' '))
{           
    //Pair
    case '1 1 4 3 2': sortedHand.push(1,"Pair"); break;
    case '1 1 5 3 2': sortedHand.push(2,"Pair"); break; 
    case '1 1 5 4 2': sortedHand.push(3,"Pair"); break;
    case '1 1 5 4 3': sortedHand.push(4,"Pair"); break;
    // etc.
}

作为直接指定每种情况的替代方案,也许使用对象构建函数调度表并完全摆脱开关。

var dispatch = {};

// Build the table however you'd like, for your application
for (var i = 0; i < 10; i++) {
    (function(i) {
        var hand = ...; // Add your hand logic here
        dispatch[hand] = function() { sortedHand.push(i, "Pair"); };
    })(i);
}

// Execute your routine
dispatch[sortedHand.join(' ')]();

【讨论】:

    【解决方案2】:

    switch() 语句总是返回默认情况

    这是因为比较不检查数组内容,而是检查数组对象本身。对象根据它们的身份被认为是相等的,因此没有什么会等于由文字实例化的对象。

    甚至可以以这种方式使用 switch() 吗?

    是的,可以在switch 语句中使用对象,但在这种情况下您必须使用引用。不适用于您的问题。

    在你的情况下,我建议进行字符串化:

    switch(sortedHand.join())
    {           
     //Pair
         case "1,1,4,3,2": sortedHand.push(1,"Pair"); break;
         case "1,1,5,3,2": sortedHand.push(2,"Pair"); break; 
         case "1,1,5,4,2": sortedHand.push(3,"Pair"); break;
         case "1,1,5,4,3": sortedHand.push(4,"Pair"); break;
         case "1,1,6,3,2": sortedHand.push(5,"Pair"); break;
         case "1,1,6,4,2": sortedHand.push(6,"Pair"); break;
         case "1,1,6,4,3": sortedHand.push(7,"Pair"); break;
         case "1,1,6,5,2": sortedHand.push(8,"Pair"); break;
         case "1,1,6,5,3": sortedHand.push(9,"Pair"); break;
         case "1,1,6,5,4": sortedHand.push(10,"Pair"); break;
    

    但我想有一个更好的算术解决方案来检测您所追求的模式。那会更短更快,但我不确定这个 sn-p 到底应该做什么。

    【讨论】:

      【解决方案3】:

      一种更快、可能可重用且更灵活的方法是使用对象而不是大小写:

      var ok= {
          '1 1 4 3 2':1,
          '1 1 5 3 2':2,
          '1 1 5 4 2':3,
          '1 1 5 4 3':4
      }[ sortedHand.join(' ') ] ;
      if(ok){ sortedHand.push( ok ,"Pair"); }
      

      当一个输出取决于一个输入时,对象会很好地工作。如果你需要在每种情况下做五件事,那么你必须使用case,但如果你只需要X变成Y,(1:1),对象形状的查找表是理想的。

      我想 RegExp 可以在这里工作,我在 connect4 游戏中使用它们来连续识别 4 个,但上面的逻辑表应该和你描述的一样好或更好。

      【讨论】:

        【解决方案4】:

        这不会像你所拥有的那样工作,但你可以使用sortedHand.join(',') 并将其与[1,1,1,2,5].join(',') 进行比较,这将比较两个数组并且如果它们的内容完全相同则应该是正确的(注意@987654323 @s 输入为strings!) 不过,公平地说,我无法想象你为什么要这样设计你的逻辑。即使是简单的纸牌游戏也有数十万种可能的手牌。使用underscore.js 的集合管理功能可能会做得更好,因为它会更简单,而且只是一种更好的做法。

        【讨论】:

          【解决方案5】:

          一副普通牌组中有 5 张牌的 1274 种可能组合。在 switch 语句中将它们全部列出是完全荒谬的。为什么不只使用一个函数来计算任何重复项以检查 2、3、4 种类型,然后检查顺子? (您的数组不适合,所以我假设您将其排除在外)。

          但如果你真的想这样做,你可以使用字符串。字符串与开关一起使用,您甚至可以像数组一样使用它们。例如“123”[0] == '1'。您可以像 parseInt 这样的用户函数来回更改它们。

          【讨论】:

          • 你说得对,我把他们排除在外了。甲板仅由六个等级组成,总共有250个可能性。我使用了 switch 方法,因为我还没有弄清楚手牌组合与其结果分数之间的算术关系。
          【解决方案6】:

          由于没有人建议这样做,因此请使用 for 循环并计算具有给定值的卡片的数量。拥有这样的功能,您可以调用“cardCount = count(sortedHand, cardNumber)”。当然,遍历所有可能的卡号会让你得到手。

          由于给定玩家只能有 1x2、2x2、1x3、1x3+1x2、1x4 或直道/街道,您可以返回一个包含所有命中数的数组/对象,说明计数和所涉及的卡号。所以 [{2, 5}, {3, 6}] 是满堂彩。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2013-09-24
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2023-03-15
            • 1970-01-01
            • 1970-01-01
            • 2021-12-10
            相关资源
            最近更新 更多