1. <script type="text/javascript">
  2. /**
  3. * 这个函数创建一个新的枚举类型,实参对象表示类的每个实例的名字和值
  4. * 返回值是一个构造函数,它标识这个新类
  5. * 注意,这个构造函数也会抛出异常,不能使用它来创建该类型的新实例
  6. * 返回的构造函数包含名/值对的映射表
  7. * 包括由值组成的数组,以及以个foreach()迭代器函数
  8. */
  9. function enumeration(namesToValues){
  10. //这个虚拟的构造函数式返回值
  11. var enumeration = function(){throw "Can't Instantiate Enumeration"};
  12.  
  13. //枚举值继承自这个对象
  14. var proto = enumeration.prototype = {
  15. constructor:enumeration, //标识类型
  16. toString : function(){ return this.name; }, //返回名字
  17. valueOf : function(){ return this.value;}, //返回值
  18. toJSON : function(){ return this.name; }, //转为JSON
  19. };
  20.  
  21. enumeration.values =[]; //用以存放枚举对象的数组
  22.  
  23. //现在创建新类型的实例
  24. for( name in namesToValues){ //遍历每个值
  25. var e = Object.create(proto); //创建一个代表它的对象
  26. e.name = name ; //给它一个名字
  27. e.value = namesToValues[name]; //给它一个值
  28. enumeration[name] = e; //将它设置为构造函数的属性
  29. enumeration.values.push(e); //将它存储到值数组中
  30. }
  31.  
  32. //一个类方法,用来对类的实例进行迭代
  33. enumeration.foreach = function(f,c){
  34. for(var i = 0 ; i<this.values.length; i++)
  35. f.call(c,this.values[i]);
  36. };
  37.  
  38. //返回表示这个新类型的构造函数
  39. return enumeration;
  40. }
  41.  
  42. //枚举类型使用示例:
  43. console.log("枚举类型使用示例:");
  44. var e = new enumeration({a:1,b:2,c:3});
  45. console.log(e);
  46. console.log(e.values);
  47. e.foreach(console.log,e);
  48.  
  49. //枚举类型表示一副扑克牌:
  50. console.log("枚举类型表示一副扑克牌:");
  51.  
  52. //定义个已个表示“玩牌”的类
  53. function Card( suit , rank ){
  54. this.suit = suit ; //每张牌都有花色
  55. this.rank = rank ; //以及点数
  56. }
  57.  
  58. //使用枚举类定义换色和点数
  59. Card.Suit = enumeration( {Clubs:1,Diamonds:2,Hearts : 3,Spades:4});
  60.  
  61. Card.Rank = enumeration( {Two: 2, Three:3,Four: 4, Five:5,Six : 6,
  62. Seven:7,Eight:8,Nine:9,Ten:10,Jack :11,
  63. Queen:12 , King:13,Ace : 14
  64. } ) ;
  65. //定义用一描述牌面的文本
  66. Card.prototype.toString = function(){
  67. this.rank.toString( ) + this.suit.toString();
  68. };
  69. //比较扑克牌中两张牌的大小
  70. Card.prototype.compareTo = function( that ){
  71. if(this.rank<that.rank ) return -1;
  72. if(this.rank > that.rank ) return 1;
  73. return 0;
  74. };
  75. //以扑克牌的玩法规则对牌进行排序的函数
  76. Card.orderByRank = function(a,b){ return a.compareTo(b)};
  77.  
  78. //以桥牌的玩法规则对扑克牌进行排序的函数
  79. Card.orderBySuit = function(a,b){
  80. if(a.suit < b.suit ) return -1;
  81. if(a.suit > b.suit ) return 1;
  82. if(a.rank < b.rank ) return -1;
  83. if(a.rank > b.rank ) return 1;
  84. return 0;
  85. };
  86.  
  87. //定义用以表示一副标准扑克牌的类
  88. function Deck(){
  89. var cards = this.cards =[]; //一副牌就是有牌组成的数组
  90. Card.Suit.foreach(function(s){ //初始化这个数组
  91. Card.Rank.foreach( function(r){
  92. cards.push(new Card(s,r));
  93. });
  94. });
  95. }
  96.  
  97. //洗牌的方法:重新洗牌并返回洗好的牌
  98. Deck.prototype.shuffle = function(){
  99. //遍历数组汇总的每个元素,随机找出牌面最小的元素,并与之(当前遍历的元素)交换
  100. var deck = this.cards,len = deck.length;
  101. for( var i = len-1 ; i>0 ; i--){
  102. var r = Math.floor(Math.random()*(i+1)),temp; //随机苏
  103. temp = deck[i],deck[i] = deck[i] ,deck[r] = temp; //交换
  104. }
  105. return this;
  106. };
  107.  
  108. //发牌的方法:返回牌的数组
  109. Deck.prototype.deal = function(n){
  110. if(this.cards.length < n ) throw "Out of cards";
  111. return this.cards.splice(this.cards.length-n,n);
  112. };
  113.  
  114. Deck.prototype.toString = function(){
  115. var s = "";
  116. for( var x in this.cards){
  117. console.log(this.cards[x].suit);
  118. console.log(this.cards[x].rank);
  119. s += "{"+this.cards[x].suit.toString()+" "+this.cards[x].rank.value+"} ";
  120. }
  121. return s;
  122. };
  123.  
  124. // 创建一副新扑克牌,洗牌并发牌
  125. var deck = (new Deck()).shuffle();
  126. var hand = deck.deal(13).sort(Card.orderBySuit);
  127. deck.toString();
  128. console.log(deck.toString());
  129. //console.log(hand);
  130. // console.log(hand.name);
  131.  
  132. </script>

JavaScript一个简易枚举类型实现扑克牌的更多相关文章

  1. spring 注入一个以枚举类型对象

    1.枚举 在实际编程中,往往存在着这样的“数据集”,它们的数值在程序中是稳定的,而且“数据集”中的元素是有限的. 例如星期一到星期日七个数据元素组成了一周的“数据集”,春夏秋冬四个数据元素组成了四季的 ...

  2. JavaScript 一个进行枚举选择的jquery插件(仿easyui风格)

    某次做项目要实现一个功能: 按星期选择一个连续的时间范围 比如:周一到周五,周六到周日 或 周六到周三 聪明的朋友马上想出办法:用两个选项为周一到周日的下拉列表实现,对 那样可以,但是我觉得不够友好, ...

  3. 测者的测试技术手册:Junit单元测试遇见的一个枚举类型的坑(枚举类型详解)

    Enum的简介 枚举类型很早就在计算机语言中存在了,主要被用来将一组相似的值包含进一种类型中,这种类型的名称被定义成独一无二的类型描述符,这就是枚举类型. 在java语言中,枚举类型是一个完整功能的类 ...

  4. C#语言基础——结构体和枚举类型

    结构体和枚举类型 一.结构体(struct) 结构类型是用户自己定义的一种类型,它是由其他类型组合而成的,可包含构造函数.常数.字段.方法.属性.索引器.运算符.事件和嵌套类型的值类型.结构在几个重要 ...

  5. Asp.Net 之 枚举类型的下拉列表绑定

    有这样一个学科枚举类型: /// 学科 /// </summary> public enum Subject { None = , [Description("语文") ...

  6. C#的枚举数(Enumerator)和可枚举类型(Enumerable)

    数组可以被foreach语句遍历数组中的元素,原因是数组可以按需提供一个叫做枚举数(enumerator)的对象.枚举数可以依次返回请求的数组的元素. 对于有枚举数的类型而言,必须有一个方法来获取它们 ...

  7. Java中的枚举类型详解

    枚举类型介绍 枚举类型(Enumerated Type) 很早就出现在编程语言中,它被用来将一组类似的值包含到一种类型当中.而这种枚举类型的名称则会被定义成独一无二的类型描述符,在这一点上和常量的定义 ...

  8. 【Swift学习笔记00】——enumeration枚举类型遵循协议protocol

    Apple官方文档:The Swift Programming LanguageProtocols and Extensions一节的小节练习,要求自行定义一个enumeration枚举类型,并且遵循 ...

  9. Java枚举类型enum使用详解

      java的Enum枚举类型终于在j2se1.5出现了.之前觉得它只不过是鸡肋而已,可有可无.毕竟这么多年来,没有它,大家不都过得很好吗?今日看<Thinking in Java>4th ...

随机推荐

  1. Workout Wednesday Redux (2017 Week 3)

    I had started a "52 Vis" initiative back in 2016 to encourage folks to get practice making ...

  2. web工作过程

    了解浏览器与服务器进行通信和访问的过程 打开浏览器-输入URL地址 当我们访问一个网页时,如http://www.baidu.com,这个网址包含四个部分的内容: 1.第一部分:协议类型:这里是htt ...

  3. (原创)用Java实现链表结构对象:单向无环链表

    转载请注明本文出处:http://www.cnblogs.com/Starshot/p/6918569.html 链表的结构是由一个一个节点组成的,所谓链,就是每个节点的头尾连在一起.而单向链表就是: ...

  4. MySql的学习笔记

    良好的理解sql语句: 列:理解可以运算的成变量 where: 理解成表达式,放在行中看是否成立 查出来的结果可以当成一张表理解,select 套用select综合查询:   五种查询 where g ...

  5. TLS1.0和TLS1.1的区别

    TLS1.1是对TSL1.0的改进其中包括: 改进"抗抵赖"安全特性上的缺陷 完成协议对椭圆曲线的支持,提出了改进的支持ECC算法的传输层安全协议, 握手协议引入了数字签名及验证机 ...

  6. asp.net core教程 (二)

    Asp.net Core环境设置 Asp.net Core环境设置 安装Microsoft Visual Studio 2015 Asp.Net Core是Asp.Net的一个重大的重新设计. 这个话 ...

  7. 深入理解循环队列----循环数组实现ArrayDeque

    我们知道队列这种数据结构的物理实现方式主要还是两种,一种是链队列(自定义节点类),另一种则是使用数组实现,两者各有优势.此处我们将要介绍的循环队列其实是队列的一种具体实现,由于一般的数组实现的队列结构 ...

  8. css代码初始化

    @charset "utf-8";/* 页面元素初始化和常用样式定义-start *//*======== 全局 ========*/body, div, dl, dt, dd, ...

  9. 使用外部容器运行spring-boot项目:不使用spring-boot内置容器让spring-boot项目运行在外部tomcat容器中

    前言:本项目基于maven构建 spring-boot项目可以快速构建web应用,其内置的tomcat容器也十分方便我们的测试运行: spring-boot项目需要部署在外部容器中的时候,spring ...

  10. CentOS 7 for ARM 安装一键Lnmp失败

    背景 前面把树莓派装上了CentOS 7,趁着国庆放假回来赶紧把服务端环境搭起来,为了方便就准备用一键lnmp快速部署一个,结果死活安装不成功... 报错 按照以往的经验进行安装,在我的小树莓派上安装 ...