我今天看到一个网站,就是关于魔方的,里面二阶魔方引起了我的兴趣。
https://rubiks-cube-solver.com/2x2/
进去后你们可以看到,二阶魔方的平面展开图,复原也更加困难。虽然是英文的,但我还是玩得不亦乐乎。好不容易解出来了二阶,当我兴致勃勃的打开三阶魔方时,却傻眼了,因为三阶虽然有平面图,但不能转动,有点坑。咋办?
我才想起来,我会编程啊,那个csdn都好久没有打开过了。于是我就自己做了个三阶魔方的平面展开。
效果图:
有点垃圾,只有转动功能。
接下来是代码
#include
#include
#include
using namespace std;
char U[9]={'y','y','y',
'y','y','y',
'y','y','y'};
char F[9]={'o','o','o',
'o','o','o',
'o','o','o'};
char L[9]={'g','g','g',
'g','g','g',
'g','g','g'};
char R[9]={'b','b','b',
'b','b','b',
'b','b','b'};
char D[9]={'w','w','w',
'w','w','w',
'w','w','w'};
char B[9]={'r','r','r',
'r','r','r',
'r','r','r'};
HANDLE hConsole = GetStdHandle((STD_OUTPUT_HANDLE));
void color(char a){//方块颜色
switch(a){
case 'y':
SetConsoleTextAttribute(hConsole,FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_GREEN);
cout<<"■";
break;
case 'o':
SetConsoleTextAttribute(hConsole,FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_GREEN);
cout<<"橘";
break;
case 'g':
SetConsoleTextAttribute(hConsole,FOREGROUND_INTENSITY|FOREGROUND_GREEN);
cout<<"■";
break;
case 'b':
SetConsoleTextAttribute(hConsole,FOREGROUND_INTENSITY|FOREGROUND_BLUE);
cout<<"■";
break;
case 'w':
SetConsoleTextAttribute(hConsole,FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_BLUE);
cout<<"■";
break;
case 'r':
SetConsoleTextAttribute(hConsole,FOREGROUND_INTENSITY|FOREGROUND_RED);
cout<<"■";
break;
}
SetConsoleTextAttribute(hConsole,FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_BLUE);
}
void show(){
cout<<" ";color(B[0]);color(B[1]);color(B[2]);cout<
看着有点啰嗦。
然后代码详解的话,不想看的可以跳过(针对新人,大佬们后面还有货)
首先是关于颜色这一块,我选的是比较简单的SetConsoleTextAttribute函数。
HANDLE hConsole = GetStdHandle((STD_OUTPUT_HANDLE));
void color(char a){//方块颜色
switch(a){
case 'y':
SetConsoleTextAttribute(hConsole,FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_GREEN);
cout<<"■";
break;
case 'o':
SetConsoleTextAttribute(hConsole,FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_GREEN);
cout<<"橘";
break;
case 'g':
SetConsoleTextAttribute(hConsole,FOREGROUND_INTENSITY|FOREGROUND_GREEN);
cout<<"■";
break;
case 'b':
SetConsoleTextAttribute(hConsole,FOREGROUND_INTENSITY|FOREGROUND_BLUE);
cout<<"■";
break;
case 'w':
SetConsoleTextAttribute(hConsole,FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_BLUE);
cout<<"■";
break;
case 'r':
SetConsoleTextAttribute(hConsole,FOREGROUND_INTENSITY|FOREGROUND_RED);
cout<<"■";
break;
}
SetConsoleTextAttribute(hConsole,FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_BLUE);
}
然后呢这个函数就是用混色,有16种颜色好像是,但是没有橘色(为了这个橘色我找了好久),我用其他办法代替了。
注意一下,这个函数要用
我自己写的这个函数还是简单易懂的,就是用switch,判断目标数组(魔方的面)的那一块是什么颜色就放什么方块。
这个函数挺简单啊,就是打印一堆空格还有方块,调用前面的color就行了
没有合适的英文词...
void silunhuan(char &s1,char &s2,char &s3,char &s4){//为了偷懒写的四轮换
char t1,t2;
t1=s2;
s2=s1;
t2=s3;
s3=t1;
t1=s4;
s4=t2;
s1=t1;
return;
}
这个有一种很好笑的理解(就是我这个好笑的人的理解),我觉得,就像走彭罗斯阶梯一样,左脚右脚,绕了一圈停了(不好笑)。
其实就是保存第二个数,把第一个给他,然后用另一个变量保存第三个数,用第二个换它...以此类推。
就是里面调用,有可以教的的就只有两个函数
while(!kbhit()){}
a=_getch();
主函数里面的这个,是为了把它卡进循环里,kbhit()和_getch()函数需要
kbhit就是按键才会触发,_getch刚好可以接收,而且_getch不用回车,很不戳。
就是一个步骤还原器
#include
#include
#include
using namespace std;
char U[9]={'y','y','y',
'y','y','y',
'y','y','y'};
char F[9]={'o','o','o',
'o','o','o',
'o','o','o'};
char L[9]={'g','g','g',
'g','g','g',
'g','g','g'};
char R[9]={'b','b','b',
'b','b','b',
'b','b','b'};
char D[9]={'w','w','w',
'w','w','w',
'w','w','w'};
char B[9]={'r','r','r',
'r','r','r',
'r','r','r'};
HANDLE hConsole = GetStdHandle((STD_OUTPUT_HANDLE));
void color(char a){//方块颜色
switch(a){
case 'y':
SetConsoleTextAttribute(hConsole,FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_GREEN);
cout<<"■";
break;
case 'o':
SetConsoleTextAttribute(hConsole,FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_GREEN);
cout<<"橘";
break;
case 'g':
SetConsoleTextAttribute(hConsole,FOREGROUND_INTENSITY|FOREGROUND_GREEN);
cout<<"■";
break;
case 'b':
SetConsoleTextAttribute(hConsole,FOREGROUND_INTENSITY|FOREGROUND_BLUE);
cout<<"■";
break;
case 'w':
SetConsoleTextAttribute(hConsole,FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_BLUE);
cout<<"■";
break;
case 'r':
SetConsoleTextAttribute(hConsole,FOREGROUND_INTENSITY|FOREGROUND_RED);
cout<<"■";
break;
}
SetConsoleTextAttribute(hConsole,FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_BLUE);
}
void show(){
cout<<" ";color(B[0]);color(B[1]);color(B[2]);cout<>a;
switch(a){
case 'y':
silunhuan(U[0],U[2],U[8],U[6]);
silunhuan(U[1],U[5],U[7],U[3]);
silunhuan(B[6],R[0],F[2],L[8]);
silunhuan(B[7],R[3],F[1],L[5]);
silunhuan(B[8],R[6],F[0],L[2]);
break;
case 'r':
silunhuan(B[0],B[2],B[8],B[6]);
silunhuan(B[1],B[5],B[7],B[3]);
silunhuan(D[0],R[0],U[0],L[0]);
silunhuan(D[1],R[1],U[1],L[1]);
silunhuan(D[2],R[2],U[2],L[2]);
break;
case 'w':
silunhuan(D[0],D[2],D[8],D[6]);
silunhuan(D[1],D[5],D[7],D[3]);
silunhuan(B[0],L[6],F[8],R[2]);
silunhuan(B[1],L[3],F[7],R[5]);
silunhuan(B[2],L[0],F[6],R[8]);
break;
case 'o':
silunhuan(F[0],F[2],F[8],F[6]);
silunhuan(F[1],F[5],F[7],F[3]);
silunhuan(L[6],U[6],R[6],D[6]);
silunhuan(L[7],U[7],R[7],D[7]);
silunhuan(L[8],U[8],R[8],D[8]);
break;
case 'b':
silunhuan(R[0],R[2],R[8],R[6]);
silunhuan(R[1],R[5],R[7],R[3]);
silunhuan(F[2],U[2],B[2],D[6]);
silunhuan(F[5],U[5],B[5],D[3]);
silunhuan(F[8],U[8],B[8],D[0]);
break;
case 'g':
silunhuan(L[0],L[2],L[8],L[6]);
silunhuan(L[1],L[5],L[7],L[3]);
silunhuan(B[0],U[0],F[0],D[8]);
silunhuan(B[3],U[3],F[3],D[5]);
silunhuan(B[6],U[6],F[6],D[2]);
break;
}
system("cls");
}
return 0;
}
找出来除文字外的区别了吗?
然后祝你们玩的开心!!!
不更了,因为一些原因,编了一半的第二章丢了。没人帮我根本更不下去(况且是学生党,因为一些变故最近都没时间)