游戏逻辑:拿一副牌,抽去大小王后,剩下1~10和JQK这些张牌。任意抽取4张牌(称为牌组),用加、减、乘、除把牌面上的数算成24。每张牌必须用且只能用一次。
实现思路:
- 先定义四张牌的数据结构,代码函数
dataWarp
:
{
r: number, // 扑克牌代表的数字
m: string // 运算的表达式(最后过滤出r === 24的时候,获取运算的方法)
}复制代码
- 假设只要两张牌,获取所有的计算结果的可能性,代码函数
calm
, - 降维计算四张牌,保持
a,b
不变,组合c,d
,代码函数allCalm
,要保证a,b,c,d都计算到,则需要计算a,b,c,d; a,c,b,d; a,d,c,b; b,c,a,d; b,d,c,a; c,d,b,a;
- 获取所有计算结果,匹配到等于24的数据,拉取出运算表达式
function dataWarp(...num) {
return num.map((a) => ({
m: a+'',
r: a
}));
}
function calm(a,b) {
var r = [
{
m: `(${a.m}+${b.m})`,
r: a.r+b.r
},
{
m: `(${a.m}-${b.m})`,
r: a.r-b.r
},
{
m: `(${b.m}-${a.m})`,
r: b.r-a.r
},
{
m: `(${a.m}*${b.m})`,
r: a.r*b.r
},
];
a.r !== 0 && r.push({
m: `(${b.m}/${a.m})`,
r: b.r/a.r
});
b.r !==0 && r.push({
m: `(${a.m}/${b.m})`,
r: a.r/b.r
});
return r;
}
function allCalm(a,b,c,d,u) {
var s = [], t = [];
calm(a,b).forEach((i) => {
s = s.concat(calm(i, c));
t = t.concat(calm(i, d));
});
s.forEach((i) => {
u = u.concat(calm(i, d));
});
t.forEach((i) => {
u = u.concat(calm(i, c));
});
return u;
}
function get24(a,b,c,d) {
[a,b,c,d]= dataWarp(a,b,c,d);
allCalm(c,d,b,a,allCalm(b,d,a,c,allCalm(b,c,a,d,allCalm(a,d,b,c,allCalm(a,c,b,d,allCalm(a,b,c,d,[])))))).forEach((i) => {
if (i.r === 24) {
console.log(i.m);
}
});
}复制代码