“比”更好的方法;开关";在javascript中

“比”更好的方法;开关";在javascript中,javascript,Javascript,我对javascript非常陌生,我有一个小问题 作为我的第一个“项目”,我希望我的程序能给我一张随机的扑克牌。没什么了不起的,但我正试图想出一个优雅的方法来做。 到目前为止,我唯一的想法是给一张特定的卡一个介于1和52之间的随机数,但肯定有更好的方法 这是我目前的代码: function newCard() { var card_id = document.getElementById("card_id"); var c1 = Math.floor(Math.random() * 52) +

我对javascript非常陌生,我有一个小问题

作为我的第一个“项目”,我希望我的程序能给我一张随机的扑克牌。没什么了不起的,但我正试图想出一个优雅的方法来做。 到目前为止,我唯一的想法是给一张特定的卡一个介于1和52之间的随机数,但肯定有更好的方法

这是我目前的代码:

function newCard() {
var card_id = document.getElementById("card_id");
var c1 = Math.floor(Math.random() * 52) + 1;
switch(c1) {
    case 1:
        c1 = "ace of spades";
        break;
    case 2:
        c1 = "2 of spades";
        break;
    case 3:
        c1 = "3 of spades";
        break;  


    // ...I think you get the idea here


         } 

card_id.innerHTML = c1;
}
你有什么提示给我,如何让这更快/更好吗?

函数newCard(){
//从0选择到51,而不是从1选择到52
var cardd=Math.floor(Math.random()*52);
变量等级=[“A”、“2”、“3”、“4”、“5”、“6”、“7”、“8”、“9”、“10”、“杰克”、“女王”、“国王”];
var套装=[“黑桃”、“红心”、“钻石”、“梅花”];
//%是模运算符,因此0=>0,1=>1,…12=>12,13=>0,14=>1。。。
//数学。地板(cardId/13)得到西装(0,1,2,3)
返回等级[CardD%13]+“of”+套装[Math.floor(CardD/13)];
}
对于(变量i=0;i<10;i++){
log(newCard());
}
这里有一个想法:

var deck = ['ace of spades', 'two of spades', 'three of spades', '...']; 
// and so on, all 52 cards
var rand = Math.floor(Math.random() * 52);

console.log(deck[rand]); // will print a random card from the deck
或者,如果你想继续“游戏”,你也可以从牌组中移除抽出的牌

在此之后,您需要为较小的甲板重新生成随机数据:

rand = Math.floor(Math.random() * deck.length); 

这是一个有趣的问题。以下是我的想法。。。数字卡从2到9。如果我们继续使用整数作为卡值,杰克、皇后、国王和ace可以分别表示为10、11、12和13

但当然,我们有四种价值观,每种价值观都以四种诉讼的形式存在。一个快速的谷歌显示,在英语国家,西装的相对价值可以从最低到最高排列为梅花、钻石、红桃和黑桃。因此,我们可以说2-13是梅花,14-25是钻石,26-37是红桃,28-49是黑桃。按照这个公式,你的随机数应该在2到49之间


因此,考虑到这一点,您可以编写一个函数,根据生成的数字进行一些数学运算,以确定确切的卡片。显然,你不能对同一张牌发两次牌,所以一旦生成一个数字,它就应该存储在一个已发牌数组中。每次生成一个数字时,您都需要检查该数字是否在已发牌数组中。如果是,您将希望生成另一个数字。我有一个关于设置和检查此阵列的方法的想法。如果你认为我的想法值得追求,让我知道,我会把它添加到这个答案中

我将创建一个包含所有卡片的数组,作为套装和等级的对象(使用嵌套的forEach循环,以方便对套装和等级数组进行迭代),然后使用随机数生成卡片id。这将给出该卡片的等级和等级。然后我从牌组中取出这张牌——以防止它被发两次,并减少可用牌的数量)。这样做意味着所选的卡是随机的,不会重复。我还设置了一个按钮,可以重置所有的牌,并允许进一步处理10张牌

var-deck=[];
函数setCards(){
var套装=[“黑桃”、“红心”、“钻石”、“梅花”];
变量等级=[“A”、“2”、“3”、“4”、“5”、“6”、“7”、“8”、“9”、“10”、“杰克”、“女王”、“国王”];
//创建具有“等级”和“适合”属性的卡片对象数组
//例如:牌组=[{套装:“黑桃”,等级:“王牌”},{套装:“黑桃”,等级:“2”},…]
套装。forEach(功能(套装){
等级。forEach(函数(等级){
var-card={};
card.suit=套装;
card.rank=等级;
扑克牌;
});
});
}
功能新卡(计数){
//减少牌组的数量,因为一些牌已经发了
var剩余卡=52-计数;
var index=Math.floor(Math.random()*剩余卡片);
var卡=卡片组[索引];
deck.splice(索引,1);//从卡组中删除所选卡
回程卡;
}
函数dealCards(){
document.getElementById('hand').innerHTML='MyHand';
setCards();
对于(变量i=0;i<10;i++){
var卡=新卡(i);
document.getElementById('hand')。innerHTML+='+card.suit+''的''+card.rank+'';
}
}
交易新手


您应该使用几个阵列,一个用于西装,一个用于1-10jqk,一个用于甲板。。。查看检查是否,下面的链接可以帮助您。非常感谢你!这真是一个好方法:Dwhilst我喜欢这样-我想知道是否应该有一种机制来防止选择同一张牌-由于相同的随机数,两张随后的抽签选择同一张牌并非不可能。因此,一方面,选择钻石中的2颗应该会从后续的抽牌中删除该选项-这将非常简单,只需创建一个选定卡片对象(编号和套色)的数组,并在选择后但在显示选择之前对其进行检查。然后,如果该牌存在于阵列中-重新绘制随机数等。对于使用非无限牌组的游戏,典型的解决方案是将牌组向前洗牌,然后从洗牌组中抽牌。@gavgrif检查下面的答案。谢谢。如果我没弄错的话,在第一张牌被“抽”之前,用这个代码,牌组被设置在一个预洗牌的位置,然后给你第二张,第三张,第四张,等等。牌的顺序如下。是这样吗?嘿,如果不费多大力气的话,我很想看看这个!看看我对我的解决方案所做的编辑,它显示了一种处理一副牌的更典型的方法。(在前面洗牌。)“抽一张牌,如果是重复的,再抽一张”效率很低。。。当牌组耗尽时,抽一张新牌需要越来越长的时间,理论上,这并不能保证你会成功!最好跟踪剩余的可用卡,并始终从该池中抽取。费舍尔·耶茨洗牌基本上就是这么做的。很好@罗宾,我同意斯马克斯的回答。我将投票表决。嗨,也谢谢你的代码:)。你能解释一下吗
rand = Math.floor(Math.random() * deck.length);