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 ...
随机推荐
- Workout Wednesday Redux (2017 Week 3)
I had started a "52 Vis" initiative back in 2016 to encourage folks to get practice making ...
- web工作过程
了解浏览器与服务器进行通信和访问的过程 打开浏览器-输入URL地址 当我们访问一个网页时,如http://www.baidu.com,这个网址包含四个部分的内容: 1.第一部分:协议类型:这里是htt ...
- (原创)用Java实现链表结构对象:单向无环链表
转载请注明本文出处:http://www.cnblogs.com/Starshot/p/6918569.html 链表的结构是由一个一个节点组成的,所谓链,就是每个节点的头尾连在一起.而单向链表就是: ...
- MySql的学习笔记
良好的理解sql语句: 列:理解可以运算的成变量 where: 理解成表达式,放在行中看是否成立 查出来的结果可以当成一张表理解,select 套用select综合查询: 五种查询 where g ...
- TLS1.0和TLS1.1的区别
TLS1.1是对TSL1.0的改进其中包括: 改进"抗抵赖"安全特性上的缺陷 完成协议对椭圆曲线的支持,提出了改进的支持ECC算法的传输层安全协议, 握手协议引入了数字签名及验证机 ...
- asp.net core教程 (二)
Asp.net Core环境设置 Asp.net Core环境设置 安装Microsoft Visual Studio 2015 Asp.Net Core是Asp.Net的一个重大的重新设计. 这个话 ...
- 深入理解循环队列----循环数组实现ArrayDeque
我们知道队列这种数据结构的物理实现方式主要还是两种,一种是链队列(自定义节点类),另一种则是使用数组实现,两者各有优势.此处我们将要介绍的循环队列其实是队列的一种具体实现,由于一般的数组实现的队列结构 ...
- css代码初始化
@charset "utf-8";/* 页面元素初始化和常用样式定义-start *//*======== 全局 ========*/body, div, dl, dt, dd, ...
- 使用外部容器运行spring-boot项目:不使用spring-boot内置容器让spring-boot项目运行在外部tomcat容器中
前言:本项目基于maven构建 spring-boot项目可以快速构建web应用,其内置的tomcat容器也十分方便我们的测试运行: spring-boot项目需要部署在外部容器中的时候,spring ...
- CentOS 7 for ARM 安装一键Lnmp失败
背景 前面把树莓派装上了CentOS 7,趁着国庆放假回来赶紧把服务端环境搭起来,为了方便就准备用一键lnmp快速部署一个,结果死活安装不成功... 报错 按照以往的经验进行安装,在我的小树莓派上安装 ...