1. 程式人生 > >空當接龍紙牌生成演算法

空當接龍紙牌生成演算法

    最近為了學習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)中依次取出紙牌,擺放到頁面上就可以了。這個演算法的優點是程式碼量少,易於理解,效率高。