SOURCE

var cards = {
    1:{1:[1,1,2,2,3,3,4,4],2:[1,1,2,2,3,3,4],3:[1,1,2,2,3,4,4],4:[1,1,2,3,3,4,4],5:[1,2,2,3,3,4,4],
        6:[2,2,3,3,4,4],7:[1,1,3,3,4,4],8:[1,1,2,2,4,4],9:[1,1,2,2,3,3],10:[1,2,3,3,4,4],11:[1,2,2,3,4,4],
        12:[1,2,2,3,3,4],13:[1,1,2,3,4,4],14:[1,2,2,3,3,4],15:[1,1,2,2,3,4],
        },                   //A
    2:[5,5,6,6,7,7,8,8],                    //2
    3:[9,9,10,10,11,11,12,12],              //3
    4:[13,13,14,14,15,15,16,16],            //4
    5:[17,17,18,18,19,19,20,20],            //5
    6:[21,21,22,22,23,23,24,24],            //6
    7:[25,25,26,26,27,27,28,28],            //7
    8:[29,29,30,30,31,31,32,32],            //8
    9:[33,33,34,34,35,35,36,36],            //9
    10:[37,37,38,38,39,39,40,40],           //10
    11:[41,41,42,42,43,43,44,44],           //J
    12:[45,45,46,46,47,47,48,48],           //Q
    13:[49,49,50,50,51,51,52,52],           //K
    14:[53,53,54,54]                        //大小王
};

// var cardsNew = 
// [
//     1,1,2,2,3,3,4,4,
//     5,5,6,6,7,7,8,8,
//     9,9,10,10,11,11,12,12,
//     13,13,14,14,15,15,16,16,
//     17,17,18,18,19,19,20,20,
//     21,21,22,22,23,23,24,24,
//     25,25,26,26,27,27,28,28,
//     29,29,30,30,31,31,32,32,
//     33,33,34,34,35,35,36,36,
//     37,37,38,38,39,39,40,40,
//     41,41,42,42,43,43,44,44,
//     45,45,46,46,47,47,48,48,
//     49,49,50,50,51,51,52,52,
//     53,53,54,54
// ];
//console.log(JSON.stringify(cards[14]));

// var randnum = Math.floor(Math.random() * (13 - 1 + 1)) + 1;
// console.log(randnum);

var maxZhaDanCount = 14;
var ACards = [];
var randNus = [];
//概率 3,3,3,3(炸弹)
//第一个玩家随机炸弹概率
var AzhanDanRand = Math.floor(Math.random() * (3 - 1 + 1)) + 1;
console.log("A炸弹概率============================"+AzhanDanRand);
//console.log(JSON.stringify(Acards));
for(var i = 0;i < AzhanDanRand;i++)
{
    var randNum = Math.floor(Math.random() * (14 - 1 + 1)) + 1;
    var a = randNus.indexOf(randNum);
    if(randNus.indexOf(randNum) > -1)
    {
        for(var j = 0;j <1000;j++)
        {
            randNum = Math.floor(Math.random() * (14 - 1 + 1)) + 1;
            if(randNus.indexOf(randNum) == -1)
            {
                randNus.push(randNum);
                for(var j = 0; j <cards[randNum].length;j++)
                {
                    ACards.push(cards[randNum][j]);
                } 
                 break;
            }
               
        }
        
    }
    else
    {
        randNus.push(randNum);
        for(var j = 0; j <cards[randNum].length;j++)
        {
            ACards.push(cards[randNum][j]);
        }
    }  
}
console.log(JSON.stringify(ACards));
//console.log("randNus========A==========="+JSON.stringify(randNus));
//cards = tmpCards;

var BCards = [];
//var randNus = [];
//概率 4,4,3,3(炸弹)
//第二个玩家随机炸弹概率
var BzhanDanRand = Math.floor(Math.random() * (3 - 1 + 1)) + 1;
console.log("B炸弹概率============================"+BzhanDanRand);
for(var i = 0;i < BzhanDanRand;i++)
{
    var randNum = Math.floor(Math.random() * (14 - 1 + 1)) + 1;
     var b = randNus.indexOf(randNum);
    if(randNus.indexOf(randNum) > -1)
    {
        for(var j = 0;j <10000;j++)
        {
            randNum = Math.floor(Math.random() * (14 - 1 + 1)) + 1;
            if(randNus.indexOf(randNum) == -1)
            {
                randNus.push(randNum);
                for(var j = 0; j <cards[randNum].length;j++)
                {
                    BCards.push(cards[randNum][j]);
                }
                break;
            }  
        }  
    }
    else
    {
        randNus.push(randNum);
        for(var j = 0; j <cards[randNum].length;j++)
        {
            BCards.push(cards[randNum][j]);
        }
    }

    
    
}

console.log(JSON.stringify(BCards));
console.log("randNus========B==========="+JSON.stringify(randNus));

