簡單的24點小遊戲
遊戲規則
隨機生成4個數字(1-10),通過+-*/四則運算將4個數字算出24即可
遊戲設計
生成4個數字,並給出參考答案
- 隨機生成0-10之間的4個整數
- 窮舉4個數所有四則運算得出24點的所有組合
- 無法得到24點則重複上述兩點重新生成
遊戲實現
隨機生成4個整數
function createNums() {
return Array(4).fill('').map(item => Math.ceil(Math.random() * 10));
}
窮舉所有組合場景
- 列出4個數字所有的排列方式
- 列出4組數字間的3個運算符的所有排列方式
- 列出4組數字間存在括號的所有場景
- 將上面3種排列組合方式進行組合排列,計算值爲24的組合方式
生成4組數字的排列方式
將4組數字放置到數組內,通過遞歸方式得出所有排列方式的數組集合
function swap(arr, idx1, idx2) {
const temp = arr[idx1]
arr[idx1] = arr[idx2]
arr[idx2] = temp
}
function createArr(_arr) {
const tempArr = []
function getArr(arr, idx) {
if (idx >= arr.length - 1) {
tempArr.push([...arr])
} else {
for (let index = idx; index < arr.length; index++) {
swap(arr, index, idx)
getArr(arr, idx + 1)
swap(arr, index, idx)
}
}
}
getArr(_arr, 0);
return tempArr;
}
生成3個運算符的所有排列方式
排列方式爲4的3次方,通過4進制的方式進行排列
function getOperator () {
let i = 0
const wArr = []
while(i < 64) {
wArr.push([Math.floor(i / 16), Math.floor((i % 16) / 4), i % 4])
i++
}
return wArr
}
列出4組數字間存在括號的所有場景
a b c d
(a b) c d
a (b c) d
a b (c d)
(a b c) d
a (b c d)
(a b) (c d)
組合所有計算場景
計算得出可以算出成24點的組合就return
function run(arr) {
const tempArr = createArr(arr)
const wArr = getOperator()
for (let idx = 0; idx < tempArr.length; idx++) {
const [n1, n2, n3, n4] = tempArr[idx];
for (let idx2 = 0; idx2 < wArr.length; idx2++) {
const [w1, w2, w3] = wArr[idx2];
const arr2 = [
`${n1}${o[w1]}${n2}${o[w2]}${n3}${o[w3]}${n4}`,
`${n1}${o[w1]}(${n2}${o[w2]}${n3})${o[w3]}${n4}`,
`${n1}${o[w1]}(${n2}${o[w2]}${n3}${o[w3]}${n4})`,
`${n1}${o[w1]}${n2}${o[w2]}(${n3}${o[w3]}${n4})`,
`(${n1}${o[w1]}${n2})${o[w2]}${n3}${o[w3]}${n4}`,
`(${n1}${o[w1]}${n2})${o[w2]}(${n3}${o[w3]}${n4})`,
`(${n1}${o[w1]}${n2}${o[w2]}${n3})${o[w3]}${n4}`,
]
for (let idx3 = 0; idx3 < arr2.length; idx3++) {
const str = arr2[idx3];
if (eval(str) === 24) {
console.log(str)
return str
}
}
}
}
}