下面用枚举类型来实现一副扑克牌的类:

//定义一个玩牌的类
function Card(suit,rank){
function inherit(p){
if(p==null) throw TypeError();
if(Object.create) return Object.create(p); var t = typeof p;
if(t!=="object" && t!=="function") throw TypeError();
function f(){};
f.prototype = p;
return new f();
} function enumeration(namesToValues){
//这个虚拟的构造函数是返回值
var enumeration = function(){throw "Can't Instantiate Enumerations";}; //虚拟值继承自这个对象
var proto = enumeration.prototype = {
constructor:enumeration, //标志类型
toString:function(){return this.name;},
valueOf:function(){return this.value;},
toJSON:function(){return this.name;}
}; enumeration.values = []; //用以存放枚举对象的数组 //现在创建新类型的实例
for(name in namesToValues){ //遍历每个值
var e = inherit(proto); //创建一个代表它的对象
e.name = name;
e.value = namesToValues[name];
enumeration[name] = e;
enumeration.values.push(e);
} //一个类方法,用来对类的实例进行迭代
enumeration.foreach = function(f,c){
for(var i = 0;i<this.values.length;i++){
f.call(c,this.values[i]);
}
}; //返回标志这个新类型的构造函数
return enumeration;
} //定义一个玩牌的类
function Card(suit,rank){
this.suit = suit; //每张牌都有花色
this.rank = rank; //以及点数
} //使用枚举类型定义花色和点数
Card.Suit = enumeration({Clubs:1,Diamonds:2,Hearts:3,Spades:4});
Card.Rank = enumeration({Two:2,Three:3,Four:4,Five:5,Six:6,Seven:7,Eight:8,Nine:9,Ten:10,Jack:11,Queen:12,King:13,Ace:14}); //定义用以描述牌面的文本
Card.prototype.toString = function(){
return this.rank.toString() + " of " + this.suit.toString();
}; //比较两张扑克牌的大小
Card.prototype.compareTo = function(){
if(this.rank < that.rank) return -1;
if(this.rank < that.rank) return 1;
return 0;
}; //以扑克牌的玩法规则对牌进行排序的函数
Card.orderByRank = function(a,b){
return a.compareTo(b);
}; //以桥牌的玩法规则对扑克牌进行排序的函数
Card.orderBySuit = function(a,b){
if(a.suit < b.suit) return -1;
if(a.suit > b.suit) return 1;
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){
Card.Rank.foreach(function(r){
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 < 0) throw "Out of cards";
return this.cards.splice(this.cards.length - n,n);
}; var deck = (new Deck()).shuffle();
var hand = deck.deal(13).sort(Card.orderBySuit);
}

javascript练习-扑克牌的更多相关文章

  1. 用javascript把扑克牌理理顺!

    打扑克的人都知道,比如斗地主! 我们一般都会按照顺序把随机摸过来的牌从小到大的顺序在手上理整齐(记得小时候打牌两副牌手都抓不过来),这篇随笔就是想通过实现这个功能来熟悉下js中排序数组等相关知识. 用 ...

  2. JavaScript一个简易枚举类型实现扑克牌

    <script type="text/javascript"> /** * 这个函数创建一个新的枚举类型,实参对象表示类的每个实例的名字和值 * 返回值是一个构造函数, ...

  3. JavaScript学习笔记-实现枚举类型,扑克牌应用

    //实现枚举类型,扑克牌应用 function creatEnum(p){     //构造函数     var Enumeration = function(){throw 'can not Ins ...

  4. 十大经典排序算法总结(JavaScript描述)

    前言 读者自行尝试可以想看源码戳这,博主在github建了个库,读者可以Clone下来本地尝试.此博文配合源码体验更棒哦~~~ 个人博客:Damonare的个人博客 原文地址:十大经典算法总结 这世界 ...

  5. 【JavaScript中的正则表达式】

    原文地址:http://blog.csdn.net/xh16319/article/details/9987847 1. 正则表达式规则 1.1 普通字符 字母.数字.汉字.下划线.以及后边章节中没有 ...

  6. 第九章:Javascript类和模块

    (过年了,祝大家新年好!) 第6章详细介绍了javascript对象,每个javascript对象都是一个属性集合,相互之间没有任何联系.在javascript中也可以定义对象的类,让每个对象都共享某 ...

  7. 常见的排序算法总结(JavaScript)

    引言 排序算法是数据结构和算法之中的基本功,无论是在笔试还是面试,还是实际运用中都有着很基础的地位.这不正直七月,每年校招的备战期,所以想把常见的排序算法记录下来.在本篇文章中的排序算法使用 Java ...

  8. JavaScript案例开发之扑克游戏

    随着时代的发展,知识也在日益更新,但是基础知识永远不会过时,它是新时代的基石,更是我们进一步学习的保障,下面带着大家用JavaScript开发一款真正的扑克游戏,和大家一起分享,希望你们能够喜欢:闲话 ...

  9. 关于HTML、CSS、JavaScript三者关系的简述

    总述 我对于网页这部分的理解吧,对于静态网页来说,无非分为三部分:第一部分.HTML,第二部分.CSS,第三部分.JavaScript(这部分暂且放一边).这俩个给我的第一印象就是,这你妹的都是一串串 ...

随机推荐

  1. Redis(三)节省内部空间优化

    总体原则:key的名称不易过长,剩下的所有 能用纯数字表示的尽量用 Redis的每一个键值都是用一个redisObject结构体表示的结构体中有:    键值的类型(string/list/hash/ ...

  2. EL标签使用

    <%@ page language= "java" contentType="text/html;charset=UTF-8" %><html ...

  3. 关于arduino清空串口缓存(转)

    在arduino1.0之前的版本 Serial.flush()的作用是是清空串口缓存( dropping received incoming data).但在1.0之后的版本 Serial.flush ...

  4. @EnableAutoConfiguration

    1. spring文档 解释一: Enable auto-configuration of the Spring Application Context, attempting to guess an ...

  5. Linux入门学习 常用命令

    cd命令 功能是切换到指定的目录:命令格式:cd [目录名]有几个符号作为目录名有特殊的含义:"/"代表根目录.".."代表上一级目录."~" ...

  6. js自定义对象

    一,概述 在Java语言中,我们可以定义自己的类,并根据这些类创建对象来使用,在Javascript中,我们也可以定义自己的类,例如定义User类.Hashtable类等等. 目前在Javascrip ...

  7. linux 如何显示一个文件的某几行(中间几行)

    linux 如何显示一个文件的某几行(中间几行) [一]从第3000行开始,显示1000行.即显示3000~3999行 cat filename | tail -n +3000 | head -n 1 ...

  8. C++常用输出 cout、cerr、clog

    三者在C++中都是标准IO库中提供的输出工具: cout:写到标准输出的ostream对象: cerr:输出到标准错误的ostream对象,常用于程序错误信息: clog:也是输出标准错误流(这点儿和 ...

  9. solr安装笔记与定时器任务

    一:solr启动 目前solr最高版本为5.5.0版本,很多solr安装都是说将server文件copy到tomcat中,但是solr版本自带有jetty的启动方式 首先下载solr-5.5.0版本, ...

  10. C#范型不会用,求助~

    using Dapper; using Dapper.Contrib.Extensions; using System.Data.SqlClient; using System.Configurati ...