JavaScript學習筆記整理_簡單實現枚舉類型,撲克牌應用
更新時間:2016年09月19日 08:31:56 投稿:jingxian
下面小編就為大家?guī)硪黄狫avaScript學習筆記整理_簡單實現枚舉類型,撲克牌應用。小編覺得挺不錯的,現在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
如下所示:
//實現枚舉類型,撲克牌應用
function creatEnum(p){
//構造函數
var Enumeration = function(){throw 'can not Instantiate Enumerations';};
//重寫原型并將原型賦值給變量proto
var proto = Enumeration.prototype = {
constructor:Enumeration,
toString:function(){return this.name;},
valueOf:function(){return this.value;},
toJSON:function(){return this.name;}
};
//添加類屬性,方法
Enumeration.values = [];
for(var n in p){ //將對象p的每個元素都單獨轉存到一個單獨的對象o里面,并將這些對象o存入類屬性values數組中
var o = Object.create(proto); //對象o繼承了Enumeration的3個實例方法和構造函數
Enumeration.prototype.valueOf = function(){return this.value*1;}; //重寫原型的valueof方法
o.name = n;
o.value = p[n];
Enumeration[n] = o; //添加類屬性name,值為對象o
Enumeration.values.push(o);
}
Enumeration.foreach = function (f,c) {
for(var i =0;i<this.values.length;i++){
f.call(c,this.values[i]);
}
};
return Enumeration;
}
//===
var Coin = creatEnum( {Penny:1,Nickel:5,Dime:10,Quarter:25} );
console.log(Coin);
/*結果:枚舉對象Coin
{ [Function]
values:
[ { [Number: 10] name: 'Penny', value: 1 },
{ [Number: 50] name: 'Nickel', value: 5 },
{ [Number: 100] name: 'Dime', value: 10 },
{ [Number: 250] name: 'Quarter', value: 25 } ],
Penny: { [Number: 10] name: 'Penny', value: 1 },
Nickel: { [Number: 50] name: 'Nickel', value: 5 },
Dime: { [Number: 100] name: 'Dime', value: 10 },
Quarter: { [Number: 250] name: 'Quarter', value: 25 },
foreach: [Function] }
*/
console.log(Coin.Dime+2); //102 Coin.Dime本身繼承自枚舉對象,繼承并修改了valueof方法用來將value轉化為數字做計算
//===使用函數creatEnum()來表示一副54張的撲克牌==
function Card(suit,rank){
this.suit = suit;
this.rank = rank;
}
Card.Suit = creatEnum( {Clubs:1,Diamonds:2,Heates:3,Spades:4,Joker:5} );
Card.Rank = creatEnum( {Three:3,Four:4,Five:5,Six:6, Seven:7,Eight:8,Nine:9,Ten:10,
Jack:11,Queen:12,King:13,Ace:14,Two:15,SmallJoker:16,BigJoker:17} );
Card.prototype.toString = function(){
return this.rank.toString() +' of '+this.suit.toString();
};
Card.prototype.compareTo = function(that){
if(this.rank<that.rank) return -1;
if(this.rank>that.rank) return 1;
return 0;
};
Card.orderBySuit = function(a,b){
if(a.suit< b.suit) return -1;
if(a.suit> b.suit) return 1;
return 0;
};
Card.orderByRank = function(a,b){
if(a.rank< b.rank) return -1;
if(a.rank> b.rank) return 1;
return 0;
};
//定義一副標準撲克牌
function Deck(){
var cards = this.cards = [];
Card.Suit.foreach(function(s){ //對每個花色執(zhí)行
if(s!=5) {
Card.Rank.foreach(function (r) {
if (r != 16 && r != 17) {
cards.push(new Card(s, r));
}
});
}else{
Card.Rank.foreach(function (r){
if(r == 16) cards.push(new Card(s, r));
if(r == 17) cards.push(new Card(s, r));
});
}
});
}
//洗牌,并返回洗好的牌
Deck.prototype.shuffle = function(){
var deck = this.cards, len = deck.length;
for(var i = len-1;i>0;i--){
var r = Math.floor(Math.random()*(i+1)), temp;
temp = deck[i], deck[i] = deck[r], deck[r] = temp;
}
return this;
};
//發(fā)牌,并返回牌的數組
Deck.prototype.deal = function(n){
if(this.cards.length<n) throw 'Out of cards';
return this.cards.splice(this.cards.length-n, n);
};
//開始:
var deck = new Deck();
var deck1 =deck.shuffle();
var n = 17;
var hand1 = deck1.deal(n).sort(Card.orderByRank);
for(var i = 0;i<n;i++){
var body = document.getElementById('body');
var div = document.createElement('div');
div.style.width = '50px';
div.style.height = '100px';
div.style.border = '1px solid gray';
div.style.float = 'left';
div.innerHTML = hand1[i].suit.name+' '+hand1[i].rank.name;
body.appendChild(div);
console.log(hand1[i].suit.name+' '+hand1[i].rank.name);
}
以上就是小編為大家?guī)淼腏avaScript學習筆記整理_簡單實現枚舉類型,撲克牌應用的全部內容了,希望對大家有所幫助,多多支持腳本之家~
相關文章
深入理解JavaScript中的對象復制(Object Clone)
下面小編就為大家?guī)硪黄钊肜斫釰avaScript中的對象復制(Object Clone)。小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-05-05
Javascript學習筆記之 函數篇(三) : 閉包和引用
本系列好久沒更新了,今天重新拿過來,繼續(xù)前面未完成的事項,本文我們就來談談Javascript 中一個最重要的特性--閉包的使用引用。2014-11-11

