所以我正在研究一个简单的基于JavaScript的基于Web的游戏。目的是猜测X位数的随机数。这意味着随机数可以是4、5位数字,最多可以是您想要的。您实际上可以在www.juegodescifralo.com上玩游戏(用西班牙语,对此感到抱歉)。
用户输入一个存储为数组的数字。随机数也作为数组生成。两个数组中的单个数字可以重复。
可能的“值/数字”有三种类型:“好”数字是您选择的与随机数组中的数字处于同一位置的数字。例如:
随机数组为:14 5 7
用户输入为:68 5 1
数字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;
}
代码有点错误。如果随机数组中有重复项,并且其中之一被标记为好,则另一项(即使在用户输入中存在)也将被设置为错误,而不是应有的规则。
事情变得更加复杂,因为您应该能够与任意数量的数字对战。因此,我应该能够猜出一个20位数字而没有“问题”。
您可以在www.juegodescifralo.com上自己玩
我该如何处理?有什么想法可以使我更轻松地访问阵列数据吗?非常感谢你!
答案 0 :(得分:0)
与其indexOf
与-1
的比较和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(''),
));
答案 1 :(得分:0)
我认为这样循环两次很容易
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
}
}
第一个循环是检查好坏。并剔除该值是好的,因此不能再次使用。
第二个循环,用于检查常规值并删除其使用的值,因此无法再次使用。
答案 2 :(得分:0)
这应该有效。
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>