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)文章
基于JS遞歸函數(shù)細(xì)化認(rèn)識(shí)及實(shí)用實(shí)例(推薦)
下面小編就為大家?guī)?lái)一篇基于JS遞歸函數(shù)細(xì)化認(rèn)識(shí)及實(shí)用實(shí)例(推薦)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-08-08
基于JS代碼實(shí)現(xiàn)實(shí)時(shí)顯示系統(tǒng)時(shí)間
這篇文章主要介紹了基于JS代碼實(shí)現(xiàn)實(shí)時(shí)顯示系統(tǒng)時(shí)間的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-06-06
js實(shí)現(xiàn)簡(jiǎn)單圓盤(pán)時(shí)鐘
這篇文章主要為大家詳細(xì)介紹了js實(shí)現(xiàn)簡(jiǎn)單圓盤(pán)時(shí)鐘,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-09-09
JavaScript實(shí)現(xiàn)生成隨機(jī)密碼的示例詳解
使用JavaScript我們可以輕松地在客戶端生成隨機(jī)密碼,本文我們將實(shí)現(xiàn)一個(gè)簡(jiǎn)單的隨機(jī)密碼生成器,能夠生成指定長(zhǎng)度和包含特定字符集的密碼,有需要的可以參考下2024-01-01
JS實(shí)現(xiàn)圖片預(yù)加載無(wú)需等待
網(wǎng)站開(kāi)發(fā)時(shí)經(jīng)常需要在某個(gè)頁(yè)面需要實(shí)現(xiàn)對(duì)大量圖片的瀏覽;用javascript來(lái)實(shí)現(xiàn)一個(gè)圖片瀏覽器,讓用戶無(wú)需等待過(guò)長(zhǎng)的時(shí)間就能看到其他圖片2012-12-12
根據(jù)輸入郵箱號(hào)跳轉(zhuǎn)到相應(yīng)登錄地址的解決方法
本文分享了基于javascript實(shí)現(xiàn)的根據(jù)輸入郵箱號(hào)跳轉(zhuǎn)到相應(yīng)登錄地址的具體實(shí)例代碼,需要的朋友一起來(lái)看下吧2016-12-12

