javascript - 24 Math Game - Javascript 中的随机数生成器和求解器

标签 javascript

如何用 Javascript 创建 Game 24 的数字生成器? 随机数生成器应该只生成能够解决 24 问题的数字。仅生成能够解决问题的数字。

游戏规则:

您得到 4 个数字。您需要得到 24。您可以 +、x、- 和 % 这些数字来得到 24。

示例:4、2、8、1

((4-2) + 1) x 8 = 24

随机数生成器应该为您提供 4 个数字,组成 24。您不得获得任何不能组成 24 的数字,例如 1、1、1 和 2。

我只想使用整数。

我想稍微改变一下游戏。我可能不想总是使用 24,而是使用不同的数字,例如初学者使用 12,高级玩家使用 55,等等。

我是一个初学者,目的是学习 JavaScript。任何解释都会很棒。

最佳答案

这个 fiddle 展示了一种获取一系列数字的方法,这些数字可以以某种方式加起来为给定的数字:

jsFiddle

这是一种获取“随机”数字的简单方法,因为我只需对随机操作求和并在最后插入一个受控操作,以确保它可以产生所需的目标。

对于那些不想点击链接的人,我将转储下面的源代码:

console.clear();
function getNumberGame(target, length) {
    console.clear();
    var dataset = [];
    var methods = {
        'add' : function (a, b) {
            return (a + b);
        },
        'subtract' : function (a, b) {
            return a - b;
        },
        'multiply' : function (a, b) {
            if (a !== 0 && b !== 0 && a < Infinity && b < Infinity) {
                return Math.round(a * b);
            } else {
                return false;
            }
        },
        'divide' : function (a, b) {
            if (a !== 0 && b !== 0 && a < Infinity && b < Infinity) {
                return Math.round(a / b);
            } else {
                return false;
            }
        }
    }
    for (var i = 0; i < length - 1; i++) {
        var obj = {
            value : Math.round(Math.random() * target) + 1,
            method : Object.keys(methods)[Math.floor(Math.random() * Object.keys(methods).length)]
        };
        dataset.push(obj);
    }
    delete dataset[0].method;
    var data = dataset[0].value * 1;
    console.log('Start with ' + data);
    for (var i = 1; i < dataset.length; i++) {
        data = methods[dataset[i].method](data, dataset[i].value);
        console.log(dataset[i].method + " " + dataset[i].value + " to get " + data);
    }
    if (data > target) {
        dataset.push({
            value : Math.round(Math.abs(data - target)),
            method : 'subtract'
        });
        console.log("subtract " + dataset[dataset.length - 1].value + " to get " + target);
    } else if (data < target) {
        dataset.push({
            value : Math.round(Math.abs(data - target)),
            method : 'add'
        });
        console.log("add " + dataset[dataset.length - 1].value + " to get " + target);
    }
    var returnArray = [];
    while (dataset.length > 0) {
        var i = Math.floor(Math.random() * dataset.length);
        returnArray.push(dataset[i].value);
        dataset.splice(i, 1);
    }
    console.log(returnArray);
    alert("Make \"" + target + "\" by combining these " + length + ":\n" + returnArray.join(', '));
    return returnArray;
}

getNumberGame(parseInt(prompt("Target number", 24)), parseInt(prompt("Steps", 4)));

编辑 1

请注意,乘法除法函数中没有检查Infinity0,这可能会导致在一些奇怪的行为中。在这种情况下,我的代码只是返回 0(通过返回 false)。

关于javascript - 24 Math Game - Javascript 中的随机数生成器和求解器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37317622/

相关文章:

javascript - 如何创建一棵 promise 树?

javascript - AngularJS ng-repeat 在数组更新时不刷新

javascript - Web 动画 API - 如何在关键帧脚本中使用变量?

javascript - 如何匹配 C# 和 JS CryptoJS 生成的 Key & IV

javascript - 有没有办法在 ios 和 android 应用程序中使用公共(public)文件夹?

javascript - 为什么这段 Javascript 代码的行为是异步的?

javascript - 一个接一个地调用脚本

javascript - JS中的Excel PMT函数

javascript - Javascript 代码中的多个 CSS 转换

javascript - 将可拖动的 JQuery UI 放入 Droppable 部分后禁用它