//实现枚举类型,扑克牌应用
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 是允许给基本类型扩充功能的.例如,可以通过对Object.prototype增加方法,可以让该方法对所有的对象都可用. 这样的方式对函数,数组,字符串,数字,正则表达式和布尔值同 ...
- effective-java学习笔记---使用枚举类型替代整型常量34
1.要将数据与枚举常量相关联,请声明实例属性并编写一个构造方法,构造方法带有数据并将数据保存在属性中. // Enum type with data and behavior public enum ...
- Swift 学习笔记 enum 枚举类型
异端,异端啊,我感觉这是map吧? enum ATMStatus { case Success(Int) case Error(String) } func withdraw(amount: Int) ...
- javascript学习笔记(四) Number 数字类型
数字格式化方法toFixed().toExponential().toPrecision(),三个方法都四舍五入 toFixed() 方法指定小数位个数 toExponential() 方法 用科学 ...
- Java程序猿的JavaScript学习笔记(9—— jQuery工具方法)
计划按例如以下顺序完毕这篇笔记: Java程序猿的JavaScript学习笔记(1--理念) Java程序猿的JavaScript学习笔记(2--属性复制和继承) Java程序猿的JavaScript ...
- Java程序猿的JavaScript学习笔记(8——jQuery选择器)
计划按例如以下顺序完毕这篇笔记: Java程序猿的JavaScript学习笔记(1--理念) Java程序猿的JavaScript学习笔记(2--属性复制和继承) Java程序猿的JavaScript ...
- Java程序猿JavaScript学习笔记(2——复制和继承财产)
计划和完成在这个例子中,音符的以下序列: Java程序猿的JavaScript学习笔记(1--理念) Java程序猿的JavaScript学习笔记(2--属性复制和继承) Java程序猿的JavaSc ...
- Java程序猿JavaScript学习笔记(4——关闭/getter/setter)
计划和完成这个例子中,音符的顺序如下: Java程序猿的JavaScript学习笔记(1--理念) Java程序猿的JavaScript学习笔记(2--属性复制和继承) Java程序猿的JavaScr ...
- CLR_Via_C#学习笔记之枚举
CLR_Via_C#学习笔记之枚举 枚举类型(Enum)定义的一组"符号名称/值"配对:因为枚举类型使用程序更容易编写.阅读和维护,而且它是强类型: 枚举是值类型:由System. ...
随机推荐
- 邻接矩阵有向图(一)之 C语言详解
本章介绍邻接矩阵有向图.在"图的理论基础"中已经对图进行了理论介绍,这里就不再对图的概念进行重复说明了.和以往一样,本文会先给出C语言的实现:后续再分别给出C++和Java版本的实 ...
- (转)JS模块化编程之AMD规范
模块的规范 原文地址 先想一想,为什么模块很重要? 因为有了模块,我们就可以更方便地使用别人的代码,想要什么功能,就加载什么模块. 但是,这样做有一个前提,那就是大家必须以同样的方式编写模块,否则你有 ...
- 再次用CodeIgniter实现简易blog
天变冷了,人也变得懒了不少,由于工作的需要,最近一直在学习CodeIgniter(CI)框架的使用,没有系统的从PHP基本语法学起,在网上靠百度谷歌,东拼西凑的实现了一些简单的功能.所以,老PHPer ...
- 一篇学习HTTP状态码的神文:我与依依的橙色岁月
好的,事情是这样的,数年前,我曾有过一段美好的夏日恋情,在此与大家分享. 依依 这个女孩叫做依依 ,她是 80 后的,生日是 1989 年 3 月吧,忘了哪一天了,分手太久了,记不起来了. 转学生 我 ...
- ASP.NET MVC系列:添加模型的验证规则
首先,在模型类中引用 System.ComponentModel.DataAnnotations 命名空间;System.ComponentModel.DataAnnotations 命名空间提供定义 ...
- 基于C#的MongoDB数据库开发应用(3)--MongoDB数据库的C#开发之异步接口
在前面的系列博客中,我曾经介绍过,MongoDB数据库的C#驱动已经全面支持异步的处理接口,并且接口的定义几乎是重写了.本篇主要介绍MongoDB数据库的C#驱动的最新接口使用,介绍基于新接口如何实现 ...
- 驱动开发利器Microsoft Windows Driver Kit 7.1.0下载
在Windows 2000 与Windows XP 系统采用是WINDDK来开发WINDOWS驱动程序,我手头也有WINDDK,可是从Windows Vista开始之后,一般采用Microsoft W ...
- VC中实现文字竖排的简单方法
好多人都觉得在VC中实现文字竖排是一件很难的事情,其实可以使用“躺”着的字体很方便的实现文字竖排. Windows中有一些字体是“躺”着的,例如:@Fixedsys.@System.@宋体.@黑体等等 ...
- TextBox禁止复制粘贴和数字验证,小数验证,汉字验证
验证小数 #region 验证小数 /// <summary> /// 验证小数 /// </summary> /// <param name="sender& ...
- DataTable 除去列中重复值
DataTable dtPCI = dtblSourceData.DefaultView.ToTable(true, new string[] { "Server Cell PCI" ...