魔方爱好者快来康康,困难的平面魔方来了!

前言和效果图

我今天看到一个网站,就是关于魔方的,里面二阶魔方引起了我的兴趣。

https://rubiks-cube-solver.com/2x2/

进去后你们可以看到,二阶魔方的平面展开图,复原也更加困难。虽然是英文的,但我还是玩得不亦乐乎。好不容易解出来了二阶,当我兴致勃勃的打开三阶魔方时,却傻眼了,因为三阶虽然有平面图,但不能转动,有点坑。咋办?

我才想起来,我会编程啊,那个csdn都好久没有打开过了。于是我就自己做了个三阶魔方的平面展开。

效果图:

魔方爱好者快来康康,困难的平面魔方来了!_第1张图片

有点垃圾,只有转动功能。

代码

接下来是代码

#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<

看着有点啰嗦。

不那么详细的详解

颜色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种颜色好像是,但是没有橘色(为了这个橘色我找了好久),我用其他办法代替了。

注意一下,这个函数要用库,然后在使用前要写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()函数需要才能用,记住。

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;
} 

找出来除文字外的区别了吗?

然后祝你们玩的开心!!!

关于火龙征战

不更了,因为一些原因,编了一半的第二章丢了。没人帮我根本更不下去(况且是学生党,因为一些变故最近都没时间)

你可能感兴趣的:(c++,魔方)