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 oop开发滑动(slide)菜单控件
Aug 25 Javascript
js导出txt示例代码
Jan 14 Javascript
Egret引擎开发指南之运行项目
Sep 03 Javascript
js 操作符汇总
Nov 08 Javascript
自己动手写的jquery分页控件(非常简单实用)
Oct 28 Javascript
jquery html动态添加的元素绑定事件详解
May 24 Javascript
使用JS组件实现带ToolTip验证框的实例代码
Aug 23 Javascript
react native基于FlatList下拉刷新上拉加载实现代码示例
Sep 30 Javascript
微信小程序中遇到的iOS兼容性问题小结
Nov 14 Javascript
在Vue项目中取消ESLint代码检测的步骤讲解
Jan 27 Javascript
vue-cli+axios实现文件上传下载功能(下载接收后台返回文件流)
May 10 Javascript
vue 实现弹窗关闭后刷新效果
Apr 08 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
第九节--绑定
2006/11/16 PHP
php的access操作类
2008/04/09 PHP
php类自动装载、链式操作、魔术方法实现代码
2017/07/23 PHP
JAVASCRIPT keycode总结
2009/02/04 Javascript
JQuery1.4+ Ajax IE8 内存泄漏问题
2010/10/15 Javascript
JavaScript原型链示例分享
2014/01/26 Javascript
可恶的ie8提示缺少id未定义
2014/03/20 Javascript
ajaxFileUpload.js插件支持多文件上传的方法
2014/09/02 Javascript
js实现发送验证码后的倒计时功能
2015/05/28 Javascript
在Mac OS下使用Node.js的简单教程
2015/06/24 Javascript
BootStrap实现轮播图效果(收藏)
2016/12/30 Javascript
微信小程序 选项卡的简单实例
2017/05/24 Javascript
利用C/C++编写node.js原生模块的方法教程
2017/07/07 Javascript
AngularJS使用$http配置对象方式与服务端交互方法
2018/08/13 Javascript
js变量声明var使用与不使用的区别详解
2019/01/21 Javascript
iview tabs 顶部导航栏和模块切换栏的示例代码
2019/03/04 Javascript
JS co 函数库的含义和用法实例总结
2020/04/08 Javascript
Python中字符串的处理技巧分享
2016/09/17 Python
Python实现的堆排序算法原理与用法实例分析
2017/11/22 Python
flask中主动抛出异常及统一异常处理代码示例
2018/01/18 Python
python快排算法详解
2019/03/04 Python
python使用time、datetime返回工作日列表实例代码
2019/05/09 Python
聊聊python里如何用Borg pattern实现的单例模式
2019/06/06 Python
Python中拆分字符串的操作方法
2019/07/23 Python
瑞典时尚服装购物网站:Miinto.se
2017/10/30 全球购物
美国优质马术服装购买网站:Breeches.com
2019/12/16 全球购物
服装厂厂长职责
2013/12/16 职场文书
纪念九一八事变演讲稿:忘记意味着背叛
2014/09/14 职场文书
2014年食品安全工作总结
2014/12/04 职场文书
婚庆答谢词
2015/01/04 职场文书
检讨书范文500字
2015/01/28 职场文书
高考1977观后感
2015/06/04 职场文书
生活委员竞选稿
2015/11/21 职场文书
2016小学教师读书心得体会
2016/01/13 职场文书
MySQL修改默认引擎和字符集详情
2021/09/25 MySQL
Python Pygame实战在打砖块游戏的实现
2022/03/17 Python