java 枚举类 扑克牌_JavaScript一个简易枚举类型实现扑克牌

/**

* 这个函数创建一个新的枚举类型,实参对象表示类的每个实例的名字和值

* 返回值是一个构造函数,它标识这个新类

* 注意,这个构造函数也会抛出异常,不能使用它来创建该类型的新实例

* 返回的构造函数包含名/值对的映射表

* 包括由值组成的数组,以及以个foreach()迭代器函数*/

functionenumeration(namesToValues){//这个虚拟的构造函数式返回值

var enumeration = function(){throw "Can't Instantiate Enumeration"};//枚举值继承自这个对象

var proto = enumeration.prototype ={

constructor:enumeration,//标识类型

toString : function(){ return this.name; }, //返回名字

valueOf : function(){ return this.value;}, //返回值

toJSON : function(){ return this.name; }, //转为JSON

};

enumeration.values=[]; //用以存放枚举对象的数组

//现在创建新类型的实例

for( name in namesToValues){ //遍历每个值

var e = Object.create(proto); //创建一个代表它的对象

e.name = name ; //给它一个名字

e.value = namesToValues[name]; //给它一个值

enumeration[name] = e; //将它设置为构造函数的属性

enumeration.values.push(e); //将它存储到值数组中

}//一个类方法,用来对类的实例进行迭代

enumeration.foreach = function(f,c){for(var i = 0 ; i

f.call(c,this.values[i]);

};//返回表示这个新类型的构造函数

returnenumeration;

}//枚举类型使用示例:

console.log("枚举类型使用示例:");var e = new enumeration({a:1,b:2,c:3});

console.log(e);

console.log(e.values);

e.foreach(console.log,e);//枚举类型表示一副扑克牌:

console.log("枚举类型表示一副扑克牌:");//定义个已个表示“玩牌”的类

functionCard( suit , rank ){this.suit = suit ; //每张牌都有花色

this.rank = rank ; //以及点数

}//使用枚举类定义换色和点数

Card.Suit = enumeration( {Clubs:1,Diamonds:2,Hearts : 3,Spades:4});

Card.Rank= enumeration( {Two: 2, Three:3,Four: 4, Five:5,Six : 6,

Seven:7,Eight:8,Nine:9,Ten:10,Jack :11,

Queen:12 , King:13,Ace : 14} ) ;//定义用一描述牌面的文本

Card.prototype.toString = function(){this.rank.toString( ) + this.suit.toString();

};//比较扑克牌中两张牌的大小

Card.prototype.compareTo = function( that ){if(this.rank that.rank ) return 1;return 0;

};//以扑克牌的玩法规则对牌进行排序的函数

Card.orderByRank = function(a,b){ returna.compareTo(b)};//以桥牌的玩法规则对扑克牌进行排序的函数

Card.orderBySuit = function(a,b){if(a.suit < b.suit ) return -1;if(a.suit > b.suit ) return 1;if(a.rank < b.rank ) return -1;if(a.rank > b.rank ) return 1;return 0;

};//定义用以表示一副标准扑克牌的类

functionDeck(){var cards = this.cards =[]; //一副牌就是有牌组成的数组

Card.Suit.foreach(function(s){ //初始化这个数组

Card.Rank.foreach( function(r){

cards.push(newCard(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[i] ,deck[r] = temp; //交换

}return this;

};//发牌的方法:返回牌的数组

Deck.prototype.deal = function(n){if(this.cards.length < n ) throw "Out of cards";return this.cards.splice(this.cards.length-n,n);

};

Deck.prototype.toString= function(){var s = "";for( var x in this.cards){

console.log(this.cards[x].suit);

console.log(this.cards[x].rank);

s+= "{"+this.cards[x].suit.toString()+" "+this.cards[x].rank.value+"} ";

}returns;

};//创建一副新扑克牌,洗牌并发牌

var deck = (newDeck()).shuffle();var hand = deck.deal(13).sort(Card.orderBySuit);

deck.toString();

console.log(deck.toString());//console.log(hand);//console.log(hand.name);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值