前言
昨天在群里看到了一个分享的小游戏《王者算
24点
》
然后开心地分享了自己
340秒
算10个
的战绩
结果被小青瞬间KO。。她用
202秒
就结束了
既然作为程序员,那就用程序员的方式来继续战斗吧~
算法研究
说到
24点
,无非就是4个
数字之间的组合,也不知道是怎么写的,反正我最后算出来是有3888种
组合方式,只要算完这3888种
,就能找出结果了,不然就是没有结果
- 先从
4个
里挑1个
- 从剩下
3个
里挑1个
- 组合后计算出
1个
新的数字(通过加减乘除)- 去掉挑出的
2个
数字,加入新的数字- 循环往复
核心代码
/**
* 相当与是每一次计算的分布
* @param arr {Array} 一堆数字
* @param step {Array} 一堆步骤
*/
function getOneCalc(arr, step) {
step = step || [];
for (let i = 0; i < arr.length; i++) {
for (let j = i + 1; j < arr.length; j++) {
/**
* 0 a+b
* 1 a-b
* 2 b-a
* 3 a*b
* 4 a/b
* 5 b/a
*/
for (let z = 0; z < 6; z++) {
let newVal;
let newArr = getOtherNum(arr, i, j);
let newStep = JSON.parse(JSON.stringify(step));
if (z == 0) {
// 计算新的值
newVal = Number(arr[i]) + Number(arr[j]);
// 用来记录操作方法,最后看出流程用
newStep.push(arr[i] + '+' + arr[j]);
}
if (z == 1) {
newVal = arr[i] - arr[j];
newStep.push(arr[i] + '-' + arr[j]);
}
if (z == 2) {
newVal = arr[j] - arr[i];
newStep.push(arr[j] + '-' + arr[i]);
}
if (z == 3) {
newVal = arr[i] * arr[j];
newStep.push(arr[i] + '*' + arr[j]);
}
if (z == 4) {
newVal = arr[i] / arr[j];
newStep.push(arr[i] + '/' + arr[j]);
}
if (z == 5) {
newVal = arr[j] / arr[i];
newStep.push(arr[j] + '/' + arr[i]);
}
newArr.push(newVal);
if (newArr.length !== 1) {
// 如果还没有计算到最后的值,就继续计算
getOneCalc(newArr, newStep)
} else {
// 如果最后的结果正确,就打印计算流程
if (newArr[0] === 24) {
console.log(newArr[0], newStep);
}
}
}
}
}
}
最终效果
达成了
160秒
完成了10题
的成就,超越了99%
的玩家~
主要是输入和判断还要时间( •̀ ω •́ )y,不然还可以更快
小插叙
小青说少玩游戏,特别是这类游戏的整体感觉还不行(哈哈,论UI的重要性了),顺带一提,长期寻找UI美术小伙伴一起研发小游戏,有兴趣的可以联系我哈
tel:18868196263
~
体验地址
https://tekii.cn/public/24/
Chrome里面
textarea
换行有问题,可以在手机上访问该页面
项目地址
https://gitee.com/ko-orz/24/
特别感谢
[1] 匿名. 《王者算24点》2019-02-12
[2] 小青. 体验游戏 2019-02-20
[3] 写了这篇文章的2019年02月21日21时29分的Maxmon