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限制文本框为整数和货币的函数代码
Oct 13 Javascript
JQuery插件Style定制化方法的分析与比较
May 03 Javascript
你必须知道的Javascript知识点之&quot;深入理解作用域链&quot;的介绍
Apr 23 Javascript
浅谈Javascript如何实现匀速运动
Dec 19 Javascript
angularJS中router的使用指南
Feb 09 Javascript
JQuery boxy插件在IE中边角图片不显示问题的解决
May 20 Javascript
easyui关于validatebox实现多重规则验证的方法(必看)
Apr 12 Javascript
node中使用es6/7/8(支持性与性能)
Mar 28 Javascript
vue项目出现页面空白的解决方案
Oct 31 Javascript
微信小程序转化为uni-app项目的方法示例
May 22 Javascript
JavaScript arguments.callee作用及替换方案详解
Sep 02 Javascript
vue 中this.$set 动态绑定数据的案例讲解
Jan 29 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仿博客园 个人博客(2) 数据库增添改删
2013/07/05 PHP
php验证session无效的解决方法
2014/11/04 PHP
Thinkphp5 微信公众号token验证不成功的原因及解决方法
2017/11/12 PHP
PHP读取并输出XML文件数据的简单实现方法
2017/12/22 PHP
nginx 设置多个站跨域
2021/03/09 Servers
javascript学习笔记(十五) js间歇调用和超时调用
2012/06/20 Javascript
js 手机号码合法性验证代码集合
2012/09/29 Javascript
jquery如何判断某元素是否具备指定的样式
2013/11/05 Javascript
jquery 日期控件datepicker属性详细解析
2013/11/08 Javascript
JS+CSS实现简易的滑动门效果代码
2015/09/24 Javascript
js实现简单排列组合的方法
2016/01/27 Javascript
jquery插件jquery.LightBox.js实现点击放大图片并左右点击切换效果(附demo源码下载)
2016/02/25 Javascript
使用Script元素发送JSONP请求的方法
2016/06/12 Javascript
JavaScript cookie详解及简单实例应用
2016/12/31 Javascript
在vue中实现简单页面逆传值的方法
2017/11/27 Javascript
Vue 使用 Mint UI 实现左滑删除效果CellSwipe
2018/04/27 Javascript
JS实现动态无缝轮播
2020/01/11 Javascript
微信小程序自定义弹出模态框禁止底部滚动功能
2020/03/09 Javascript
使用konva和vue-konva库实现拖拽滑块验证功能
2020/04/27 Javascript
微信小程序实现文件预览
2020/10/22 Javascript
[01:25]DOTA2超级联赛专访iG 将调整状态找回自己
2013/06/05 DOTA
在Python3中使用asyncio库进行快速数据抓取的教程
2015/04/02 Python
python中set常用操作汇总
2016/06/30 Python
在python中使用requests 模拟浏览器发送请求数据的方法
2018/12/26 Python
Python3.6+Django2.0以上 xadmin站点的配置和使用教程图解
2019/06/04 Python
Pandas中Series和DataFrame的索引实现
2019/06/27 Python
学python需要去培训机构吗
2020/07/01 Python
竞聘医务工作人员的自我评价分享
2013/11/04 职场文书
文明礼仪事迹材料
2014/01/09 职场文书
活动总结格式范文
2014/04/26 职场文书
希特勒的演讲稿
2014/05/23 职场文书
工程进度款催款函
2015/06/24 职场文书
职工食堂管理制度
2015/08/06 职场文书
创业计划书之废品回收
2019/09/26 职场文书
教你利用python实现企业微信发送消息
2021/05/23 Python
uni-app 微信小程序授权登录的实现步骤
2022/02/18 Javascript