我试图通过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()?
答案 0 :(得分:20)
您可以尝试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(' ')]();
答案 1 :(得分:6)
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;
但我想有一个更好的算术解决方案来检测你所追求的模式。这会更短更快,但我不确定这个片段到底应该做什么。
答案 2 :(得分:1)
这不会像你拥有的那样工作,但是你可以使用sortedHand.join(',')
并将它与[1,1,1,2,5].join(',')
进行比较,它将比较两个数组,如果它们的内容完全相同则应该为真(Be小心number
输入为strings
!)
公平地说,我无法想象为什么你会这样设计你的逻辑。即使是简单的纸牌游戏也有数十万种可能的牌。您可以使用underscore.js
的集合管理功能做得更好,因为它会更简单,只是更好的做法。
答案 3 :(得分:1)
更快,可能可重用且更灵活的方法是使用对象而不是大小写:
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"); }
当一个输出铰接在一个输入上时,对象工作得很好。如果你需要在每种情况下做五件事,那么你必须使用大小写,但如果你只需要X转为Y,(1:1),那么以对象形状查找表是理想的。
我认为RegExp可以在这里工作,我在连接4游戏中使用它们来识别连续4个,但上面的逻辑表应该比你描述的更好或更好。
答案 4 :(得分:1)
普通牌组中有5种牌可能有1274种组合。将它们全部列在switch语句中是完全荒谬的。为什么不让一个函数计算任何重复项来检查2,3,4-a-kind然后检查直道? (你的阵列没有显示西装,所以我假设你要把它留下来。)
但如果你真的想这样做,你可以使用一个字符串。字符串与开关一起使用,您甚至可以像数组一样使用它们。例如“123”[0] =='1'。您可以像parseInt一样来回更改用户函数。
答案 5 :(得分:0)
由于没有人建议这样做,请使用for循环并精确计算给定值的卡数。有了这样的功能,您可以调用'cardCount = count(sortedHand,cardNumber)'。当然,遍历所有可能的卡号将为您提供帮助。
由于给定玩家只能拥有1x2、2x2、1x3、1x3 + 1x2、1x4或直线/街道,因此您可以返回所有命中值的数组,这些数组是表示对象数和涉及的cardNumber的数组/对象。因此,[{2,5},{3,6}]可以容纳一整个房子。