粗糙的洗牌算法實現


  今天無意中聊起洗牌算法,於是就嘗試寫一下這個洗牌算法,不管算法多么簡陋,主要進一步熟悉js語言,鍛煉一下自己。

  我的思路,模擬現實中的洗牌常用方法:

      1、一開始牌的狀態是有序或者無序的。

      2、每次講牌分開兩半,然后用左右手分別將這兩堆牌交叉,得到一個新順序的牌。

      3、 將過程2重復n次,即洗好牌。

      4、(上面的策略只是自己經常洗牌使用的方法,不一定能公平或者隨機,還請大家多多見諒)

   具體代碼如下:

        

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <title>洗牌算法</title>
    <style>
        body{ background: #000; color: #fff;}
        #star p, #end p{ padding: 0px; margin: 0px;display: inline-block;width:5%; color: #f60; height: 22px;}

    </style>
</head>
<body>
<div>
    <h3>原始放的牌:</h3>
    <div id="star"></div>
</div>
<div id="xipai">
    <h3>
        需要洗的次數:
    </h3>
    <input type="txt" id="num" />
    <input type="button" id="begin" value="開始洗牌"/>
</div>
<div >
    <h3>洗好的牌:</h3>
    <div id="end"></div>
</div>
<script type="text/javascript">
    var sBox=document.getElementById("star");
    var eBox=document.getElementById("end");
    var beginXp=document.getElementById("begin");
    var arrPK=[];  //存放撲克的地方

    function initi(){        //初始化生成撲克牌
        var arr=[];
        var a1=["紅桃","方塊","梅花","黑桃"]  //a代表紅桃  b代表方塊 c代表梅花
        var a2=["1","2","3","4","5","6","7","8","9","10","j","q","k"];
        var num=0;
        for(var i=0;i<a1.length;i++){
            for(var j=0;j<a2.length;j++){
                arr[arr.length]=a1[i]+a2[j];
            }
        }
        arr.push("小鬼","大鬼") ;
        return arr;
    }
    arrPK=initi();
    sBox.innerHTML="<p>"+arrPK.join("</p><p>")+"</p>";       //最開始生成的牌,在網頁中顯示

    //每次洗牌的方法
    function xiP(arr1){
        var arrTmp1=[];
        var arrTmp2=[];
        var avPos=parseFloat(arr1.length/2);
        arrTmp1=arr1.slice(0,avPos);
        arrTmp2=(arr1.slice(avPos,arr1.length)).reverse();
        arr1=[];
        //將交叉洗牌的結果重新賦予給數組
        while(arrTmp1.length>0&&arrTmp2.length>0){
            if(Math.random()>0.5){
                arr1.push(arrTmp1.pop());
            }
            else{
                arr1.push(arrTmp2.pop());
            }

        }
        while(arrTmp1.length>0){
            arr1.push(arrTmp1.pop());

        }
        while(arrTmp2.length>0){
            arr1.push(arrTmp2.pop());

        }
        return arr1;
    }
    //洗n次牌
    beginXp.addEventListener("click",function(){
        var num=Math.floor(document.getElementById("num").value);
        for(i=0;i<num;i++){
            arrPK=xiP(arrPK);
        }
        // console.log(arrPK.length);
        console.log(arrPK);
        eBox.innerHTML="<p>"+arrPK.join("</p><p>")+"</p>";       //在網頁中顯示洗牌結果
    })

</script>
</body>
</html>
View Code

說明:部分代碼沒有考慮兼容性問題,比如事件監聽。特此說明。          

結果為:

   

   
   寫的比較初級,還請高手多批評和指導~

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM