从数组中删除值

时间:2016-03-06 22:44:28

标签: javascript arrays array-splice

我试图制作一个井字游戏并且遇到了关于逻辑的障碍。

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);


};

游戏中的每个方框都有一个字母和一个分配给它的编号。该字母表示该框在网格中的哪一行,而该数字表示该框在每列中占据的位置。一旦用户选择将标记放在九个盒子中的一个上,该选项就从阵列中取出,计算机将随机选择一个用于放置其标记的盒子。我遇到的问题是使用数组方法删除和拼接。我认为最初使用splice方法从数组中取出一个值但是意识到一旦它完成,剩下的值的所有位置都会移位,这将导致代码的其余部分不正确。例如,如果要从数组中取出a1,则无法再使用代码my_array.splice(1,1)删除b1。为了使其工作,代码现在必须是my_array.splice(0,1)。我删除了这种方法,转而使用delete方法,因为这意味着一旦删除了一个值,就会出现一个"空格"会占据它的位置,确保其余值的位置保持不变。然而,一旦我这样做了,我就意识到,一旦计算机完成移动,我就会遇到另一个问题,因为它可能会随机选择一个"空间"来自新的价值阵容,这不会触发任何事情发生。

我很抱歉长篇大论,但我想确保尽可能彻底。我真的很感激我的其他选择可以是第二种意见。谢谢!

编辑** 我实现了以下解决方案但偶尔会出现一个负数("未定义")数字,当我在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类:\

1 个答案:

答案 0 :(得分:0)

作为使用数组的替代方法,您可以考虑使用CSS类。在该示例中,通过添加类名来标记填充正方形。该类还可用于设置方形文本的颜色和事件,即" X"或者" O"。使用querySelectorAll(),计算机可以获得剩余未使用的方块列表并随机选择一个。玩得开心。

运行代码段并点击一个方块以尝试



window.tic.addEventListener('click', function(e) {

  // if user clicks a filled square then do nothing
  if (e.target.classList.contains('filled')) return;

  // select the square that user clicked
  e.target.classList.add('filled', 'X');

  // get list of unfilled squares
  var squares = document.querySelectorAll('td:not(.filled)');

  // computer randomly selects one
  if (squares.length) {
    var n = Math.floor(Math.random() * squares.length);
    squares[n].classList.add('filled', 'O');
  } else {
    window.msg.innerHTML = 'Game Over';
  }

});

table {
  border-collapse: collapse;
  font-size: 24px;
  font-family: sans-serif;
  background-color: aliceblue;
}
td {
  border: 1px solid black;
  height: 2em;
  width: 2em;
  text-align: center;
  vertical-align: middle;
  cursor: default;
}
.X::before {
  content: "X";
  color: red;
}
.O::before {
  content: "O";
  color: blue;
}

<table id="tic">
  <tr><td></td><td></td><td></td></tr>
  <tr><td></td><td></td><td></td></tr>
  <tr><td></td><td></td><td></td></tr>
</table>
<div id="msg">Tic-Tac-Toe</div>
&#13;
&#13;
&#13;