javascript练习-扑克牌
下面用枚举类型来实现一副扑克牌的类:
//定义一个玩牌的类
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练习-扑克牌的更多相关文章
- 用javascript把扑克牌理理顺!
打扑克的人都知道,比如斗地主! 我们一般都会按照顺序把随机摸过来的牌从小到大的顺序在手上理整齐(记得小时候打牌两副牌手都抓不过来),这篇随笔就是想通过实现这个功能来熟悉下js中排序数组等相关知识. 用 ...
- JavaScript一个简易枚举类型实现扑克牌
<script type="text/javascript"> /** * 这个函数创建一个新的枚举类型,实参对象表示类的每个实例的名字和值 * 返回值是一个构造函数, ...
- JavaScript学习笔记-实现枚举类型,扑克牌应用
//实现枚举类型,扑克牌应用 function creatEnum(p){ //构造函数 var Enumeration = function(){throw 'can not Ins ...
- 十大经典排序算法总结(JavaScript描述)
前言 读者自行尝试可以想看源码戳这,博主在github建了个库,读者可以Clone下来本地尝试.此博文配合源码体验更棒哦~~~ 个人博客:Damonare的个人博客 原文地址:十大经典算法总结 这世界 ...
- 【JavaScript中的正则表达式】
原文地址:http://blog.csdn.net/xh16319/article/details/9987847 1. 正则表达式规则 1.1 普通字符 字母.数字.汉字.下划线.以及后边章节中没有 ...
- 第九章:Javascript类和模块
(过年了,祝大家新年好!) 第6章详细介绍了javascript对象,每个javascript对象都是一个属性集合,相互之间没有任何联系.在javascript中也可以定义对象的类,让每个对象都共享某 ...
- 常见的排序算法总结(JavaScript)
引言 排序算法是数据结构和算法之中的基本功,无论是在笔试还是面试,还是实际运用中都有着很基础的地位.这不正直七月,每年校招的备战期,所以想把常见的排序算法记录下来.在本篇文章中的排序算法使用 Java ...
- JavaScript案例开发之扑克游戏
随着时代的发展,知识也在日益更新,但是基础知识永远不会过时,它是新时代的基石,更是我们进一步学习的保障,下面带着大家用JavaScript开发一款真正的扑克游戏,和大家一起分享,希望你们能够喜欢:闲话 ...
- 关于HTML、CSS、JavaScript三者关系的简述
总述 我对于网页这部分的理解吧,对于静态网页来说,无非分为三部分:第一部分.HTML,第二部分.CSS,第三部分.JavaScript(这部分暂且放一边).这俩个给我的第一印象就是,这你妹的都是一串串 ...
随机推荐
- 事务BEGIN TRANSACTION
事务(Transaction)是并发控制的基本单位.所谓的事务,它是一个操作序列,这些操作要么都执行,要么都不执行,它是一个不可分割的工作单位.例如,银行转账工作:从一个账号扣款并使另一个账号增款,这 ...
- hdu 3307 Description has only two Sentences (欧拉函数+快速幂)
Description has only two SentencesTime Limit: 3000/1000 MS (Java/Others) Memory Limit: 65536/32768 K ...
- 游戏中的人工智能——初探AI
一.游戏中的人工智能 让游戏具有挑战性: 让游戏好玩的关键因素是为之找到合适的难度等级: 人工智能在游戏中的作用是通过提供富有挑战性的竞争对象来让游戏更好玩,而在游戏中行动逼真的非玩家角色(NPC), ...
- EF测试自动修改数据库结构
1.配置类 <connectionStrings> <add name="test1" connectionString="Data Source=.; ...
- kendoui treeview grid spreadsheet
treeview 傻子方式获取id <!DOCTYPE html> <html> <head> <title>API</title> < ...
- python实验二:字符串排序
##统计word中的各个字符的出现的次数,并统计出所有前十名的字符使用次数 # -*- coding:utf-8 -*- word='''awfesdafhjkcasadckjsdackjsadvcn ...
- numberOfRowsInSection方法什么时候调用
昨天在代码里遇到个问题,很简单的数组越界,但是真心觉得自己把数据处理的思路都理清了不应该会出现这种情况,而且打印出来出现了"灵异事件",那就是行数只有14行,但是cell加载到了1 ...
- textArea 高度自适应
<textarea name="apparatus" class="dhxTextArea" style="width:100%;height: ...
- three.js 根据png生成heightmap
Three.js: render real world terrain from heightmap using open data By jos.dirksen on Tue, 07/17/2012 ...
- Codeforces 740C. Alyona and mex 思路模拟
C. Alyona and mex time limit per test: 2 seconds memory limit per test: 256 megabytes input: standar ...