JavaScript一个简易枚举类型实现扑克牌
<script type="text/javascript">
/**
* 这个函数创建一个新的枚举类型,实参对象表示类的每个实例的名字和值
* 返回值是一个构造函数,它标识这个新类
* 注意,这个构造函数也会抛出异常,不能使用它来创建该类型的新实例
* 返回的构造函数包含名/值对的映射表
* 包括由值组成的数组,以及以个foreach()迭代器函数
*/
function enumeration(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<this.values.length; i++)
f.call(c,this.values[i]);
}; //返回表示这个新类型的构造函数
return enumeration;
} //枚举类型使用示例:
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("枚举类型表示一副扑克牌:"); //定义个已个表示“玩牌”的类
function Card( 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;
if(this.rank > that.rank ) return 1;
return 0;
};
//以扑克牌的玩法规则对牌进行排序的函数
Card.orderByRank = function(a,b){ return a.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;
}; //定义用以表示一副标准扑克牌的类
function Deck(){
var cards = this.cards =[]; //一副牌就是有牌组成的数组
Card.Suit.foreach(function(s){ //初始化这个数组
Card.Rank.foreach( function(r){
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[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+"} ";
}
return s;
}; // 创建一副新扑克牌,洗牌并发牌
var deck = (new Deck()).shuffle();
var hand = deck.deal(13).sort(Card.orderBySuit);
deck.toString();
console.log(deck.toString());
//console.log(hand);
// console.log(hand.name); </script>
JavaScript一个简易枚举类型实现扑克牌的更多相关文章
- spring 注入一个以枚举类型对象
1.枚举 在实际编程中,往往存在着这样的“数据集”,它们的数值在程序中是稳定的,而且“数据集”中的元素是有限的. 例如星期一到星期日七个数据元素组成了一周的“数据集”,春夏秋冬四个数据元素组成了四季的 ...
- JavaScript 一个进行枚举选择的jquery插件(仿easyui风格)
某次做项目要实现一个功能: 按星期选择一个连续的时间范围 比如:周一到周五,周六到周日 或 周六到周三 聪明的朋友马上想出办法:用两个选项为周一到周日的下拉列表实现,对 那样可以,但是我觉得不够友好, ...
- 测者的测试技术手册:Junit单元测试遇见的一个枚举类型的坑(枚举类型详解)
Enum的简介 枚举类型很早就在计算机语言中存在了,主要被用来将一组相似的值包含进一种类型中,这种类型的名称被定义成独一无二的类型描述符,这就是枚举类型. 在java语言中,枚举类型是一个完整功能的类 ...
- C#语言基础——结构体和枚举类型
结构体和枚举类型 一.结构体(struct) 结构类型是用户自己定义的一种类型,它是由其他类型组合而成的,可包含构造函数.常数.字段.方法.属性.索引器.运算符.事件和嵌套类型的值类型.结构在几个重要 ...
- Asp.Net 之 枚举类型的下拉列表绑定
有这样一个学科枚举类型: /// 学科 /// </summary> public enum Subject { None = , [Description("语文") ...
- C#的枚举数(Enumerator)和可枚举类型(Enumerable)
数组可以被foreach语句遍历数组中的元素,原因是数组可以按需提供一个叫做枚举数(enumerator)的对象.枚举数可以依次返回请求的数组的元素. 对于有枚举数的类型而言,必须有一个方法来获取它们 ...
- Java中的枚举类型详解
枚举类型介绍 枚举类型(Enumerated Type) 很早就出现在编程语言中,它被用来将一组类似的值包含到一种类型当中.而这种枚举类型的名称则会被定义成独一无二的类型描述符,在这一点上和常量的定义 ...
- 【Swift学习笔记00】——enumeration枚举类型遵循协议protocol
Apple官方文档:The Swift Programming LanguageProtocols and Extensions一节的小节练习,要求自行定义一个enumeration枚举类型,并且遵循 ...
- Java枚举类型enum使用详解
java的Enum枚举类型终于在j2se1.5出现了.之前觉得它只不过是鸡肋而已,可有可无.毕竟这么多年来,没有它,大家不都过得很好吗?今日看<Thinking in Java>4th ...
随机推荐
- python爬虫从入门到放弃(四)之 Requests库的基本使用
什么是Requests Requests是用python语言基于urllib编写的,采用的是Apache2 Licensed开源协议的HTTP库如果你看过上篇文章关于urllib库的使用,你会发现,其 ...
- 【译】Envoy with Nomad and Consul (一)
原文: http://timperrett.com/2017/05/13/nomad-with-envoy-and-consul 在过去的许多年我的职业生涯一直是围绕着数据中心和平台基础设施.工作范围 ...
- VR上天了!全景商业化落地了!——VR全景智慧城市
几年前,VR创业公司SpaceVR就启动了旨在将宇航员视觉体验带给普通人的虚拟现实(VR)项目.SpaceVR计划将VR相机卫星送入太空,并将相机拍摄到的太空视频发送回地球,从而让VR用户身临其境地看 ...
- 配置Nginx作为web server详解
keepalived+nginx:实现高可用 corosync+ngin Nginx: 轻量级的反向代理 web服务器 处理静态文件,索引文件以及自动索引,打开文件描述缓存 使用缓存加速反向代理,简单 ...
- poj3207
poj3207 题意 平面上,一个圆,圆的边上按顺时针放着n个点.现在要连m条边, 比如a,b,那么a到b可以从圆的内部连接,也可以从圆的外部连接. 给你的信息中,每个点最多只会连接的一条边.问能不能 ...
- git代码回滚
有时候我们用git提交代码后发生了错误,代码冲突了啊等等,我们需要将代码回到以前的某个版本 git代码回退有两种办法 一.git reset(推荐): 它是将最新的commit删除,用以前的某个版本的 ...
- MySQL优化之表结构优化的5大建议(数据类型选择讲的很好)
殊不知,在N年前被奉为"圣经"的数据库设计3范式早就已经不完全适用了.这里我整理了一些比较常见的数据库表结构设计方面的优化技巧,希望对大家有用. 由于MySQL数据库是基于行(Ro ...
- JavaScript中的数组
数组 (1).数组的定义 数组是值的有序集合 javascript数组是无类型的:数组元素可以是任意类型,并且同一个数组的不同元素也可能有不同的类型. 每个值叫做一个元素,而每个元素在数组中有一个位置 ...
- jquery.qrcode.min.js(支持中文转化二维码)
详情请看:http://www.ncloud.hk/%E6%8A%80%E6%9C%AF%E5%88%86%E4%BA%AB/jqueryqrcodeminjs/ 今天还是要讲一下关于二维码的知识,前 ...
- Lucence
Lucene是apache软件基金会4 jakarta项目组的一个子项目,是一个开放源代码的全文检索引擎工具包,但它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和索引引 ...