//实现枚举类型,扑克牌应用
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学习笔记-实现枚举类型,扑克牌应用的更多相关文章

  1. JavaScript 学习笔记: 扩充类型的功能

    JavaScript 是允许给基本类型扩充功能的.例如,可以通过对Object.prototype增加方法,可以让该方法对所有的对象都可用. 这样的方式对函数,数组,字符串,数字,正则表达式和布尔值同 ...

  2. effective-java学习笔记---使用枚举类型替代整型常量34

    1.要将数据与枚举常量相关联,请声明实例属性并编写一个构造方法,构造方法带有数据并将数据保存在属性中. // Enum type with data and behavior public enum ...

  3. Swift 学习笔记 enum 枚举类型

    异端,异端啊,我感觉这是map吧? enum ATMStatus { case Success(Int) case Error(String) } func withdraw(amount: Int) ...

  4. javascript学习笔记(四) Number 数字类型

    数字格式化方法toFixed().toExponential().toPrecision(),三个方法都四舍五入 toFixed() 方法指定小数位个数  toExponential() 方法 用科学 ...

  5. Java程序猿的JavaScript学习笔记(9—— jQuery工具方法)

    计划按例如以下顺序完毕这篇笔记: Java程序猿的JavaScript学习笔记(1--理念) Java程序猿的JavaScript学习笔记(2--属性复制和继承) Java程序猿的JavaScript ...

  6. Java程序猿的JavaScript学习笔记(8——jQuery选择器)

    计划按例如以下顺序完毕这篇笔记: Java程序猿的JavaScript学习笔记(1--理念) Java程序猿的JavaScript学习笔记(2--属性复制和继承) Java程序猿的JavaScript ...

  7. Java程序猿JavaScript学习笔记(2——复制和继承财产)

    计划和完成在这个例子中,音符的以下序列: Java程序猿的JavaScript学习笔记(1--理念) Java程序猿的JavaScript学习笔记(2--属性复制和继承) Java程序猿的JavaSc ...

  8. Java程序猿JavaScript学习笔记(4——关闭/getter/setter)

    计划和完成这个例子中,音符的顺序如下: Java程序猿的JavaScript学习笔记(1--理念) Java程序猿的JavaScript学习笔记(2--属性复制和继承) Java程序猿的JavaScr ...

  9. CLR_Via_C#学习笔记之枚举

    CLR_Via_C#学习笔记之枚举 枚举类型(Enum)定义的一组"符号名称/值"配对:因为枚举类型使用程序更容易编写.阅读和维护,而且它是强类型: 枚举是值类型:由System. ...

随机推荐

  1. [OpenCV] Samples 01: drawing

    基本的几何图形,标注功能. commondLineParser的使用参见:http://blog.csdn.net/u010305560/article/details/8941365 #includ ...

  2. 牛顿法与拟牛顿法学习笔记(三)DFP 算法

    机器学习算法中经常碰到非线性优化问题,如 Sparse Filtering 算法,其主要工作在于求解一个非线性极小化问题.在具体实现中,大多调用的是成熟的软件包做支撑,其中最常用的一个算法是 L-BF ...

  3. OkHttp,Retrofit 1.x - 2.x 基本使用

    Square 为广大开发者奉献了OkHttp,Retrofit1.x,Retrofit2.x,运用比较广泛,这三个工具有很多相似之处,初学者可能会有一些使用迷惑.这里来总结一下它们的一些基本使用和一些 ...

  4. Cordova webapp实战开发:(2)认识一下Cordova

    昨天写了第一篇 <Cordova webapp实战开发:(1)为什么选择 Cordova webapp?>,意料中看到大家对这个主题的兴趣,我新建的PhoneGap App开发 34819 ...

  5. 索引深入浅出(5/10):非聚集索引的B树结构在堆表

    在“索引深入浅出:非聚集索引的B树结构在聚集表”里,我们讨论了在聚集表上的非聚集索引,这篇文章我们讨论下在堆表上的非聚集索引. 非聚集索引可以在聚集表或堆表上创建.当我们在聚集表上创建非聚集索引时,聚 ...

  6. SQL Server代理(5/12):理解SQL代理错误日志

    SQL Server代理是所有实时数据库的核心.代理有很多不明显的用法,因此系统的知识,对于开发人员还是DBA都是有用的.这系列文章会通俗介绍它的很多用法. 如我们在这个系列的前几篇文章所见,SQL ...

  7. Shiro —— 从一个简单的例子开始

    一.Shiro是用来做权限的. 二.权限 1.基本概念: (1)安全实体:要保护的数据. (2)权限:是否有能力去操作(查看.修改.删除 )保护的数据. 2.权限的两个特性 (1)权限的继承性:A 包 ...

  8. 这些HTML、CSS知识点,面试和平时开发都需要 No5-No7

    系列知识点汇总 这些HTML.CSS知识点,面试和平时开发都需要 No1-No4(知识点:HTML.CSS.盒子模型.内容布局) 这些HTML.CSS知识点,面试和平时开发都需要 No5-No7(知识 ...

  9. c#设计模式之简单工厂

    1.面向对象的3大属性,封装.继承.多态,以一个加单的计算机为例: 创建一个父类Operation 有两个属性 和一个计算方法(虚方法),便于子类重写: public class Operation ...

  10. php+mysql+apache项目运行所遇到的一系列配置问题

    今天运行一个php项目时,突然发现访问不了了.起因应该是mac系统升级,导致apache配置文件完全恢复到了默认状态,一切归零.作为一个经验尚欠的前端,对这些后台配置完全是一窍不通,赶紧微信联系了小胖 ...