今天无意中聊起洗牌算法,于是就尝试写一下这个洗牌算法,不管算法多么简陋,主要进一步熟悉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>
说明:部分代码没有考虑兼容性问题,比如事件监听。特此说明。
结果为:

写的比较初级,还请高手多批评和指导~
原文:http://www.cnblogs.com/lwl8/p/3622267.html