Случайный ход javascript скремблер для кубика Рубика

В настоящее время я работаю над веб-таймером, и у меня есть некоторые проблемы с моим алгоритмом шифрования. Поскольку это первая версия, я хочу, чтобы скремблер был только случайным движением, а не случайным состоянием, поскольку его слишком сложно сделать, и он появится в будущем обновлении. У меня есть алгоритм, который в основном делает массив случайных ходов, которые он выбирает из возможных, и затем проверяет, не находятся ли две одинаковые буквы (или ходы) рядом друг с другом. Это все работает нормально, но я понятия не имею, как добавить что-то, что позволит избежать случаев, как показано ниже: "D U D", например. Допускаются два одинаковых хода, разделенных другим ходом. Например, "D R D", но не "DUD", так как он будет равен "D2 U" и, следовательно, будет потраченным впустую ходом.

Информация для не куберов:

каждая буква представляет свое лицо, которое перемещается, когда письмо читается. Например: "L U L": "L" будет означать один раз повернуть левую грань по часовой стрелке, тогда "U" будет означать вращение верхней грани по часовой стрелке, и, наконец, "L" снова будет означать вращение левой грани снова. если за буквой следует апостроф, то это означает, что лицо следует повернуть против часовой стрелки. Если за ним следует "2", это означает, что грань должна вращаться два раза подряд. L слева, R справа, F впереди, B сзади, D внизу, U вверху

Вот код:

  function generate_scramble() {
   var scramble_length = 20;
   var scramble = new Array();

   var possible_letters = new Array(" D", " U", " B", " F", " R", " L");
   var possible_switches = new Array("", "2", "'");

   var array_of_randoms = new Array();

   for (var i = 0; i < scramble_length; i++) {
    var random_letters = Math.floor(Math.random() * possible_letters.length);
    var random_switches = Math.floor(Math.random() * possible_switches.length);

    array_of_randoms.push(random_letters);

    if (array_of_randoms[array_of_randoms.length - 1] == array_of_randoms[array_of_randoms.length - 2]) {
     if (array_of_randoms[array_of_randoms.length - 1]  < 5) {
      array_of_randoms[array_of_randoms.length - 1]++;
     } else { 
      array_of_randoms[array_of_randoms.length - 1]--;
     }
    }
   random_letters = array_of_randoms[array_of_randoms.length - 1];
   scramble.push(possible_letters[random_letters] + possible_switches[random_switches])
   }
   document.getElementById("scramble").innerHTML = "Scramble: " + scramble.join("");
  }

  generate_scramble();
 <p id="scramble">
  Scramble: 
 </p>
 <button onclick="generate_scramble()">
  New Scramble
 </button>

1 ответ

Решение
 const directions = [
   ["D", "U"],
   ["L","R"],
   ["F","B"]
 ];

 const times = ["", "'", "2"];

 const random = (array, exclude) => {
   do {
      var n = Math.floor( Math.random() * array.length );
   } while(array[n] === exclude)
   return array[n];
}

const scramble = new Array(20);
var direction;
for(var i = 0; i < scramble.length; i++){
  direction = random(directions, direction);
  scramble[i] = random(direction) + random(times);
 }

Вы можете уменьшить количество ложных движений, всегда меняя направление движения. Так что D U D не появится, потому что D и U идут в одном направлении.

Другие вопросы по тегам