Programador relativamente nuevo aquí. Tengo un juego de Tetris en pleno funcionamiento escrito en Javascript. Tengo problemas con la función final, donde el empalme no funciona como se esperaba al eliminar una fila llena de color. Estoy seguro de que podría haber algún problema con la forma en que recorrí las matrices, pero no puedo resolverlo y estaba divagando si alguien podía ofrecer algún consejo. Aquí está mi función actual que se llama cada vez que una forma choca con otra:

  for(let y = arena.length-1; y < 0; y--){
    for(let x = 0; x < arena[y].length; x++){
      if (arena[y][x] === 0) {
        continue;
      } 
    }
    const row = arena.splice(y,1)[0].fill(0);
    arena.unshift(row);
    y++;
  };
}
0
Tallulah 22 ene. 2021 a las 22:43

1 respuesta

La mejor respuesta

Lo arreglé para ti. Tenías un par de conceptos mal:

function arenaSweep() {
  for(let y = arena.length-1; y >= 0; y--){
    const row = arena[y];
    let filled = true;
    
    for(let x = 0; x < row.length; x++){
      if (row[x] === 0) {
        filled = false;
        break;
      } 
    }
    
    if (filled) {
      arena.splice(y,1);
      row.fill(0);
      arena.unshift(row);
      y++;
    }
  };
}

El condicional en su bucle for tenía la dirección incorrecta (y <0 debería ser y> = 0) para los bucles inversos.

Luego asumió que continue saldría del bucle interno para poder comenzar a verificar la siguiente fila; sin embargo, es la ruptura lo que detiene el ciclo actual. Continuar acaba de hacer que se mueva a la siguiente iteración del ciclo anidado.

También optimicé un poco reduciendo las llamadas a la matriz.

1
Diniden 22 ene. 2021 a las 20:02