Как я могу гарантировать, что алгоритм шифрования моего кубика не выбирает одно и то же направление дважды подряд?

1

Я работаю на веб-сайте таймера Rubik Cube Timer (JavaScript), и для этого требуется алгоритм скремблирования. Было бы легко, если бы он просто собирал случайные буквы из массива, но есть требования, которые ему необходимо выполнить. Каждая буква представляет собой движение в алгоритмической нотации Rubik Cube, так что, например, "L" означает перемещение левой стороны по часовой стрелке. Или "U2" означало бы переместить верхнюю сторону два раза, а "B" означало бы переместить заднюю сторону против часовой стрелки. и так далее.

Дело в том, что не могут быть две одинаковые буквы рядом друг с другом, и даже если они находятся в разных направлениях. Например, U не может быть рядом с U ', или U2 и так далее. Это должно быть другое письмо. Иногда мой код генерирует 2 одинаковой буквы рядом друг с другом.

Вот мой код:

function generateScramble() {

    //Possible Letters
    var array = new Array(" U", " D", " R", " L", " F", " B", " U\'", " D\'", " R\'", " L\'", " F\'", " B\'", " U2", " D2", " R2", " L2", " F2", " B2"); 

    var array2 = new Array(); // The Scramble.

    var rdArr = new Array(); // The Array of random numbers.

    for (var i = 0; i < 20; i++) {
        var random = Math.floor(Math.random() * array.length);
        rdArr.unshift(random);

        if (rdArr[1] - rdArr[0] == 0 ||
            rdArr[0] - rdArr[1] == 0 ||
            rdArr[1] - rdArr[0] == 6 ||
            rdArr[0] - rdArr[1] == 6 ||
            rdArr[1] - rdArr[0] == 12 ||
            rdArr[0] - rdArr[1] == 12) { // Check whether a D is next to D' or D2, or if F is next to F' or F2, R next to R' or R2, and so on
            if (random < 17) {
                random++;
            } else {
                random--;
            }
        }

        array2.push(array[random]); // Get letters in random order in the array.
    }

    var scramble = "Scramble: " + array2[0] + array2[1] + array2[2] + array2[3] + array2[4]
                                + array2[5] + array2[6] + array2[7] + array2[8] + array2[9]
                                + array2[10] + array2[11] + array2[12] + array2[13] + array2[14]
                                + array2[15] + array2[16] + array2[17] + array2[18] + array2[19];

    document.getElementById("Scramble").innerHTML = scramble; // Display the scramble

}
  • 0
    Пожалуйста, опишите, что не работает. Например, наглядный пример с тестовым вводом, ожидаемым выводом и выводом, который дает ваш код, очень помог бы. «Это не работает», не очень понятно, каков ваш конкретный вопрос.
  • 0
    Извините, но «не работает» было то, что я иногда получал одни и те же буквы два раза подряд
Показать ещё 1 комментарий
Теги:
rubiks-cube

1 ответ

1
Лучший ответ

Я думаю, код может быть таким:

generateScramble();

function generateScramble() {

  // Possible Letters
  var array = new Array(" U", " D", " R", " L", " F", " B")

  // Possible switches
  var switches = ["", "\'", "2"]; 

  var array2 = new Array(); // The Scramble.

  var last = ''; // Last used letter

  var random = 0;

  for (var i = 0; i < 20; i++) {
      // the following loop runs until the last one 
      // letter is another of the new one
      do {
         random = Math.floor(Math.random() * array.length);
      } while (last == array[random]) 

      // assigns the new one as the last one
      last = array[random];

      // the scramble item is the letter
      // with (or without) a switch
      var scrambleItem = array[random] + switches[parseInt(Math.random()*switches.length)];

      array2.push(scrambleItem); // Get letters in random order in the array.
  }

  var scramble = "Scramble: ";
  
  // Appends all scramble items to scramble variable
  for(i=0; i<20; i++) {
     scramble += array2[i];
  }
  
  document.getElementById("Scramble").innerHTML = scramble; // Display the scramble
}
<div id="Scramble"></div>

Надеюсь, поможет.

  • 0
    Это прекрасно, но есть еще одна особенность, которую я только что понял, она должна иметь. Извините за ответ так поздно. Дело в том, что если перемещать лицо лицом, затем противоположное лицо, а затем первое лицо, это отменяет первое движение лица. (Противоположными гранями являются следующие: D напротив U, L напротив R и F напротив B и наоборот), поэтому, например, «UD U» «будет только движением D». И я просто не могу придумать, как этого избежать.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню