JavaScript学习笔记整理_简单实现枚举类型,扑克牌应用


Posted in Javascript onSeptember 19, 2016

如下所示:

//实现枚举类型,扑克牌应用
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){ //对每个花色执行
    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;
};
//发牌,并返回牌的数组
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);
}

以上就是小编为大家带来的JavaScript学习笔记整理_简单实现枚举类型,扑克牌应用的全部内容了,希望对大家有所帮助,多多支持三水点靠木~

Javascript 相关文章推荐
js工具方法弹出蒙版
May 08 Javascript
extjs中form与grid交互数据(record)的方法
Aug 29 Javascript
js 上传文件预览的简单实例
Aug 16 Javascript
Centos7 中安装 Node.js v4.4.4
Nov 03 Javascript
vue实现简单实时汇率计算功能
Jan 15 Javascript
angular学习之从零搭建一个angular4.0项目
Jul 10 Javascript
JS实现简单短信验证码界面
Aug 07 Javascript
JavaScript实现打印星型金字塔功能实例分析
Sep 27 Javascript
react项目实践之webpack-dev-serve
Sep 14 Javascript
关于vue v-for循环解决img标签的src动态绑定问题
Sep 18 Javascript
请求时token过期自动刷新token操作
Sep 11 Javascript
JavaScript原始值与包装对象的详细介绍
May 11 Javascript
JavaScript学习笔记整理_关于表达式和语句
Sep 19 #Javascript
javascript学习笔记_浅谈基础语法,类型,变量
Sep 19 #Javascript
js中用cssText设置css样式的简单方法
Sep 19 #Javascript
Query常用DIV操作获取和设置长度宽度的实现方法
Sep 19 #Javascript
基于jQuery实现中英文切换导航条效果
Sep 18 #Javascript
jQuery EasyUI常用数据验证汇总
Sep 18 #Javascript
jQuery EasyUI封装简化操作
Sep 18 #Javascript
You might like
DC动漫人物排行
2020/03/03 欧美动漫
虫族 Zerg 热键控制
2020/03/14 星际争霸
php读取mysql中文数据出现乱码的解决方法
2013/08/16 PHP
CodeIgniter记录错误日志的方法全面总结
2016/05/17 PHP
PHP全功能无变形图片裁剪操作类与用法示例
2017/01/10 PHP
多浏览器兼容的获取元素和鼠标的位置的js代码
2009/12/15 Javascript
JavaScript 滚轮事件使用说明
2010/03/07 Javascript
js获取select默认选中的Option并不是当前选中值
2014/05/07 Javascript
JQuery设置时间段下拉选择实例
2014/12/30 Javascript
Js类的静态方法与实例方法区分及jQuery拓展的两种方法
2016/06/03 Javascript
Javascript实现前端简单的路由实例
2016/09/11 Javascript
详解JS几种变量交换方式以及性能分析对比
2016/11/25 Javascript
jsonp跨域获取百度联想词的方法分析
2019/05/13 Javascript
浅谈vuex中store的命名空间
2019/11/08 Javascript
[02:18]《我与DAC》之工作人员:为了热爱DOTA2的玩家们
2018/03/28 DOTA
零基础写python爬虫之神器正则表达式
2014/11/06 Python
利用python批量修改word文件名的方法示例
2017/10/17 Python
详解Python logging调用Logger.info方法的处理过程
2019/02/12 Python
windows系统中Python多版本与jupyter notebook使用虚拟环境的过程
2019/05/15 Python
python实现控制COM口的示例
2019/07/03 Python
python检测服务器端口代码实例
2019/08/31 Python
django ajax发送post请求的两种方法
2020/01/05 Python
python 伯努利分布详解
2020/02/25 Python
python实现将两个文件夹合并至另一个文件夹(制作数据集)
2020/04/03 Python
Python3 webservice接口测试代码详解
2020/06/23 Python
用python实现前向分词最大匹配算法的示例代码
2020/08/06 Python
The Outnet亚太地区:折扣设计师时装店
2019/12/05 全球购物
专业实习自我鉴定
2013/10/29 职场文书
资产评估专业学生的自我鉴定
2013/11/14 职场文书
会计助理的岗位职责
2013/11/29 职场文书
大学生蛋糕店创业计划书
2014/01/13 职场文书
远程网络教育毕业生自我鉴定
2014/04/14 职场文书
国际贸易毕业生自荐书
2014/06/22 职场文书
捐书活动倡议书
2015/04/27 职场文书
聘任协议书(挂靠)
2015/09/21 职场文书
关于对TypeScript泛型参数的默认值理解
2022/07/15 Javascript