var CCards = [];
//var randNus = [];
//概率 4,4,3,3(炸弹)
//第三个玩家随机炸弹概率
var CzhanDanRand = Math.floor(Math.random() * (3 - 1 + 1)) + 1;
console.log("C炸弹概率============================"+CzhanDanRand);
for(var i = 0;i < CzhanDanRand;i++)
{
    var randNum = Math.floor(Math.random() * (14 - 1 + 1)) + 1;
    var c = randNus.indexOf(randNum);
    if(randNus.indexOf(randNum) > -1)
    {
        for(var j = 0;j <10000;j++)
        {
            randNum = Math.floor(Math.random() * (14 - 1 + 1)) + 1;
            if(randNus.indexOf(randNum) == -1)
            {
                randNus.push(randNum);
                for(var j = 0; j <cards[randNum].length;j++)
                {
                    CCards.push(cards[randNum][j]);
                }
                break;
            }
                
        }
        
    }
    else{
        randNus.push(randNum);
        for(var j = 0; j <cards[randNum].length;j++)
        {
            CCards.push(cards[randNum][j]);
        }
    }

    
    
}

console.log(JSON.stringify(CCards));

console.log("randNus========CC==========="+JSON.stringify(randNus));

var DCards = [];
//var randNus = [];
//概率 4,4,3,3(炸弹)
//第四个玩家随机炸弹概率
var DzhanDanRand = Math.floor(Math.random() * (3 - 1 + 1)) + 1;
console.log("D炸弹概率============================"+DzhanDanRand);
for(var i = 0;i < DzhanDanRand;i++)
{
    var randNum = Math.floor(Math.random() * (14 - 1 + 1)) + 1;
    var d = randNus.indexOf(randNum);
    if(randNus.indexOf(randNum) > -1)
    {
        for(var j = 0;j <10000;j++)
        {
            randNum = Math.floor(Math.random() * (14 - 1 + 1)) + 1;
            if(randNus.indexOf(randNum) == -1)
            {
                randNus.push(randNum);
                for(var j = 0; j <cards[randNum].length;j++)
                {
                    DCards.push(cards[randNum][j]);
                }
                break;
            }
                
        }
        
    }
    else
    {
        randNus.push(randNum);
        for(var j = 0; j <cards[randNum].length;j++)
        {
            DCards.push(cards[randNum][j]);
        }
    }
    
    
}

console.log(JSON.stringify(DCards));
console.log("randNus===========DD========"+JSON.stringify(randNus));
//去除玩家炸弹后的牌
var tmpCards = [];
for(var i =1;i <= 14;i++)
{
    if(randNus.indexOf(i) == -1)
    {
        for(var j = 0;j < cards[i].length;j++)
        {
            tmpCards.push(cards[i][j]);
        }   
    }
}

console.log("剩余牌=========1=========="+JSON.stringify(tmpCards));
 for (var i = 0; i < tmpCards.length; i ++) {
    var randIndex = i + Math.floor(Math.random() * (tmpCards.length - i));
    var temp = tmpCards[i];
    tmpCards[i] = tmpCards[randIndex];
    tmpCards[randIndex] = temp;
}
console.log("剩余牌=========2=========="+JSON.stringify(tmpCards));
var disCountA = 27 - ACards.length;
var disCountB = 27 - BCards.length;
var disCountC = 27 - CCards.length;
var disCountD = 27 - DCards.length;

console.log("相差牌=========A=========="+disCountA);
console.log("相差牌=========B=========="+disCountB);
console.log("相差牌=========C=========="+disCountC);
console.log("相差牌=========D=========="+disCountD);

//设置一个新的数组保存最新的牌
var tmpCardsNew = [];
var idx = 0;
//塞A的牌
for(var i = 0; i < ACards.length;i++)
{
    tmpCardsNew.push(ACards[i]);
}
//补齐A的差牌
for(var i = 0; i <disCountA;i++)
{
    tmpCardsNew.push(tmpCards[idx]);
    idx++;
}

//B玩家的牌
for(var i = 0; i < BCards.length;i++)
{
    tmpCardsNew.push(BCards[i]);
}
//补齐B的差牌
for(var i = 0; i <disCountB;i++)
{
    tmpCardsNew.push(tmpCards[idx]);
    idx++;
}

//c玩家的牌
for(var i = 0; i < CCards.length;i++)
{
    tmpCardsNew.push(CCards[i]);
}
//补齐C的差牌
for(var i = 0; i <disCountC;i++)
{
    tmpCardsNew.push(tmpCards[idx]);
    idx++;
}

//D玩家的牌
for(var i = 0; i < DCards.length;i++)
{
    tmpCardsNew.push(DCards[i]);
}
//补齐D的差牌
for(var i = 0; i <disCountD;i++)
{
    tmpCardsNew.push(tmpCards[idx]);
    idx++;
}
console.log("新的牌======1==="+JSON.stringify(tmpCardsNew));

console.log("新的牌======2==="+ tmpCardsNew.length);
console 命令行工具 X clear

                    
>
console