English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

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をクラス属性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);
/*結果:エnumeratingオブジェクト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はエnumeratingオブジェクトを継承し、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:3Four:4Five:5Six:6Seven:7,エイト:8,ナイン:9,テン:10,
            ジャック:11,クイーン:12,キング:13,エース:14,ツー:15,スモールジョーカー:16,ビッグジョーカー:17} );
Card.prototype.toString = function(){
  return this.rank.toString() +「の」+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学習ノートの整理_シンプルなエンマージュタイプ、トランプのアプリケーションの全てが終わりました。皆様の助けになれば幸いです。応援して、ナイアラチュートリアルを応援してください~

基本教程
おすすめ