Я пытаюсь создать игру tic-tac-toe и столкнулся с проблемой, связанной с логикой.Удаление значения из массива
var my_array = [a1, b1, c1, a2, b2, c2, a3, b3, c3];
window.compTurn = function() {
var random = Math.floor(Math.random() * my_array.length);
if (window.game.a1 == 1){
//my_array.splice(0,1);
delete my_array[0];
my_array.splice(random);
}
if (window.game.b1 == 1){
//my_array.splice(1,1);
delete my_array[1];
my_array.splice(random);
}
if (window.game.c1 == 1){
//my_array.splice(2,1);
delete my_array[2];
my_array.splice(random);
}
if (window.game.a2 == 1){
//my_array.splice(3,1);
delete my_array[3];
my_array.splice(random);
}
if (window.game.b2 == 1){
//my_array.splice(4,1);
delete my_array[4];
my_array.splice(random);
}
if (window.game.c2 == 1){
//my_array.splice(5,1);
delete my_array[5];
my_array.splice(random);
}
if (window.game.a3 == 1){
//my_array.splice(6,1);
delete my_array[6];
my_array.splice(random);
}
if (window.game.b3 == 1){
//my_array.splice(7,1);
delete my_array[7];
my_array.splice(random);
}
if (window.game.c3 == 1){
//my_array.splice(8,1);
delete my_array[8];
my_array.splice(random);
}
window.game = { a1:0, b1:0, c1:0, a2:0, b2:0, c2:0, a3:0, b3:0, c3:0};
console.log(my_array);
};
В каждой коробке в игре есть буква и номер, присвоенный ей. Буква представляет собой строку, в которой находится поле в сетке, в то время как номер представляет, какую позицию занимает поле в каждом столбце. Как только пользователь захочет разместить свою метку в одном из девяти ящиков, эта опция вынимается из массива, и компьютер случайно выбирает ящик, в который помещается его метка. Проблема, с которой я столкнулся с проблемами, использующими методы массива delete и splice. Сначала я думал об использовании метода сплайсинга, чтобы извлечь значение из массива, но понял, что после того, как все позиции остальных значений будут сдвинуты, это приведет к тому, что остальная часть кода будет неправильной. Например, если a1 должно быть выведено из массива, b1 больше не может быть удалено с помощью кода my_array.splice (1,1). Чтобы это сработало, теперь код должен быть my_array.splice (0,1). Я воспользовался этим методом в пользу использования метода delete, потому что это означало бы, что после того, как значение будет удалено, «пространство» займет свое место, гарантируя, что позиция остальных значений останется прежней. Однако, как только я это сделал, я понял, что когда-нибудь наступит время для того, чтобы компьютер сделал свой ход, потому что он мог бы случайным образом выбрать «пространство» из новой линейки значений, что ничего не вызвало бы бывает.
Прошу прощения за длинную рецензию, но я хотел удостовериться, что я был настолько тщательным, насколько это возможно. Я бы очень признателен за второе мнение о том, какими могут быть мои другие варианты. Благодаря!
EDIT ** Я реализовал следующее решение, но время от времени появляется отрицательное («неопределенное») число, когда я console.log значение индекса случайного выбора компьютера: \ Кто-нибудь может знать, почему это произойдет?
my_array = ['a1', 'b1', 'c1', 'a2', 'b2', 'c2', 'a3', 'b3', 'c3'];
window.compTurn = function() {
var random = Math.floor(Math.random() * my_array.length);
if (window.game.a1 == 1) {
my_array.splice(my_array.indexOf('a1'),1);
a1compChoice = my_array[random];
console.log(a1compChoice);
console.log(my_array.indexOf(a1compChoice));
}
if (window.game.b1 == 1){
my_array.splice(my_array.indexOf('b1'),1);
b1compChoice = my_array[random];
console.log(b1compChoice);
console.log(my_array.indexOf(b1compChoice));
}
if (window.game.c1 == 1){
my_array.splice(my_array.indexOf('c1'),1);
c1compChoice = my_array[random];
console.log(c1compChoice);
console.log(my_array.indexOf(c1compChoice));
}
if (window.game.a2 == 1){
my_array.splice(my_array.indexOf('a2'),1);
a2compChoice = my_array[random];
console.log(a2compChoice);
console.log(my_array.indexOf(a2compChoice));
}
if (window.game.b2 == 1){
my_array.splice(my_array.indexOf('b2'),1);
b2compChoice = my_array[random];
console.log(b2compChoice);
console.log(my_array.indexOf(b2compChoice));
}
if (window.game.c2 == 1){
my_array.splice(my_array.indexOf('c2'),1);
c2compChoice = my_array[random];
console.log(c2compChoice);
console.log(my_array.indexOf(c2compChoice));
}
if (window.game.a3 == 1){
my_array.splice(my_array.indexOf('a3'),1);
a3compChoice = my_array[random];
console.log(a3compChoice);
console.log(my_array.indexOf(a3compChoice));
}
if (window.game.b3 == 1){
my_array.splice(my_array.indexOf('b3'),1);
b3compChoice = my_array[random];
console.log(b3compChoice);
console.log(my_array.indexOf(b3compChoice));
}
if (window.game.c3 == 1){
my_array.splice(my_array.indexOf('c3'),1);
c3compChoice = my_array[random];
console.log(c3compChoice);
console.log(my_array.indexOf(c3compChoice));
}
console.log(my_array);
window.game = { a1:0, b1:0, c1:0, a2:0, b2:0, c2:0, a3:0, b3:0, c3:0};
};
@Roberto Спасибо за отзывы, но, к сожалению, я не имею возможности манипулировать классы CSS: \
Может попытаться установить внутренний временный массив для хранения набора рандомизированных значений, поэтому после того, как игра будет удалена он имел доступ к заказу. – alphapilgrim
Используйте * splice *, и когда пользователь делает их перемещение, используйте * indexOf *, чтобы найти его в массиве и удалить (* splice *). Вместо 9 блоков используйте цикл. Нет необходимости префикс глобальных свойств * window *. – RobG
Эй, ребята! Спасибо за ввод. Я попробую это и вернусь к вам, как это работает. – user2724072