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

<script type="text/javascript">
/*** 这个函数创建一个新的枚举类型,实参对象表示类的每个实例的名字和值* 返回值是一个构造函数,它标识这个新类* 注意,这个构造函数也会抛出异常,不能使用它来创建该类型的新实例* 返回的构造函数包含名/值对的映射表* 包括由值组成的数组,以及以个foreach()迭代器函数*/
function enumeration(namesToValues){//这个虚拟的构造函数式返回值var enumeration = function(){throw "Can't Instantiate Enumeration"};//枚举值继承自这个对象var proto = enumeration.prototype = {constructor:enumeration,            //标识类型toString     : function(){ return this.name; },  //返回名字valueOf     : function(){ return this.value;},    //返回值toJSON         : function(){ return this.name; },    //转为JSON
    };enumeration.values =[];            //用以存放枚举对象的数组//现在创建新类型的实例for( name in namesToValues){        //遍历每个值var e = Object.create(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;
}//枚举类型使用示例:
console.log("枚举类型使用示例:");
var e = new enumeration({a:1,b:2,c:3});
console.log(e);
console.log(e.values);
e.foreach(console.log,e);//枚举类型表示一副扑克牌:
console.log("枚举类型表示一副扑克牌:");//定义个已个表示“玩牌”的类
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(){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.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[i] ,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);
};Deck.prototype.toString = function(){var s = "";for( var x in this.cards){console.log(this.cards[x].suit);console.log(this.cards[x].rank);s += "{"+this.cards[x].suit.toString()+"  "+this.cards[x].rank.value+"}   ";}return s;
};// 创建一副新扑克牌,洗牌并发牌
var deck = (new Deck()).shuffle();
var hand = deck.deal(13).sort(Card.orderBySuit);
deck.toString();
console.log(deck.toString());
//console.log(hand);
// console.log(hand.name);</script>

 

转载于:https://www.cnblogs.com/ctsch/p/6915334.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/468501.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

要用什么态度去面对生活?

最近&#xff0c;张扣扣的新闻铺天盖地&#xff0c;因为我非常喜欢逛知乎&#xff0c;刚好张扣扣的新闻这几天上了知乎热搜&#xff0c;所以我就关注上了&#xff0c;说实话&#xff0c;有点痛心&#xff0c;外人看起来很爽&#xff0c;忍辱负重好多年&#xff0c;终于把自己的…

单纯形法求最小值的检验数_【运筹学】单纯形法(笔记和思考)

前言关于线性规划&#xff0c;在高中刚接触时就感觉&#xff0c;好像最优解都是在顶点取到&#xff0c;但是又不敢确定&#xff0c;毕竟这只是种感觉&#xff0c;并非通过数学证出&#xff0c;然后在接触到运筹学中的单纯形法之后&#xff0c;这一感觉才被确定下来&#xff0c;…

[leetcode 70]Climbing Stairs

You are climbing a stair case. It takes n steps to reach to the top. Each time you can either climb 1 or 2 steps. In how many distinct ways can you climb to the top? 爬台阶&#xff0c;你每次能够上一层或者两层&#xff0c;问上n层你共同拥有多少何种方法 f(n)f…

第3章 Linux内核调试手段之三

之前的内核调试&#xff0c;我觉得应该再加上下面的东西&#xff0c;只有好好把下面的几个问题研究透了&#xff0c;你可能才是一个真正的内核高手&#xff0c;或者说&#xff0c;你还不是一个高手&#xff0c;就是一个内核的普通工程师&#xff0c;这个是我和Z总聊天说的&…

中希尔排序例题代码_【数据结构与算法】这或许是东半球分析十大排序算法最好的一篇文章...

码农有道 历史文章目录(请戳我)关于码农有道(请戳我)前言本文全长 14237 字&#xff0c;配有 70 张图片和动画&#xff0c;和你一起一步步看懂排序算法的运行过程。预计阅读时间 47 分钟&#xff0c;强烈建议先收藏然后通过电脑端进行阅读。No.1 冒泡排序冒泡排序无疑是最为出名…

bzoj4639 博士的选取器

题意 给出一个长度为n的正整数序列,要求把它划分成若干个连续的区间,使得每个区间的数字之和都不超过给定的lim.最后的代价等于每个区间的最大值之和.求最小代价.n<300000 分析 定义f[i]表示前i个数划分成若干个区间的最小代价,一眼是个1D1D动态规划,猜测有决策单调性,打表发…

星期四随笔

周二的晚上&#xff0c;发了一篇文章&#xff0c;题目是《要用什么态度去面对生活》&#xff0c;发文是凌晨1点&#xff0c;早上7点起来&#xff0c;用手机刷了一下&#xff0c;很多回复&#xff0c;其中几个回复有点偏激&#xff0c;感觉被刺痛了&#xff0c;毕竟是睡着的&…

根据大小分割大文本_基于深度学习的图像分割在高德地图的实践

一、前言图像分割(Image Segmentation)是计算机视觉领域中的一项重要基础技术&#xff0c;是图像理解中的重要一环。图像分割是将数字图像细分为多个图像子区域的过程&#xff0c;通过简化或改变图像的表示形式&#xff0c;让图像能够更加容易被理解。更简单地说&#xff0c;图…

