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与iframe的那些事儿
Jul 04 Javascript
用JS实现3D球状标签云示例代码
Dec 01 Javascript
javascript数组去重方法终极总结
Jun 05 Javascript
JavaScript使用ActiveXObject访问Access和SQL Server数据库
Apr 02 Javascript
Angularjs整合微信UI(weui)
Mar 15 Javascript
深入理解JavaScript中的call、apply、bind方法的区别
May 30 Javascript
javascript简单实现等比例缩小图片的方法
Jul 27 Javascript
js实现交通灯效果
Jan 13 Javascript
vue引入新版 vue-awesome-swiper插件填坑问题
Jan 25 Javascript
使用RN Animated做一个“添加购物车”动画的方法
Sep 12 Javascript
通过实例讲解JS如何防抖动
Jun 15 Javascript
vue样式穿透 ::v-deep的具体使用
Jun 04 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
BBS(php &amp; mysql)完整版(六)
2006/10/09 PHP
php的access操作类
2008/04/09 PHP
php使用指定编码导出mysql数据到csv文件的方法
2015/03/31 PHP
PHP大神的十大优良习惯
2016/09/14 PHP
PHP7 mongoDB扩展使用的方法分享
2019/05/02 PHP
云网广告中的代码,提示出错,大家找找
2006/11/21 Javascript
jQuery队列控制方法详解queue()/dequeue()/clearQueue()
2010/12/02 Javascript
jQuery实现的Email中的收件人效果(按del键删除)
2011/03/20 Javascript
详细分析JavaScript函数定义
2015/07/16 Javascript
纯js模拟div层弹性运动的方法
2015/07/27 Javascript
chrome浏览器当表单自动填充时如何去除浏览器自动添加的默认样式
2015/10/09 Javascript
js判断移动端是否安装某款app的多种方法
2015/12/18 Javascript
jQuery实现立体式数字滚动条增加效果
2016/12/21 Javascript
bootstrap table分页模板和获取表中的ID方法
2017/01/10 Javascript
javascript验证香港身份证的格式或真实性
2017/02/07 Javascript
JS对象的深度克隆方法示例
2017/03/16 Javascript
实例讲解DataTables固定表格宽度(设置横向滚动条)
2017/07/11 Javascript
Nodejs对postgresql基本操作的封装方法
2019/02/20 NodeJs
js+canvas实现纸牌游戏
2020/03/16 Javascript
逐行分析鸿蒙系统的 JavaScript 框架(推荐)
2020/09/17 Javascript
Python 模拟购物车的实例讲解
2017/09/11 Python
python版opencv摄像头人脸实时检测方法
2018/08/03 Python
python 移动图片到另外一个文件夹的实例
2019/01/10 Python
pandas DataFrame 交集并集补集的实现
2019/06/24 Python
Python中查看变量的类型内存地址所占字节的大小
2019/06/26 Python
python 函数的缺省参数使用注意事项分析
2019/09/17 Python
python 解决tqdm模块不能单行显示的问题
2020/02/19 Python
Python argparse模块使用方法解析
2020/02/20 Python
python 实现两个npy档案合并
2020/07/01 Python
Superdry极度乾燥官网:日本街头风格,纯英国制造品牌
2016/10/31 全球购物
PHP面试题及答案二
2015/05/23 面试题
上海某公司.net方向笔试题
2014/09/14 面试题
教师自我鉴定
2013/12/13 职场文书
献爱心倡议书
2014/04/14 职场文书
2015年勤工助学工作总结
2015/04/29 职场文书
MySQL 聚合函数排序
2021/07/16 MySQL