2017-10-19 60 views
1

我正在研究魔方計時器網站(JavaScript),它需要一種加擾算法。如果只是從數組中選取任意字母,它會很容易,但需要滿足一些要求。每個字母表示在魔方的算法表示法中的一個舉動,例如「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

請詳細說明什麼是不工作。例如,測試輸入,預期輸出和代碼輸出的清晰示例將對您有所幫助。 「這不起作用」對於你的具體問題不是很清楚。 – CullenJ

+0

對不起,「不工作」的事情是,我有時連續兩次得到相同的字母 –

+0

沒有必要道歉,我只是想幫助你改善你的問題。一個明確的問題可以幫助那些可能在同一個問題上搜索本網站的人。 :) – CullenJ

回答

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相反,反之亦然),所以例如「U D U'」只會是「D」移動。我想不出任何解決方法如何避免它 –

相關問題