Speedcubing is where competitors try to solve a rubik's cube in the fastest time possible. Every time a competitor wants to attempt an "official" solve, the cube needs to be scrambled using a randomly generated sequence of moves about 28. The standard notation for a 3x3 rubik's cube uses letters to indicate what face to turn. The letters are the following:
- U - the top face
- D - the bottom face
- L - the left face
- R - the right face
- F - the front face
- B - the back face
Sometimes, you might see a 2 or a " ' " symbol after a letter. The 2 means to turn the face 180 degrees and the ' symbol means to turn a face anti-clockwise. If the letter is just on it's own, then that means to turn the face clockwise once.
So a random scramble sequence might look like this:
U2 B2 D2 B2 F2 L2 B2 L' U2 L' F2 B' D2 L B2 U F L2 U L' D'
What I have been trying to do is to write a program for an Arduino to generate a random scramble sequence like the one above and then output it to the serial monitor (later, to an 0.96" OLED display instead). I have also tried to write my program so that it does not generate moves that contradict themselves either (for example: R, R2 or R L2 R'). However, when I run my program, the Arduino just spams F moves into the terminal (example: FFFFFFFFFF) and I cannot figure out why it is doing this after looking through my code many times. Here is the code
attached.
int currentMove;
int lastMove;
int secondLastMove;
int movesGenerated;
int isSuccessful;
int scrambleLength;
int numericScramble[28];
int translatedScramble[28];
char *moves[] = {"F", "F'", "F2", "U", "U'", "U2", "L", "L'", "L2", "B", "B'", "B2", "D", "D'", "D2", "R", "R'", "R2"};
int movesDisplayed;
void setup() {
/*
* ###---ASSIGN NUMBERS TO MOVES:---###
* f=1
* f'=2
* f2=3
* u=4
* u'=5
* u2=6
* l=7
* l'=8
* l2=9
* b=10
* b'=11
* b2=12
* d=13
* d'=14
* d2=15
* r=16
* r'=17
* r2=18
*/
Serial.begin(115200);
}
void loop() {
generateScramble(28);
translateAndDisplay();
}
void translateAndDisplay() {
for (int movesTranslated = 0; movesTranslated <= scrambleLength;) {
// Serial.print(moves[numericScramble[movesTranslated]]);
Serial.print(numericScramble[movesTranslated]);4
movesTranslated++;
}
}
void generateScramble(int scrambleLength) {
for (int movesGenerated = 0; movesGenerated <= scrambleLength;) {
pickMove();
if (isSuccessful==1) {
currentMove = numericScramble[movesGenerated];
movesGenerated++;
lastMove = numericScramble[movesGenerated - 1];
secondLastMove = numericScramble[movesGenerated - 2];
}
else {
}
}
}
void pickMove() {
currentMove = random(1, 18);
if(currentMove==1) { //Basically, the following code is a very clunky way of validating wether the next move can be added to the scramble or not:
if (lastMove==1 || lastMove==2 || lastMove==3 || secondLastMove==1 || secondLastMove==2 || secondLastMove==3) {
isSuccessful = 0;
}
else {
isSuccessful = 1;
}
}
if(currentMove==2) {
if (lastMove==1 || lastMove==2 || lastMove==3 || secondLastMove==1 || secondLastMove==2 || secondLastMove==3) {
isSuccessful = 0;
}
else {
isSuccessful = 1;
}
}
if(currentMove==3) {
if (lastMove==1 || lastMove==2 || lastMove==3 || secondLastMove==1 || secondLastMove==2 || secondLastMove==3) {
isSuccessful = 0;
}
else {
isSuccessful = 1;
}
}
if(currentMove==4) {
if (lastMove==4 || lastMove==5 || lastMove==6 || secondLastMove==4 || secondLastMove==5 || secondLastMove==6) {
isSuccessful = 0;
}
else {
isSuccessful = 1;
}
}
if(currentMove==5) {
if (lastMove==4 || lastMove==5 || lastMove==6 || secondLastMove==4 || secondLastMove==5 || secondLastMove==6) {
isSuccessful = 0;
}
else {
isSuccessful = 1;
}
}
if(currentMove==6) {
if (lastMove==4 || lastMove==5 || lastMove==6 || secondLastMove==4 || secondLastMove==5 || secondLastMove==6) {
isSuccessful = 0;
}
else {
isSuccessful = 1;
}
}
if(currentMove==7) {
if (lastMove==7 || lastMove==8 || lastMove==9 || secondLastMove==7 || secondLastMove==8 || secondLastMove==9) {
isSuccessful = 0;
}
else {
isSuccessful = 1;
}
}
if(currentMove==8) {
if (lastMove==7 || lastMove==8 || lastMove==9 || secondLastMove==7 || secondLastMove==8 || secondLastMove==9) {
isSuccessful = 0;
}
else {
isSuccessful = 1;
}
}
if(currentMove==9) {
if (lastMove==7 || lastMove==8 || lastMove==9 || secondLastMove==7 || secondLastMove==8 || secondLastMove==9) {
isSuccessful = 0;
}
else {
isSuccessful = 1;
}
}
if(currentMove==10) {
if (lastMove==10 || lastMove==11 || lastMove==12 || secondLastMove==10 || secondLastMove==11 || secondLastMove==12) {
isSuccessful = 0;
}
else {
isSuccessful = 1;
}
}
if(currentMove==11) {
if (lastMove==10 || lastMove==11 || lastMove==12 || secondLastMove==10 || secondLastMove==11 || secondLastMove==12) {
isSuccessful = 0;
}
else {
isSuccessful = 1;
}
}
if(currentMove==12) {
if (lastMove==10 || lastMove==11 || lastMove==12 || secondLastMove==10 || secondLastMove==11 || secondLastMove==12) {
isSuccessful = 0;
}
else {
isSuccessful = 1;
}
}
if(currentMove==13) {
if (lastMove==13 || lastMove==14 || lastMove==15 || secondLastMove==13 || secondLastMove==14 || secondLastMove==15) {
isSuccessful = 0;
}
else {
isSuccessful = 1;
}
}
if(currentMove==14) {
if (lastMove==13 || lastMove==14 || lastMove==15 || secondLastMove==13 || secondLastMove==14 || secondLastMove==15) {
isSuccessful = 0;
}
else {
isSuccessful = 1;
}
}
if(currentMove==15) {
if (lastMove==13 || lastMove==14 || lastMove==15 || secondLastMove==13 || secondLastMove==14 || secondLastMove==15) {
isSuccessful = 0;
}
else {
isSuccessful = 1;
}
}
if(currentMove==16) {
if (lastMove==16 || lastMove==17 || lastMove==18 || secondLastMove==16 || secondLastMove==17 || secondLastMove==18) {
isSuccessful = 0;
}
else {
isSuccessful = 1;
}
}
if(currentMove==17) {
if (lastMove==16 || lastMove==17 || lastMove==18 || secondLastMove==16 || secondLastMove==17 || secondLastMove==18) {
isSuccessful = 0;
}
else {
isSuccessful = 1;
}
}
if(currentMove==18) {
if (lastMove==16 || lastMove==17 || lastMove==18 || secondLastMove==16 || secondLastMove==17 || secondLastMove==18) {
isSuccessful = 0;
}
else {
isSuccessful = 1;
}
}
}