javascript實(shí)例--教你實(shí)現(xiàn)撲克牌洗牌功能
我們一般都會(huì)按照順序把隨機(jī)摸過(guò)來(lái)的牌從小到大的順序在手上理整齊(記得小時(shí)候打牌兩副牌手都抓不過(guò)來(lái)),這篇隨筆就是想通過(guò)實(shí)現(xiàn)這個(gè)功能來(lái)熟悉下js中排序數(shù)組等相關(guān)知識(shí)。
用到知識(shí)點(diǎn):
1.工廠方式創(chuàng)建對(duì)象
2.js數(shù)組sort()方法
var testArr = [1, 3, 4, 2];
testArr.sort(function (a,b) {
return a - b;
})
alert(testArr.toString());//1,2,3,4
testArr.sort(function (a, b) {
return b- a;
})
alert(testArr.toString());//4,3,2,1
3.js-Math.radom()隨機(jī)數(shù)
Math.random();//0-1 取得的隨機(jī)數(shù)大于等于0且小于1
4.js數(shù)組splice用法
//第一個(gè)參數(shù)是插入的起始位置
//第二個(gè)參數(shù)是從起始位置開(kāi)始刪除元素的個(gè)數(shù)
//第三個(gè)參數(shù)是在起始位置開(kāi)始插入的元素
//例子
var testArr = [1, 3, 4, 2];
testArr.splice(1, 0, 8);
alert(testArr.toString());//1,8,3,4,2
var testArr1 = [1, 3, 4, 2];
testArr1.splice(1, 1, 8);
alert(testArr1.toString());//1,8,3,4,2
5.js數(shù)組shift用法
//取出數(shù)組中的首個(gè)元素返回,數(shù)組刪除第一個(gè)元素
//例子
var testArr = [1, 3, 4, 2];
var k= testArr.shift();
alert(testArr.toString());//3,4,2
alert(k);//1
有了這些基礎(chǔ)知識(shí),咱們可以開(kāi)始打牌了,假設(shè)就一個(gè)人摸牌,底牌是隨機(jī)的,我們每次摸來(lái)一張牌的時(shí)候就要把他插到手上的牌中,保證順序是從小到大!
第一步:首先我們要寫(xiě)一個(gè)生產(chǎn)撲克牌對(duì)象的方法:
/*工廠模式創(chuàng)建各種牌
*number:牌上的數(shù)字
*type:牌的花色
*/
var Cards = (function () {
var Card = function (number, type) {
this.number = number;
this.type = type;
}
return function (number, type) {
return new Card(number, type);
}
})()
第二步:創(chuàng)建撲克牌,洗牌,存儲(chǔ)
var RadomCards = [];//隨機(jī)牌存儲(chǔ)數(shù)組
var MyCards = [];//存儲(chǔ)摸過(guò)來(lái)的牌
//花色0-黑桃 1-梅花 2-方塊 3-紅桃 4-大鬼 5-小鬼
//數(shù)值0-13代表 鬼,1,2,3,4,5,6,7,8,9,10,J,Q,K;
function CreatCompeleteCard() {
var index = 2;
var arr = [];
for (var i = 0; i <= 13; i++) {
if (i == 0) {
arr[0] = new Cards(i, 4);
arr[1] = new Cards(i, 5);
} else {
for (var j = 0; j <= 3; j++) {
arr[index] = new Cards(i, j);
index++;
}
}
}
RadomCards = SortCards(arr);
Show();//在頁(yè)面上顯示當(dāng)前的牌
}
//洗牌
function SortCards(arr) {
arr.sort(function (a, b) {
return 0.5 - Math.random();
})
return arr;
}
第三步:開(kāi)始摸牌,摸牌的時(shí)候我們首先要判斷插入的位置,然后把新牌插入到指定位置,形成新的整齊的順序
//摸牌方法
function GetCards(CardObj) {
var k = InCardsIndex(MyCards, CardObj);//考慮下插入的位置
MyCards.splice(k, 0, CardObj); // 插入形成新的順序
}
/*【獲取牌應(yīng)該插入的位置】
*arr:當(dāng)前手里的牌
*obj:新摸到的牌
*/
function InCardsIndex(arr, obj) {
var len = arr && arr.length || 0;
if (len == 0) {
return 0;
}else if (len == 1) {
if (obj.number >= arr[0].number) {
return 1;
} else {
return 0;
}
} else {
var backi = -1;
for (var i = 0; i < len; i++) {
if (obj.number <= arr[i].number) {
backi = i;
break;
}
}
if (backi == -1) {
backi = len;
}
return backi;
}
}
好啦!通過(guò)html上的button按鈕出發(fā)Start來(lái)摸牌,點(diǎn)一次摸一張牌!并展示出來(lái)
function Start() {//摸牌方法,一次摸一張
if (RadomCards.length > 0) {
GetCards(RadomCards.shift());
Show();
} else {
alert("沒(méi)有了");
}
}
//該show方法是用來(lái)在頁(yè)面展示當(dāng)前牌的動(dòng)向
function Show() {
var lenOld = RadomCards.length;
var lenNew = MyCards.length;
var html = "";
for (var i = 0; i < lenOld; i++) {
html += "<div class='pai'><b>" + RadomCards[i].type + "</b>-<div class='nu'>" + RadomCards[i].number + "</div></div>";
}
document.getElementById("old").innerHTML=html;
html = "";
for (var i = 0; i < lenNew; i++) {
html += "<div class='pai new'><b>" + MyCards[i].type + "</b>-<div class='nu'>" + MyCards[i].number + "</div></div>";
}
document.getElementById("new").innerHTML=html;
}
上html和css的代碼
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8" />
<style type="text/css">
.boom{
width: 50px;
height: 50px;
border: solid 1px red;
position: absolute;
top: 5px;
left: 5px;
}
.pai
{
width: 50px;
height: 100px;
border: solid 1px red;
margin-left: 3px;
float: left;
}
.new
{
border: solid 1px blue;
}
.nu
{
text-align:center;
font-size:24px;
margin-top:25px;
}
</style>
</head>
<body>
<!-- <div class="boom"></div>-->
<input type="button" value="開(kāi)始" onclick="CreatCompeleteCard()" />
<input type="button" value="摸牌" onclick="Start()" />
<br/>
底牌:<div id="old"></div>
<div style="clear: both"></div>
<hr />
我摸到的牌:<div id="new"></div>
</body>
</html>
相關(guān)文章
JavaScript設(shè)計(jì)模式--簡(jiǎn)單工廠模式實(shí)例分析【XHR工廠案例】
這篇文章主要介紹了JavaScript設(shè)計(jì)模式--簡(jiǎn)單工廠模式,結(jié)合實(shí)例形式分析了JavaScript設(shè)計(jì)模式中簡(jiǎn)單工廠模式原理與XHR工廠應(yīng)用案例,需要的朋友可以參考下2020-05-05前端圖片懶加載(lazyload)的實(shí)現(xiàn)方法(提高用戶(hù)體驗(yàn))
圖片懶加載又稱(chēng)圖片延時(shí)加載、惰性加載,即在用戶(hù)需要使用圖片的時(shí)候加載,這樣可以減少請(qǐng)求,節(jié)省帶寬,提高頁(yè)面加載速度,相對(duì)的,也能減少服務(wù)器壓力,下面通過(guò)本文給大家分享圖片懶加載lazyload的實(shí)現(xiàn)方法,感興趣的朋友一起看看吧2017-08-08openlayers4.6.5實(shí)現(xiàn)距離量測(cè)和面積量測(cè)
這篇文章主要為大家詳細(xì)介紹了openlayers4.6.5實(shí)現(xiàn)距離量測(cè)和面積量測(cè),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-09-09JavaScript的parseInt 進(jìn)制問(wèn)題
今天在整理以前寫(xiě)過(guò)的一段根據(jù)周期值自動(dòng)計(jì)算下次執(zhí)行日期的js代碼,發(fā)現(xiàn)一bug,我使用parseInt對(duì)源數(shù)據(jù)串進(jìn)行轉(zhuǎn)換,當(dāng)輸入類(lèi)似:2009-05-05時(shí),parseInt將把串的05做8進(jìn)制轉(zhuǎn)換,這樣結(jié)果自然就不對(duì)了。2009-05-05bootstrap-table.js擴(kuò)展分頁(yè)工具欄(增加跳轉(zhuǎn)到xx頁(yè))功能
這篇文章主要介紹了bootstrap-table.js擴(kuò)展分頁(yè)工具欄,增加跳轉(zhuǎn)到xx頁(yè)功能,由于小編的水平停留在dom級(jí),此次擴(kuò)展只支持頁(yè)面上的表格,如果大家有好的建議歡迎提出2017-12-12JavaScript三種常用網(wǎng)頁(yè)特效詳解
這篇文章主要介紹了可以用JavaScript實(shí)現(xiàn)的常用的三種網(wǎng)頁(yè)特效:offset系列、client系列、scroll系列。文中示例代碼簡(jiǎn)潔易懂,感興趣的小伙伴可以了解一下2021-12-12javascript實(shí)現(xiàn)點(diǎn)擊圖片切換
這篇文章主要介紹了javascript實(shí)現(xiàn)點(diǎn)擊圖片切換,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-04-04