前几天,朋友找我一起做个扑克牌顺子的游戏, 由于忙于工作一直没时间看, 今天空下来研究一下;
顺带介绍下那位朋友, 萝卜爱吃青菜 有兴趣的朋友可以去他的博客逛逛, 里面有好多他的实用分享;
下面进入正题:
描述:从扑克牌中随机抽5 张牌,判断是不是一个顺子,即这5 张牌是不是连续的。2-10 为数字本身,A 为1,J 为11,Q 为12,K 为13,而大小王可以看成任意数字
1 function pokerGame() { 2 let pokerArr = []; // 存放54张牌 3 let testArr = []; // 存放随机抽取的5张牌 4 for(let i = 1; i < 14; i++) { 5 for(let j = 0; j < 4; j++) { 6 pokerArr.push(i) // 添加52张牌 进牌组 7 } 8 }; 9 10 // 添加大小鬼牌 11 pokerArr.push('x'); 12 pokerArr.push('X'); 13 14 // 随机抽取5张牌 进行测试 15 for(var i = 0; i < 5; i++) { 16 let length = pokerArr.length; 17 // 为了还原真实性, 每次抽取都会从原有牌组剩余部分 进行重新抽取 18 let randomNum = Math.floor(Math.random()*length); 19 let arr = pokerArr.splice(randomNum, 1) 20 testArr = testArr.concat(arr) 21 }; 22 23 // 进行测试 24 isStraight(testArr) 25 } 26 27 function isStraight(testArr) { 28 let arrFive = [...testArr]; // 对传入参数进行赋值, 29 let arr = []; // 用于存放 除大小鬼之外的数字牌 30 let ghost = 0; // 记录 大小鬼牌的张数 31 let bool = true; // 判定是否为顺子 32 33 // 记录鬼牌出现次数, 并在 arr 中剔除鬼牌 34 arrFive.forEach( item => { 35 isNaN(item) ? ghost++ : arr.push(item) 36 } ) 37 38 // 对剩余牌 进行排序 39 arr.sort( (a, b) => a - b ) 40 41 for(var i = arr.length-1; i > 0; i--) { 42 43 // 当前牌和下一张牌的差值 44 let val = arr[i] - arr[i-1]; 45 switch(val) { 46 case 1: 47 break; 48 case 2: 49 case 3: 50 // 因为鬼牌可以变成任意一张牌, 所以当差值为 2 和 3 时, 可以使用鬼牌进行替换, 鬼牌使用 这里要重新记录鬼牌是剩余张数 51 ghost -= (val-1) 52 break; 53 default: 54 // 如果差值为 0 则说明存在重复的牌,或者 55 // 如果差值大于 3 即使当前测试牌组 两张鬼牌都存在,也不能满足顺子要求, 直接判定 测试牌组不为顺子 56 return bool = false 57 } 58 59 if(ghost < 0) { 60 // 在循环内, 如果 ghost 小于0 说明 鬼牌次数使用完毕,仍不满足要求, 判定 测试牌组不为顺子 61 return bool = false 62 } 63 } 64 65 if(bool) { 66 console.log('「^^^^^^^^^^^^^^^^^^^^^^^^^^^^') 67 console.log('测试牌组', arrFive) 68 console.log(arr) 69 console.log('____________________________」') 70 } 71 } 72 73 // 进入循环测试 74 for(var i = 0; i < 30; i++) { 75 console.log('测试执行:', i+1) 76 pokerGame(); 77 }