前言和效果图
我今天看到一个网站,就是关于魔方的,里面二阶魔方引起了我的兴趣。
https://rubiks-cube-solver.com/2x2/
进去后你们可以看到,二阶魔方的平面展开图,复原也更加困难。虽然是英文的,但我还是玩得不亦乐乎。好不容易解出来了二阶,当我兴致勃勃的打开三阶魔方时,却傻眼了,因为三阶虽然有平面图,但不能转动,有点坑。咋办?
我才想起来,我会编程啊,那个csdn都好久没有打开过了。于是我就自己做了个三阶魔方的平面展开。
效果图:
有点垃圾,只有转动功能。
代码
接下来是代码
#include<bits/stdc++.h>
#include<windows.h>
#include<conio.h>
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<<endl;
cout<<" ";color(B[3]);color(B[4]);color(B[5]);cout<<endl;
cout<<" ";color(B[6]);color(B[7]);color(B[8]);cout<<endl;
color(L[0]);color(L[1]);color(L[2]);color(U[0]);color(U[1]);color(U[2]);color(R[0]);color(R[1]);color(R[2]);color(D[0]);color(D[1]);color(D[2]);cout<<endl;
color(L[3]);color(L[4]);color(L[5]);color(U[3]);color(U[4]);color(U[5]);color(R[3]);color(R[4]);color(R[5]);color(D[3]);color(D[4]);color(D[5]);cout<<endl;
color(L[6]);color(L[7]);color(L[8]);color(U[6]);color(U[7]);color(U[8]);color(R[6]);color(R[7]);color(R[8]);color(D[6]);color(D[7]);color(D[8]);cout<<endl;
cout<<" ";color(F[0]);color(F[1]);color(F[2]);cout<<endl;
cout<<" ";color(F[3]);color(F[4]);color(F[5]);cout<<endl;
cout<<" ";color(F[6]);color(F[7]);color(F[8]);cout<<endl;
}
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;
}
int main(){
while(true){
show();
cout<<"这是一个永远循环,你可以在这里尽情玩困难三阶魔方"<<endl;
cout<<"y转黄面r转红面w转白面o转橘面b转蓝面g转绿面,都是顺时针"<<endl;
cout<<"因为无法显示橘色所以用黄色上面写橘代替"<<endl;
char a;
while(!kbhit()){
}
a=_getch();
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;
}
看着有点啰嗦。
不那么详细的详解
颜色color函数(内涵SetConsoleTextAttribute函数)
然后代码详解的话,不想看的可以跳过(针对新人,大佬们后面还有货)
首先是关于颜色这一块,我选的是比较简单的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种颜色好像是,但是没有橘色(为了这个橘色我找了好久),我用其他办法代替了。
注意一下,这个函数要用<windows.h>库,然后在使用前要写HANDLE hConsole = GetStdHandle((STD_OUTPUT_HANDLE));(hConsole可以改成别的,后面都要改)不过因为比赛啥的不会用这个,我就没有多学,就用最简单的。
我自己写的这个函数还是简单易懂的,就是用switch,判断目标数组(魔方的面)的那一块是什么颜色就放什么方块。
show函数
这个函数挺简单啊,就是打印一堆空格还有方块,调用前面的color就行了
silunhuan四轮换函数
没有合适的英文词...
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;
}
这个有一种很好笑的理解(就是我这个好笑的人的理解),我觉得,就像走彭罗斯阶梯一样,左脚右脚,绕了一圈停了(不好笑)。
其实就是保存第二个数,把第一个给他,然后用另一个变量保存第三个数,用第二个换它...以此类推。
主函数(内涵kbhit,_getch函数)
就是里面调用,有可以教的的就只有两个函数
while(!kbhit()){}
a=_getch();
主函数里面的这个,是为了把它卡进循环里,kbhit()和_getch()函数需要<conio.h>才能用,记住。
kbhit就是按键才会触发,_getch刚好可以接收,而且_getch不用回车,很不戳。
然后是前面说的货
就是一个步骤还原器
#include<bits/stdc++.h>
#include<windows.h>
#include<conio.h>
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<<endl;
cout<<" ";color(B[3]);color(B[4]);color(B[5]);cout<<endl;
cout<<" ";color(B[6]);color(B[7]);color(B[8]);cout<<endl;
color(L[0]);color(L[1]);color(L[2]);color(U[0]);color(U[1]);color(U[2]);color(R[0]);color(R[1]);color(R[2]);color(D[0]);color(D[1]);color(D[2]);cout<<endl;
color(L[3]);color(L[4]);color(L[5]);color(U[3]);color(U[4]);color(U[5]);color(R[3]);color(R[4]);color(R[5]);color(D[3]);color(D[4]);color(D[5]);cout<<endl;
color(L[6]);color(L[7]);color(L[8]);color(U[6]);color(U[7]);color(U[8]);color(R[6]);color(R[7]);color(R[8]);color(D[6]);color(D[7]);color(D[8]);cout<<endl;
cout<<" ";color(F[0]);color(F[1]);color(F[2]);cout<<endl;
cout<<" ";color(F[3]);color(F[4]);color(F[5]);cout<<endl;
cout<<" ";color(F[6]);color(F[7]);color(F[8]);cout<<endl;
}
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;
}
int main(){
while(true){
show();
cout<<"这是一个像上发条一样的,一次性输入很多个字母,然后一直按回车就可以看它的转动,可以在遇到平面不知道怎么做的公式时去模拟"<<endl;
cout<<"y转黄面r转红面w转白面o转橘面b转蓝面g转绿面,都是顺时针"<<endl;
cout<<"因为无法显示橘色所以用黄色上面写橘代替"<<endl;
char a;
getch();
cin>>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;
}
找出来除文字外的区别了吗?
然后祝你们玩的开心!!!
关于火龙征战
不更了,因为一些原因,编了一半的第二章丢了。没人帮我根本更不下去(况且是学生党,因为一些变故最近都没时间)