自己想实现一个扑克牌的发牌算法,花色不知道怎么下手,求指点:
const pools = ["2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A", "red Joker", "black Joker"];
const types = ["♠", "♥", "♣", "♦"];
// pools 点数,types 花色,count 张数
function getRandom(pools, types, count) {
const arr = [];
for (let i = 0; i < count; i++) {
// 获取点数(大小王)
let pool = pools[Math.floor(Math.random() * pools.length)];
// 获取花色
let type = types[Math.floor(Math.random() * types.length)];
// 获取组合
let poker = pool === 'red Joker' || pool === 'black Joker' ? pool : type + pool;
// 组合去重
arr.indexOf(poker) == -1 ? arr.push(poker) : i--;
}
return arr;
}
getRandom(pools, types, 7) // ["♥8", "♠4", "♠2", "♣5", "♠10", "♦3", "black Joker"]
我的实现
const POOL = ['2','3','4','5','6','7','8','9','10','J','Q','K','A','redJoker','blackJoker'];
const TYPE = ['spade','heart','diamond','club'] //黑桃、红桃、方片、梅花
function getRandom(pool,type,num){
var result = [],
lengthP = pool.length,
lengthT = type.length;
return function(){
var poolTemp = '' , typeTemp = '' ,resultTemp = '';
while(num){
poolTemp = pool[Math.floor(Math.random()*lengthP)];
typeTemp = /^(red)|(black)Joker$/.test(poolTemp) ? '' : type[Math.floor(Math.random()*lengthT)];
resultTemp = poolTemp+typeTemp;
if(result.indexOf(resultTemp) !=-1) continue;
result.push(resultTemp);
num--;
}
return result
}
}
var result = getRandom(POOL,TYPE,8)();
console.log(result.join(',')) //4club,7diamond,10spade,8heart,3spade,9spade,Jspade,Jheart
二维数组, 或者四个数组,
var base = [[s2,..., sA], [h2, ..., hA], [...], [...]];
或
var spade = [2, ... , A], heart = [...], club = [...], diamond = [...];
1. 首先深拷贝 这个base数组或s h c d四个数组 //为了不破坏声明的默认值.
2. 随机选择其中一个数组(花色)
3. 取值, splice这个值.//剩余的即为未发的牌
循环即可.
四个数组(或二维数组), 可以满足多重需求.
建议仔细考虑一下.
8 回答4.6k 阅读✓ 已解决
6 回答3.3k 阅读✓ 已解决
5 回答2.8k 阅读✓ 已解决
5 回答6.3k 阅读✓ 已解决
4 回答2.2k 阅读✓ 已解决
4 回答2.7k 阅读✓ 已解决
3 回答2.4k 阅读✓ 已解决
首先,楼主你贴出来的这个发牌算法有问题(没有考虑重复问题),比如第一张发了A,第二张就不应该再能有A了。
然后说下本题的解法,首先基于你的提问,猜测你是做一个类似扑克牌的程序,想要实现随机发牌功能,那么基于这一点,考虑到后续可能的需求变更(比如随机发4张,...,54张),因此拓展为随机发N(n<=54)张扑克牌,这时回答的方向就很明朗了:这是一个典型的扑克牌随机洗牌算法(洗牌后可以随机发出所有的扑克牌)
代码实现(JS实现)
代码详解
上述代码中核心算法是洗牌算法,这里就不赘述了,可以自行搜索,网上有大量相关资源与教程。
另外,没有做其它相关的封装操作,实际过程中建议自行良好的封装起来。