空當接龍紙牌生成算法

    最近爲了學習Javascript和JQuery,寫了一個空當接龍的遊戲,在開發的過程中,在遊戲開始隨機發牌的算法上遇到了一點小問題。如何才能生成這些紙牌的隨機序列呢?百度並Google了一下,發現大部分網友提供的算法都是隨機生成一個1到52之間的數,存入數組,再生產另外一個,然後去數組中做存在性檢查,存在便放棄這個數,不存在就加入數組,這個算法的效率極其低下。另外一部分網友提供的算法類似於人的洗牌,看似精巧,但是很難理解。
    經過思考,我得到了自己的解決算法。一般我們生成隨機數,都是生成一個範圍內的一個數,於是我的思路是先把紙牌按照花色,順序存儲到一個數組(A)中,就像一副新買來的牌一樣。
    //讀入紙牌
    var aryCards = new Array();
 var aryCardColors = new Array("cb","dr","hr","sb");
 for(iCardColor=1;iCardColor<=4;iCardColor++){
     for(iCardNumber=1;iCardNumber<=13;iCardNumber++){
  aryCards.push(iCardNumber+aryCardColors[iCardColor-1]);
     }
 }
    然後隨機生成一個1到52之間的數,從數組(A)中取出相應位置的紙牌,存儲到另外一個數組(B)中,然後從數組(A)中移除這張紙牌,然後在隨機生成一個1到51之間的隨機數,這樣只要52次循環就可以把紙牌順序打亂了。
    在這個過程中還存在這樣一個問題,Javascript不支持從數組中間移除一項,但是可以從數組頭或尾移除,於是我的解決方法是把數組尾的紙牌存儲到要移除的響應數組位置,然後移除數組尾的紙牌,這樣就完成了這算法的全部。
 //隨機生成紙牌
 var aryPlayCard = new Array();
 for(iCardNumber=1;iCardNumber<=52;iCardNumber++){
     var iRandom = Math.round(Math.random()*(aryCards.length-1));
            aryPlayCard.push(aryCards[iRandom]);
     aryCards[iRandom] = aryCards[aryCards.length-1];
            aryCards.pop();
 }
    這樣,在發牌的時候就按數組順序從數組(B)中依次取出紙牌,擺放到頁面上就可以了。這個算法的優點是代碼量少,易於理解,效率高。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章