随机移动 javascript 魔方打乱机
Random move javascript scrambler for the Rubik's Cube
我目前正在开发网络计时器,但我的加扰算法存在一些问题。由于是第一个版本,我只希望扰码器是随机移动而不是随机状态,因为它制作起来太复杂了,并且会在以后的更新中出现。我有一个算法,基本上是从可能性中选择一系列随机移动,然后检查两个相同的字母(或移动)是否不相邻。一切正常,但我不知道如何添加可以避免以下情况的内容:例如 "D U D"。两个相同的着法被另一个着法分开是可以接受的,例如 "D R D",但不接受 "D U D",因为它等于 "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>
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走的是同一个方向
我目前正在开发网络计时器,但我的加扰算法存在一些问题。由于是第一个版本,我只希望扰码器是随机移动而不是随机状态,因为它制作起来太复杂了,并且会在以后的更新中出现。我有一个算法,基本上是从可能性中选择一系列随机移动,然后检查两个相同的字母(或移动)是否不相邻。一切正常,但我不知道如何添加可以避免以下情况的内容:例如 "D U D"。两个相同的着法被另一个着法分开是可以接受的,例如 "D R D",但不接受 "D U D",因为它等于 "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>
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走的是同一个方向