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

前言和效果图

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

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

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

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

关于火龙征战

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
三阶魔方的最快复原公式并不存在一个确定的、固定的公式,因为魔方的状态组合非常多,每一种状态的复原公式都是不同的。 然而,有一些经典的魔方复原方法,它们可以在相对较短的时间内对魔方进行复原。 其中,最著名的方法之一是 CFOP (Cross, F2L, OLL, PLL) 方法。CFOP 方法将魔方的复原分为四个步骤:组成底十字、F2L (First 2 Layers) 、OLL (Orientation of the Last Layer)、PLL (Permutation of the Last Layer)。 具体步骤如下: 1. 组成底十字(Cross):将底面上的四个棱块组成一个十字形,同时将底面的四个角块归位。这个步骤是整个复原过程中最重要的一步,因为它决定了魔方的后续复原步骤。 2. F2L:将第二层的棱块和角块归位。这个步骤需要一些预先练习和技巧,因为它需要对棱块和角块的位置和方向进行判断和调整。 3. OLL:调整顶面的棱块和角块,使得它们的朝向符合某种预设的模式。这个步骤需要记忆一些模式和公式。 4. PLL:调整顶面的棱块和角块,使得它们的位置和朝向都符合某种预设的模式。这个步骤也需要记忆一些模式和公式。 以上四个步骤都需要进行预先的练习和记忆,才能在比赛中达到快速的复原效果。 需要注意的是,CFOP 方法只是魔方复原中的一种方法,它并不是唯一的、最快的复原方法。复原魔方的方法还有很多,比如 Roux 方法、ZZ 方法等等,每种方法都有其独特的优点和难点,需要根据自己的喜好和个人技能来选择。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值