别人不让你发传单怎么办?

人生在世难免遇到几个傻逼&#xff0c;我今天没有上班&#xff0c;去外面兼职发了一天的传单&#xff0c;也许你们没有过发传单的经历&#xff0c;当然了&#xff0c;我也不是想为了增加人生阅历去发传单&#xff0c;单纯就是今天没什么事情&#xff0c;刚刚好公司停电&#xf…

模块化加载_谈谈双亲委派模型的第四次破坏-模块化

前言JDK9引入了Java模块化系统(Java Platform Moudle System)来实现可配置的封装隔离机制&#xff0c;同时JVM对类加载的架构也做出了调整&#xff0c;也就是双亲委派模型的第四次破坏。前三次破坏分别是&#xff1a;双亲委派模型推出之前&#xff0c;SPI机制&#xff0c;以及O…

第4章 原子操作

有一件事情&#xff0c;你不得不承认&#xff0c;C语言相对汇编来说是高级语言&#xff0c;为什么&#xff0c;因为高级语言会形成封装&#xff0c;比如&#xff0c;我需要把一个变量A&#xff0c;对于CPU来说&#xff0c;先从内存里把这个变量读进运算寄存器&#xff0c;然后运…

龙芯下中标系统C语言查找设备号_龙芯:主控进驻国产激光打印机并适配麒麟OS...

导读&#xff1a;龙芯中科宣布&#xff0c;龙芯1C0300B作为主控芯片&#xff0c;已经批量用于天津光电出品的多款激光打印机中&#xff0c;在打印扫描、通信控制、协议解析方面发挥着重要的作用。图&#xff1a;龙芯1C0300B 主控芯片龙芯1C系列是基于GS232处理器核的高性价比单…

随笔日记

最近加班比较多&#xff0c;昨晚上又坐了最后一班地铁回家&#xff0c;回到家已经是一点了&#xff0c;在路上遇到一个美团外卖的小哥&#xff0c;小哥跟我说&#xff0c;嗨&#xff0c;帅哥&#xff0c;我想借你的头盔用一下&#xff0c;你们可以想象一下&#xff0c;在晚上12…

C#的命名空间

对于大型组织而言&#xff0c;如果涉及到产品线&#xff0c;项目&#xff0c;公共平台很多&#xff0c;如何通过命名空间将所有代码有效的组织起来。就一个目的&#xff0c;用的时候能够很容易的找到。 对于命名空间在大型项目中&#xff0c;必须组织好&#xff0c;一般命名空间…

今日头条关键词排名怎么搜索_公众号搜索关键词排名、公众号怎么排名靠前

真正的互联网老鸟其实都知道&#xff0c;不管在线上推广什么产品都好&#xff0c;其实都没有所谓的难度&#xff0c;获取流量方式其实就是简单的一批&#xff0c;哪里有怎么玄乎&#xff0c;不管以后遇到什么问题&#xff0c;除了首先需要知道的核心关键词&#xff0c;无非就是…

​CPU单挑到群架发展史

CPU 又称中央处理器&#xff0c;搞软件开发的兄弟已经耳熟能详了&#xff0c;CPU 的发展史最基本的矛盾就是软件性能需求的快速提升与 CPU 技术工艺性能提升发展相对缓慢之间的矛盾。摩尔定律也是基于此背景&#xff0c;将硬件性能的有限提升给软件开发者一个预期&#xff0c;告…

JDK、JRE、JVM三者间的关系

JDK&#xff08;Java Development Kit&#xff09;是针对Java开发员的产品&#xff0c;是整个Java的核心&#xff0c;包括了Java运行环境JRE、Java工具和Java基础类库。Java Runtime Environment&#xff08;JRE&#xff09;是运行JAVA程序所必须的环境的集合&#xff0c;包含J…

典型方法_裴礼文老师编数学分析中的典型问题与方法练习参考答案的说明

裴礼文老师编《数学分析中的典型问题与方法》练习参考答案该书共计7章36节1036页&#xff0c;各章由知识点总结、例题和练习组成&#xff0c;知识点基本按照传统《数学分析》教材先后顺序跟进。例题和练习出自《数学分析》经典习题和近年《数学分析》考研试题&#xff0c;极具代…

第4章 原子操作 第二节

-------------------------------------------------------------上一章节说的原子操作&#xff0c;有同学在下面留言说&#xff0c;原子操作不是万能的吧&#xff1f;确实是&#xff0c;原子操作不是万能的&#xff0c;体系结构在完成原子操作部分也是花费了很大的心思&#x…

表格字体缩小 php_如何快速找出两个Excel表格不同的地方?

上一篇文章介绍了如何快速找出两个word文档不同的地方&#xff0c;这篇文章来说说如何快速找出两个Excel表格不同的地方&#xff0c;这里说的两个Excel表格&#xff0c;可以是同一个工作簿的不同sheet&#xff0c;也可以是两个不同的Excel文件&#xff0c;如下图&#xff1a;黄…