13

I'm trying to develop a simplified poker game through Javascript. I've listed all possible card combinations a given player might have in its hand ordered by its value, like this:

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;

Even though the "sortedHand" array stores values succesfully (as I've seen through console.log), the switch() statement always returns the default case, and everyone gets an straight flush. I fear this is a matter of the literal approach I've used to declare possible array values to be compared with the whole of "sortedHand", but I don't know any better. Is it even possible to use switch() in such a manner?

4

6 回答 6

25

您可以尝试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;
    // 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(' ')]();
于 2013-07-23T18:31:52.607 回答
7

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;

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

于 2013-07-23T18:32:36.447 回答
2

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

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 个,但上面的逻辑表应该和你描述的一样好或更好。

于 2013-07-23T18:34:20.657 回答
1

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

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

于 2013-07-23T18:46:14.233 回答
1

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

于 2013-07-23T18:32:54.713 回答
0

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

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

于 2018-08-11T21:49:33.613 回答