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 相关文章推荐
javascript new 需不需要继续使用
Jul 02 Javascript
jQuery autocomplate 自扩展插件、自动完成示例代码
Mar 28 Javascript
详解JavaScript对象和数组
Dec 03 Javascript
knockoutjs动态加载外部的file作为component中的template数据源的实现方法
Sep 01 Javascript
详解Jquery EasyUI tree 的异步加载(遍历指定文件夹,根据文件夹内的文件生成tree)
Feb 11 Javascript
jQuery 实现鼠标画框并对框内数据选中的实例代码
Aug 29 jQuery
一次让你了解全部JavaScript的作用域
Jun 24 Javascript
vue+elementUI实现图片上传功能
Aug 20 Javascript
jquery实现的分页显示功能示例
Aug 23 jQuery
js调用网络摄像头的方法
Dec 05 Javascript
JavaScript中的几种继承方法示例
Dec 06 Javascript
vue 导航守卫和axios拦截器有哪些区别
Dec 19 Vue.js
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
理解PHP中的stdClass类
2014/04/18 PHP
windows的文件系统机制引发的PHP路径爆破问题分析
2014/07/28 PHP
YII Framework框架教程之国际化实现方法
2016/03/14 PHP
thinkPHP5实现数据库添加内容的方法
2017/10/25 PHP
Laravel5.5+ 使用API Resources快速输出自定义JSON方法详解
2020/04/06 PHP
js实现简单模态窗口,背景灰显
2008/11/14 Javascript
jQuery lazyload 的重复加载错误以及修复方法
2010/11/19 Javascript
读jQuery之五(取DOM元素)
2011/06/20 Javascript
jquery入门——事件机制之事件中的冒泡现象示例解释
2020/09/12 Javascript
AngularJS入门知识之MVW类框架的编程思想探讨
2014/12/08 Javascript
JavaScript实现SHA-1加密算法的方法
2015/03/11 Javascript
WebGL利用FBO完成立方体贴图效果完整实例(附demo源码下载)
2016/01/26 Javascript
深入浅析JavaScript函数前面的加号和叹号
2016/07/09 Javascript
AngularJS实现表单验证功能
2017/01/09 Javascript
JavaScript实现计数器基础方法
2017/10/10 Javascript
基于vue-cli 路由 实现类似tab切换效果(vue 2.0)
2019/05/08 Javascript
一篇文章看懂JavaScript中的回调
2021/01/05 Javascript
python进阶教程之循环对象
2014/08/30 Python
Python查询阿里巴巴关键字排名的方法
2015/07/08 Python
python 寻找list中最大元素对应的索引方法
2018/06/28 Python
python 去除二维数组/二维列表中的重复行方法
2019/01/23 Python
使用python获取邮箱邮件的设置方法
2019/09/20 Python
python实现身份证实名认证的方法实例
2019/11/08 Python
python程序文件扩展名知识点详解
2020/02/27 Python
使用jupyter notebook将文件保存为Markdown,HTML等文件格式
2020/04/14 Python
零基础小白多久能学会python
2020/06/22 Python
Python使用pyenv实现多环境管理
2021/02/05 Python
建设单位项目负责人任命书
2014/06/06 职场文书
超市优秀员工获奖感言
2014/08/15 职场文书
留学推荐信中文范文
2015/03/26 职场文书
旗帜观后感
2015/06/08 职场文书
2015年音乐教学工作总结
2015/07/22 职场文书
学校标语口号大全
2015/12/26 职场文书
php中pcntl_fork详解
2021/04/01 PHP
Python基础之hashlib模块详解
2021/05/06 Python
mysql对于模糊查询like的一些汇总
2021/05/09 MySQL