js扑克牌发牌算法

自己想实现一个扑克牌的发牌算法,花色不知道怎么下手,求指点:

https://img1.mukewang.com/5bf8c0280001b52c08320845.jpg

慕桂英546537
浏览 1719回答 1
1回答

鸿蒙传说

首先,楼主你贴出来的这个发牌算法有问题(没有考虑重复问题),比如第一张发了A,第二张就不应该再能有A了。然后说下本题的解法,首先基于你的提问,猜测你是做一个类似扑克牌的程序,想要实现随机发牌功能,那么基于这一点,考虑到后续可能的需求变更(比如随机发4张,...,54张),因此拓展为随机发N(n<=54)张扑克牌,这时回答的方向就很明朗了:这是一个典型的扑克牌随机洗牌算法(洗牌后可以随机发出所有的扑克牌)代码实现(JS实现)// 洗牌算法,传入一个数组,随机乱序排列,不污染原数组function shuffle(arr) {&nbsp; &nbsp; if (!arr) {&nbsp; &nbsp; &nbsp; &nbsp; throw '错误,请传入正确数组';&nbsp; &nbsp; }&nbsp; &nbsp; var newArr = arr.slice(0);&nbsp; &nbsp; for (var i = newArr.length - 1; i >= 0; i--) {&nbsp; &nbsp; &nbsp; &nbsp; // 随机范围[0,1)&nbsp; &nbsp; &nbsp; &nbsp; var randomIndex = Math.floor(Math.random() * (i + 1));&nbsp; &nbsp; &nbsp; &nbsp; var itemAtIndex = newArr[randomIndex];&nbsp; &nbsp; &nbsp; &nbsp; newArr[randomIndex] = newArr[i];&nbsp; &nbsp; &nbsp; &nbsp; newArr[i] = itemAtIndex;&nbsp; &nbsp; }&nbsp; &nbsp; return newArr;}// 生成一副扑克牌function generatePoker() {&nbsp; &nbsp; // 第一步:定义四个花色,这里就用中文了&nbsp; &nbsp; var cardType = ['黑桃', '红桃', '梅花', '方块'];&nbsp; &nbsp; // 第二步:定义13张普通牌&nbsp; &nbsp; var cardValue = ['A', '2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K'];&nbsp; &nbsp; // 第三步:定义2张特殊牌,大王与小王&nbsp; &nbsp; var specialCard = ['大王', '小王'];&nbsp; &nbsp; // 第四步:根据上述数组生成54张牌&nbsp; &nbsp; var allCards = [];&nbsp; &nbsp; for (var i = 0,&nbsp; &nbsp; len1 = cardType.length; i < len1; i++) {&nbsp; &nbsp; &nbsp; &nbsp; for (var j = 0,&nbsp; &nbsp; &nbsp; &nbsp; len2 = cardValue.length; j < len2; j++) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; allCards.push(cardType[i] + cardValue[j]);&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }&nbsp; &nbsp; allCards = allCards.concat(specialCard);&nbsp; &nbsp; return allCards;}// 随机发N张扑克牌function dealPoker(num) {&nbsp; &nbsp; if(!num || num>54 || typeof(num)!== 'number') {&nbsp; &nbsp; &nbsp; &nbsp; throw '错误,传入的数字非法,只能是[1-54]';&nbsp; &nbsp; }&nbsp; &nbsp; // 生成扑克牌&nbsp; &nbsp; var allCards = generatePoker();&nbsp; &nbsp; // 洗牌-不污染原先的数组&nbsp; &nbsp; var randomCards = shuffle(allCards);&nbsp; &nbsp; return randomCards.slice(0, num);}// 测试用例console.log(dealPoker(3));console.log(dealPoker(4));console.log(dealPoker(10));// 生成一副洗好的全新乱序牌var poker = dealPoker(54);// 接下来如果想要发牌,依次将数组pop即可,因为它本身已经被打乱了,可以一直发完54张代码详解上述代码中核心算法是洗牌算法,这里就不赘述了,可以自行搜索,网上有大量相关资源与教程。另外,没有做其它相关的封装操作,实际过程中建议自行良好的封装起来。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript