zoukankan      html  css  js  c++  java
  • JavaScript学习笔记-实现枚举类型,扑克牌应用

    //实现枚举类型,扑克牌应用
    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);
    }
     
     
  • 相关阅读:
    CDH中flume是已经启动着了…
    CDH中,执行HIVE脚本表联查权限问题。。
    linux screen 命令详解(未验证+研究)
    004ICMP-type对应表
    003iptables 命令介绍
    002利用zabbix监控某个目录大小
    Nginx图片剪裁模块探究 http_image_filter_module
    linux增加自定义path和manpath
    TortoiseSVN中图标的含义
    Linux SVN 搭建(YUM)安装
  • 原文地址:https://www.cnblogs.com/susufufu/p/5705778.html
Copyright © 2011-2022 走看看