import lejos.nxt.*; import lejos.nxt.comm.*; /** * Solve Rubik's Cube By CFOP * @author ChenWu http://www.diy-robots.com * @see CFOP */ public class CFOP { static String SideColors[] = { "orgorwwoo", "oyggbobrg", "yyrgowwbw", "yrybgybbo", "gwwyybror", "bgrwwrbgy" }; public static void main (String[] aArg) throws Exception { Steps.Clear(); if(Rubik.ImportColor(SideColors)=="") { TopCross(); TopCorner(); SecondLayer(); BottomCross(); BottomCorner(); ThirdLayerCorner(); ThirdLayerCornerSnap(); ThirdLayerBorderSnap(); } //Now the steps are saved in Steps Object for(int i=0;i<Steps.Count;i++) { Steps.Index=i; //int c = Steps.Color(); //Color //bool ColockWise = Steps.ClockWise(); //Rotate direction //int Quarter = Steps.Quarter(); //Number of quarter be rotated } } public static void TopCross() throws Exception { int GetPos=0; int[] c=new int[5]; int CurrentStep=Steps.Count; c[0]=Rubik.Sides[0][1][1]; c[1]=Rubik.Sides[1][1][1]; c[2]=Rubik.Sides[5][1][1]; c[3]=Rubik.Sides[3][1][1]; c[4]=Rubik.Sides[4][1][1]; for(int i=1;i<5;i++) { CurrentStep=Steps.Count; Rubik.ChangeViewToColor(c[0]); Rubik.ChangeViewFromTopByNextColor(c[i]); GetPos=Rubik.FindBorderCell(c[0],c[i]); switch(GetPos) { case 101: //Already fixed break; case 110: Steps.AddStep(1, false, 1); Steps.AddStep(0, true, 1); Steps.AddStep(4, false, 1); Steps.AddStep(0, false, 1); break; case 140: Steps.AddStep(4, true, 1); Steps.AddStep(1, true, 1); break; case 104: Steps.AddStep(4, true, 1); Steps.AddStep(0, true, 1); Steps.AddStep(4, false, 1); Steps.AddStep(0, false, 1); break; case 130: Steps.AddStep(3, true, 1); Steps.AddStep(0, true, 1); Steps.AddStep(4, true, 1); Steps.AddStep(0, false, 1); break; case 103: Steps.AddStep(3, true, 1); Steps.AddStep(0, true, 2); Steps.AddStep(3, false, 1); Steps.AddStep(0, false, 2); break; case 150: Steps.AddStep(5, false, 1); Steps.AddStep(1, false, 1); break; case 105: Steps.AddStep(5, false, 1); Steps.AddStep(0, false, 1); Steps.AddStep(5, true, 1); Steps.AddStep(0, true, 1); break; case 241: Steps.AddStep(1, true, 1); break; case 214: Steps.AddStep(0, true, 1); Steps.AddStep(4, false, 1); Steps.AddStep(0, false, 1); break; case 243: Steps.AddStep(4, true, 2); Steps.AddStep(1, true, 1); Steps.AddStep(4, true, 2); break; case 234: Steps.AddStep(0, true, 1); Steps.AddStep(4, true, 1); Steps.AddStep(0, false, 1); break; case 253: Steps.AddStep(5, true, 2); Steps.AddStep(1, false, 1); Steps.AddStep(5, true, 2); break; case 235: Steps.AddStep(0, false, 1); Steps.AddStep(5, false, 1); Steps.AddStep(0, true, 1); break; case 251: Steps.AddStep(1, false, 1); break; case 215: Steps.AddStep(0, false, 1); Steps.AddStep(5, true, 1); Steps.AddStep(0, true, 1); break; case 312: Steps.AddStep(2,true,1); Steps.AddStep(5,true,1); Steps.AddStep(1,false,1); Steps.AddStep(5,false,1); break; case 321: Steps.AddStep(1,true,2); break; case 342: Steps.AddStep(4,false,1); Steps.AddStep(1,true,1); Steps.AddStep(4,true,1); break; case 324: Steps.AddStep(2,true,1); Steps.AddStep(1,true,2); break; case 352: Steps.AddStep(5,true,1); Steps.AddStep(1,false,1); Steps.AddStep(5,false,1); break; case 325: Steps.AddStep(2,false,1); Steps.AddStep(1,true,2); break; case 332: Steps.AddStep(2,true,1); Steps.AddStep(4,false,1); Steps.AddStep(1,true,1); Steps.AddStep(4,true,1); break; case 323: Steps.AddStep(2,true,2); Steps.AddStep(1,true,2); break; default: //Do nothing break; } for(Steps.Index=CurrentStep;Steps.Index<Steps.Count;Steps.Index++) { Rubik.RotateRealSide(Steps.Color(), Steps.ClockWise(), Steps.Quarter()); } Rubik.ChangeViewToColor(c[0]); } } public static void TopCorner() throws Exception { int CurrentStep=Steps.Count; int GetPos=0; int[] c=new int[5]; int nTopPos=0; int nOtherPos=0; int nSum=0; boolean bFlag=false; c[0]=Rubik.Sides[0][1][1]; c[1]=Rubik.Sides[1][1][1]; c[2]=Rubik.Sides[5][1][1]; c[3]=Rubik.Sides[3][1][1]; c[4]=Rubik.Sides[4][1][1]; for(int i=1;i<5;i++) { Rubik.ChangeViewToColor(c[0]); Rubik.ChangeViewFromTopByNextColor(c[i]); int j=i+1; if(j==5) j=1; GetPos=Rubik.FindCornerCell(c[0],c[i],c[j]); if(GetPos!=1015) { //1015 means already fixed if(GetPos<2000) { //In top layer, move to bottom first CurrentStep=Steps.Count; nTopPos=GetBit(GetPos,3); nSum=GetSum(GetPos)-1; nOtherPos=(nTopPos==0?GetBit(GetPos,1):(nSum-nTopPos)); if(nOtherPos==5 && nSum==6) bFlag=false; if(nOtherPos==5 && nSum==8) bFlag=true; if(nOtherPos==3 && nSum==8) bFlag=false; if(nOtherPos==3 && nSum==7) bFlag=true; if(nOtherPos==4 && nSum==7) bFlag=false; if(nOtherPos==4 && nSum==5) bFlag=true; if(nOtherPos==1 && nSum==5) bFlag=false; if(nOtherPos==1 && nSum==6) bFlag=true; Steps.AddStep(nOtherPos, bFlag, 1); Steps.AddStep(2, !bFlag, 1); Steps.AddStep(nOtherPos, !bFlag, 1); for(Steps.Index=CurrentStep;Steps.Index<Steps.Count;Steps.Index++) { Rubik.RotateRealSide(Steps.Color(), Steps.ClockWise(), Steps.Quarter()); } Rubik.ChangeViewToColor(c[0]); Rubik.ChangeViewFromTopByNextColor(c[i]); GetPos=Rubik.FindCornerCell(c[0],c[i],c