遊戲邏輯:拿一副牌,抽去大小王后,剩下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);
}
});
}複製程式碼