如何在Javascript中为第24游戏创建一个数字生成器?随机数生成器只应生成可解24的数字。只生成能解决问题的数字。
游戏规则:
你能得到4个号码。你得赚24块。你可以+,x,-和%这些数字得到24。
例子: 4,2,8,1
((4-2) + 1) x8= 24
随机数发生器应该给你4个数字,将组成24。您不能得到任何不等于24的数字,例如,1、1、1和2。
我只想用整数。
我想改变一下游戏。而不是总是使用24,我可能想使用一个不同的数字,如12为初学者和55高级球员,等等。
我是一个初学者,这是为了学习JavaScript。任何解释都会很好。
发布于 2016-05-19 12:55:46
这个小提琴展示了一种获取一系列数字的方法,这些数字可以以某种方式加到给定的数字上:
这是一种获得“随机”数字的简单方法,因为我只需对随机操作进行求和,并在最后插入一个受控操作,以确保它能够生成想要的目标。
我将转储下面的源代码,供那些不想遵循链接的人使用:
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
注意,在Infinity和divide函数中没有检查multiply或divide,这可能导致一些奇怪的行为。在这种情况下,我的代码只返回0 (通过返回false)。
发布于 2016-05-19 09:05:00
编辑:原始文本在底部。
好的,所以我做了,我并不是很骄傲代码是多么的野蛮,我确信它可以在一千多个地方提高效率,但它有效。
//[A,B,C,D]
var skillLevel = 24;
numbers = [];
for (i=0;i<=3;i++){
numbers[i] = (Math.floor(Math.random() * skillLevel) + 1);
}
function permutateOperations(numberArray){//This function, given an array of the form [A,B,C,D] where ABCD are numbers, places operations [+,-,*,%] between the numbers in the array
var possibilities = [];
var splicednumbers = numberArray.slice();
var operations = ['+','-','*','%'];
for (var j=0;j<=3;j++){//[A,j,B,k,C,m,D]
for(k=0;k<=3;k++){
for(m=0;m<=3;m++){
splicednumbers.splice(3,0,operations[m]);
splicednumbers.splice(2,0,operations[k]);
splicednumbers.splice(1,0,operations[j]);
possibilities.push(splicednumbers);
splicednumbers=numberArray.slice();
}
}
}
return possibilities;
}
function permutateNumbers(numberArray){//This function, given an array of the form [A,B,C,D], returns an array of arrays that have all the possible orderings
var possibility = [];
var possibilities = [];
var remainingArray=[];
var splicednumbers = numberArray.slice();
for (var i=0;i<=3;i++){
threeRemain = splicednumbers.slice();//[A,B,C,D]
possibility[0]=splicednumbers.splice(i,1)[0];
for(var j=0;j<=2;j++){
twoRemain=splicednumbers.slice();//[A,B,C]
possibility[1]=splicednumbers.splice(j,1)[0];
for(var k=0;k<=1;k++){
oneRemain = splicednumbers.slice(); //[A,B]
possibility[2]=splicednumbers.splice(k,1)[0];
for(var m=0;m<=0;m++){
possibility[3]=splicednumbers.splice(m,1)[0]; //[A]
possibilities.push(possibility.slice());
}
splicednumbers=oneRemain.slice();
}
splicednumbers=twoRemain.slice();
}
splicednumbers=threeRemain.slice();
}
return possibilities;
}
function permutateParenthesis(operationArray){//I AM SORRY THIS IS AWFUL BUT I COULDN'T THINK OF ANYTHING ELSE
//Given an array like [A,&,B,&,C,&,D], where ABCD are numbers and & is any operation, returns the 5 possible arrays that result from having parenthesis in different positions within it.
saved = operationArray.slice();
//[A,&,B,&,C,&,D]
permutations = [];
//First option
operationArray.splice(0,0,"(");
operationArray.splice(4,0,")");
permutations.push(operationArray.slice());
operationArray = saved.slice();
//Second option
operationArray.splice(0,0,"(");
operationArray.splice(3,0,")");
operationArray.splice(4,0,"(");
operationArray.splice(10,0,")");
permutations.push(operationArray.slice());
operationArray = saved.slice();
//Third option
operationArray.splice(0,0,"(");
operationArray.splice(6,0,")");
permutations.push(operationArray.slice());
operationArray = saved.slice();
//Fourth option
operationArray.splice(2,0,"(");
operationArray.splice(7,0,")");
permutations.push(operationArray.slice());
operationArray = saved.slice();
//Fifth option
operationArray.splice(4,0,"(");
operationArray.splice(8,0,")");
permutations.push(operationArray.slice());
operationArray = saved.slice();
return permutations;
}
finalnumbers = permutateNumbers(numbers);
operationNumbers = [];
for (i=0;i<finalnumbers.length;i++){
operationNumbers.push(permutateOperations(finalnumbers[i]));
}
parenthesisNumbers=[];
//Showtime
for (var j=0;j<operationNumbers.length;j++){
for (var k=0;k<operationNumbers[j].length;k++){
parenthesisNumbers.push(permutateParenthesis(operationNumbers[j][k]));
if (eval(operationNumbers[j][k].join(""))===24){//get a string with the finished combination, eval it to perform the operation, see if it is 24
console.log(operationNumbers[j][k].join("") + " Is valid");
}
}
}原件:
我想这里的大多数人都错过了这个问题。
这里的问题不是产生24以下的随机数(考虑到数字50,6,6,2你可以做6*2* (50%6) = 24,我猜你确实需要一个上限)。
这里的问题是,在得到4个数字之后,检查它们是否可以在任何组合操作的情况下达到24,这要复杂得多。
你有4个运算+,-,*,%和4个数字A,B,C,D,对于初学者来说,你必须检查这两个集合的每一个组合,第一个可以重复(解决方案可能是+,+),第二个不能重复(即使数字可能重复每个数字的数量有限),这意味着对每个A、B、C、D、4*3*2*1的可能组合执行4*4*4 (+、-、*、%的每个组合)检查。这增加了1536个检查,然后试图使它在任何方面的效率。
然后,您必须开始考虑括号,这会使可能性增加一些。
我对此表示赞赏,我认为这是一个有趣的问题,但我同意libik的观点,如果你只想学习javascript,就有更简单的事情要做。
如果你选择前进,那么我希望我已经为你指明了正确的方向,如果可以的话,我很乐意帮助你,我可能真的会尝试自己解决这个问题,因为我认为这是一个有趣的问题。
发布于 2016-05-19 08:23:14
使用此方法在1和当前skillLevel之间生成随机数:
var skillLevel = getCurrentSkillLevel(); // get skill level in any way you seem appropriate.
function getRandomInt(skillLevel) {
return Math.floor(Math.random() * skillLevel) + 1;
}其中skillLevel是24,55或者什么的。
https://stackoverflow.com/questions/37317622
复制相似问题