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创建命名空间(namespace)的最简实现
Dec 11 Javascript
IE6浏览器下resize事件被执行了多次解决方法
Dec 11 Javascript
js 判断控件获得焦点的示例代码
Mar 04 Javascript
JavaScript的removeChild()函数用法详解
Dec 27 Javascript
基于JavaScript实现轮播图原理及示例
Apr 10 Javascript
通俗解释JavaScript正则表达式快速记忆
Aug 23 Javascript
微信小程序实现image组件图片自适应宽度比例显示的方法
Jan 16 Javascript
vue-cli监听组件加载完成的方法
Sep 07 Javascript
css配合JavaScript实现tab标签切换效果
Oct 11 Javascript
Vue-Cli 3.0 中配置高德地图的两种方式
Jun 19 Javascript
vue使用svg文件补充-svg放大缩小操作(使用d3.js)
Sep 22 Javascript
解决vue init webpack 下载依赖卡住不动的问题
Nov 09 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
深入PHP许愿墙模块功能分析
2013/06/25 PHP
基于PHP实现商品成交时发送短信功能
2016/05/11 PHP
JavaScript版代码高亮
2006/06/26 Javascript
对象的类型:本地对象(1)
2006/12/29 Javascript
优秀js开源框架-jQuery使用手册(1)
2007/03/10 Javascript
JAVASCRIPT  THIS详解 面向对象
2009/03/25 Javascript
js获取网页可见区域、正文以及屏幕分辨率的高度
2014/05/15 Javascript
JavaScript多线程详解
2015/08/12 Javascript
jquery实现ajax加载超时提示的方法
2016/07/23 Javascript
浅谈jQuery中的checkbox问题
2016/08/10 Javascript
javascript数据结构中栈的应用之符号平衡问题
2017/04/11 Javascript
深入理解Angular中的依赖注入
2017/06/26 Javascript
详解Vuex管理登录状态
2017/11/13 Javascript
微信小程序实现横向增长表格的方法
2018/07/24 Javascript
Vue-router的使用和出现空白页,路由对象属性详解
2018/09/03 Javascript
微信小程序常见页面跳转操作简单示例
2019/05/01 Javascript
js 实现 list转换成tree的方法示例(数组到树)
2019/08/18 Javascript
详解Vue.js 作用域、slot用法(单个slot、具名slot)
2019/10/15 Javascript
vue绑定class的三种方法
2020/12/24 Vue.js
Python多线程同步Lock、RLock、Semaphore、Event实例
2014/11/21 Python
Django中更新多个对象数据与删除对象的方法
2015/07/17 Python
200行自定义python异步非阻塞Web框架
2017/03/15 Python
Python使用struct处理二进制的实例详解
2017/09/11 Python
python安装教程
2018/02/28 Python
python使用生成器实现可迭代对象
2018/03/20 Python
在Python中输入一个以空格为间隔的数组方法
2018/11/13 Python
Python中输入和输出(打印)数据实例方法
2019/10/13 Python
配置H5的滚动条样式的示例代码
2018/03/09 HTML / CSS
澳大利亚波西米亚风连衣裙在线商店:Fortunate One
2019/04/01 全球购物
优秀学生自我鉴定范例
2013/12/18 职场文书
战略性融资合作协议书范本
2014/10/17 职场文书
涉外离婚协议书怎么写
2014/11/20 职场文书
给老婆道歉的话
2015/01/20 职场文书
开学典礼校长致辞
2015/07/29 职场文书
深入解析NumPy中的Broadcasting广播机制
2021/05/30 Python
使用 CSS 构建强大且酷炫的粒子动画效果
2022/08/14 HTML / CSS