所以我正在开发一个简单的基于网络的JavaScript游戏。目标是猜测一个X位数的随机数。这意味着随机数可以是4,5位,直到你想要的任何数字。你可以在www.juegodescifralo.com上玩这个游戏(它是西班牙语的,很抱歉)。
用户输入一个存储为数组的数字。随机数也以数组的形式生成。两个数组中的单个数字可以重复。
有三种可能的“值/数”类型:“好”的是您选择的与随机数组中的数字位置相同的数字。举个例子:
随机数组为: 1457
用户输入为: 6851
数字5是一个“好”的数字,因为它处于相同的位置。然后是第二种类型的“值”,它们是“常规”的。这意味着它们在随机数中,但不在同一位置。在本例中,数字1将是一个“常规”值。第三种类型是“坏”类型,它们甚至不在随机数组中。
我开发的函数如下:
function checkNumbers(randomArray, myArray, good, regular, bad) {
for (var x = 0; x < randomArray.length; x++) {
var posRepetido = randomArray.indexOf(myArray[x]); //Is current number inside random array?
if (posRepetido == -1) { //It's not inside
console.log("number " + myArray[x] + "is not inside");
bad++;
} else { //It's inside
regular++;
if (myArray[x] == randomArray[x]) { //If it's the same number...
console.log("number " + myArray[x] + "is in the correct position");
good++;
regular--;
} else { //If it's not the same number
if (randomArray[posRepetido] != myArray[posRepetido]) {
console.log("number " + myArray[x] + "is inside but not in the same position");
} else {
console.log("number " + myArray[x] + "is not inside");
}
}
}
}
var obj = { //Return object for accessing later, to show feedback to the user.
good: good,
regular: regular,
bad: bad
};
return obj;
}
这段代码有一点buggy。当随机数组中有重复项时,其中一个被标记为好的,那么另一个(即使它存在于用户输入中)将被设置为坏的,而不是应该设置为规则的。
事情变得更加复杂,因为你应该能够玩任何数量的数字。所以我应该能够猜出一个没有“问题”的20位数字。
你可以在www.juegodescifralo.com上自己玩
我该怎么做呢?有什么想法可以让我更容易的访问数组数据吗?非常感谢!
发布于 2018-07-26 00:08:15
相比与-1
的indexOf
比较和myArray[x]
的检查,使用includes
和数组方法(如forEach
)来实现更好的抽象可能要容易得多。您真正需要的只是一个if
、一个else if
和一个else
。例如:
function checkNumbers(randomArray, userArray, good=0, regular=0, bad=0) {
userArray.forEach((guess, i) => {
if (guess === randomArray[i]) good++;
else if (randomArray.includes(guess)) regular++;
else bad++;
});
return { good, regular, bad };
}
// 4 good
console.log(checkNumbers(
'1234'.split(''),
'1234'.split(''),
));
// 4 good, 2 bad
console.log(checkNumbers(
'1234'.split(''),
'123456'.split(''),
));
// 4 good, 2 regular
console.log(checkNumbers(
'1234'.split(''),
'123412'.split(''),
));
// all regular:
console.log(checkNumbers(
'123456789123456789'.split(''),
'912345678912345678'.split(''),
));
发布于 2018-07-26 01:02:19
我认为像这样循环两次会更容易。
function checkNumbers(randomArray, guessArray) {
var clone = randomArray.slice(0);
var good = 0;
var regular = 0;
var bad = 0;
var visited = [];
guessArray.forEach(function(guess, index) {
if (guess === clone[index]) { // the guess is in right position
good++;
clone[index] = "x"; // strike it out so it cannot be used later
visited.push(index);
} else if (clone.indexOf(guess) === -1) {
bad++;
visited.push(index);
}
});
guessArray.forEach(function(guess, index) {
if (!visited.includes(index)) {
var match = clone.indexOf(guess);
if (match !== -1) {
regular++;
clone[match] = "x"; // strike it out so it cannot be used later
}
}
});
return {
good: good,
bad: bad,
regular: regular
}
}
第一个循环是检查好的和坏的。并去掉它的值,它是好的,所以它不能被再次使用。
第二个循环检查规则,去掉它使用的值,这样它就不能再被使用了。
发布于 2018-07-31 15:40:38
这应该是可行的。
function guessNumber (numUser, numRandom) {
if (typeof numUser == 'number') {
numUser = numUser.toString().split('');
}
if (typeof numRandom == 'number') {
numRandom = numRandom.toString().split('');
}
if (typeof numRandom != 'object' || typeof numUser != 'object') {
return false;
}
if (numRandom == numUser) {
return true;
}
var numRegular = {},
numBuenos = {},
numMalos = {},
numRepeat = {};
for(var i = 0; i < numRandom.length; i++) {
if (!numRepeat[numRandom[i]]) {
numRepeat[numRandom[i]] = 0;
}
numRegular[numRandom[i]] = 0;
numRepeat[numRandom[i]]++;
}
for (var i = 0; i < numUser.length; i++) {
if (numUser[i] == numRandom[i]) {
numBuenos[numUser[i]] = numUser[i];
}else if ($.inArray(numUser[i], numRandom)) {
if (!numRegular[numUser[i]]) {
numRegular[numUser[i]] = 0;
}
if (numRegular[numUser[i]] < numRepeat[numUser[i]]) {
numRegular[numUser[i]]++;
} else {
numMalos[numUser[i]] = numUser[i];
}
} else {
numMalos[numUser[i]] = numUser[i];
}
}
return {
regular: Object.values(numRegular).reduce((a, b) => a + b),
buenos: Object.keys(numBuenos).length,
malos: Object.keys(numMalos).length
};
}
console.log(guessNumber(8365, 8512));
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
https://stackoverflow.com/questions/51528762
复制