亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

js撲克牌發牌算法

js撲克牌發牌算法

慕桂英546537 2018-10-25 18:10:44
自己想實現一個撲克牌的發牌算法,花色不知道怎么下手,求指點:
查看完整描述

1 回答

?
鴻蒙傳說

TA貢獻1865條經驗 獲得超7個贊

首先,樓主你貼出來的這個發牌算法有問題(沒有考慮重復問題),比如第一張發了A,第二張就不應該再能有A了。

然后說下本題的解法,首先基于你的提問,猜測你是做一個類似撲克牌的程序,想要實現隨機發牌功能,那么基于這一點,考慮到后續可能的需求變更(比如隨機發4張,...,54張),因此拓展為隨機發N(n<=54)張撲克牌,這時回答的方向就很明朗了:這是一個典型的撲克牌隨機洗牌算法(洗牌后可以隨機發出所有的撲克牌)

代碼實現(JS實現)

// 洗牌算法,傳入一個數組,隨機亂序排列,不污染原數組

function shuffle(arr) {

    if (!arr) {

        throw '錯誤,請傳入正確數組';

    }


    var newArr = arr.slice(0);

    for (var i = newArr.length - 1; i >= 0; i--) {

        // 隨機范圍[0,1)

        var randomIndex = Math.floor(Math.random() * (i + 1));

        var itemAtIndex = newArr[randomIndex];

        newArr[randomIndex] = newArr[i];

        newArr[i] = itemAtIndex;

    }


    return newArr;

}


// 生成一副撲克牌

function generatePoker() {

    // 第一步:定義四個花色,這里就用中文了

    var cardType = ['黑桃', '紅桃', '梅花', '方塊'];


    // 第二步:定義13張普通牌

    var cardValue = ['A', '2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K'];


    // 第三步:定義2張特殊牌,大王與小王

    var specialCard = ['大王', '小王'];


    // 第四步:根據上述數組生成54張牌

    var allCards = [];

    for (var i = 0,

    len1 = cardType.length; i < len1; i++) {

        for (var j = 0,

        len2 = cardValue.length; j < len2; j++) {

            allCards.push(cardType[i] + cardValue[j]);

        }

    }

    allCards = allCards.concat(specialCard);


    return allCards;

}


// 隨機發N張撲克牌

function dealPoker(num) {

    if(!num || num>54 || typeof(num)!== 'number') {

        throw '錯誤,傳入的數字非法,只能是[1-54]';

    }

    // 生成撲克牌

    var allCards = generatePoker();


    // 洗牌-不污染原先的數組

    var randomCards = shuffle(allCards);


    return randomCards.slice(0, num);

}


// 測試用例

console.log(dealPoker(3));

console.log(dealPoker(4));

console.log(dealPoker(10));


// 生成一副洗好的全新亂序牌

var poker = dealPoker(54);

// 接下來如果想要發牌,依次將數組pop即可,因為它本身已經被打亂了,可以一直發完54張

代碼詳解

上述代碼中核心算法是洗牌算法,這里就不贅述了,可以自行搜索,網上有大量相關資源與教程。

另外,沒有做其它相關的封裝操作,實際過程中建議自行良好的封裝起來。


查看完整回答
反對 回復 2018-11-24
  • 1 回答
  • 0 關注
  • 1666 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號