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

news2024/11/24 19:52:29

前言和效果图

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

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

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

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

关于火龙征战

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/154489.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

查看GPU使用情况和设置CUDA_VISIBLE_DEVICES

文章目录一、简介二、查看GPU状态和信息三、使用3.1临时设置&#xff08;临时设置方法一定要在第一次使用 cuda 之前进行设置&#xff09;3.2python 运行时设置3.3永久设置四、参考资料一、简介 服务器中有多个GPU&#xff0c;选择特定的GPU运行程序可在程序运行命令前使用&am…

企业舆情监控排查什么,TOOM讲解企业舆情监控工作方案?

互联网时代&#xff0c;企业舆情发生因素很多&#xff0c;如果不能及时监控解决&#xff0c;就会引发无限舆情发展&#xff0c;进而影响到企业品牌声誉&#xff0c;引发企业信用危机&#xff0c;所以就需要做好企业舆情监控&#xff0c;接下来我们简单了解企业舆情监控排查什么…

CMMI的五个级别及其特征简述

CMMI 一共分五个级别&#xff0c;一级最低&#xff0c;五级最高&#xff0c;一般企业初次认证CMMI从三级开始。 1、CMMI一级&#xff0c;完成级。在完成级水平上&#xff0c;企业对项目的目标与要做的努力很清晰。项目的目标得以实现。一般来说&#xff0c;公司的初始阶段就…

【C进阶】指针笔试题汇总

家人们欢迎来到小姜的世界&#xff0c;<<点此>>传送门 这里有详细的关于C/C/Linux等的解析课程&#xff0c;家人们赶紧冲鸭&#xff01;&#xff01;&#xff01; 指针笔试题前言一、题1&#xff08;一&#xff09;题目&#xff08;二&#xff09;答案及解析&#…

【Python】函数——模块与函数的导入

概述 为了方便使用函数&#xff0c;我们可以将函数存储在称为模块的独立文件中&#xff0c;再将模块导入到主程序中&#xff0c;导入一个模块需要使用import语句。 导入整个模块 模块是扩展名为.py的文件 1、导入某个模块 语法为&#xff1a; import module_name 2、导入…

[oeasy]python0043_八进制_oct_octal_october_octave

八进制(oct) 回忆上次内容 什么是 转义&#xff1f; 转义转义 转化含义\ 是 转义字符\n、\r是 转义序列 还有什么 转义序列 吗&#xff1f; \a是 响铃\b 退格键\t 水平制表符 tab键\v、\f 实现喂纸不回车 通过 16进制数值 转义 \xhh输出 (hh)16进制对应的ascii字符 如果我们不…

Portainer使用docker compose搭建nacos并初始化MySQL、Portainer stack搭建nacos并初始化MySQL

Portainer使用docker compose搭建nacos初始化MySQL、Portainer stack搭建nacos初始化MySQL新建stack(堆栈)添加stack(堆栈)名称添加docker-compose规则配置环境变量上传初始化sql文件找初始化sql文件nacos初始化mysql-schema.sql文件内容上传sql文件到初始化挂载目录部署stack(…

打印机不打印故障简单排除方法

日常工作中经常会遇到打印机不能打印的情况&#xff0c;那么又没有专业的技术人员在场帮忙的情况下我们也可以自己动手简单的处理一下故障&#xff0c;可以尝试以下的方法进行简单的故障排除&#xff1b; 一、使打印机处于联机状态&#xff0c;如果打印机没有处于联机状态&…

医疗影像工具LEADTOOLS 入门教程: 检测和提取 MICR - 控制台 C#

LEADTOOLS是一个综合工具包的集合&#xff0c;用于将识别、文档、医疗、成像和多媒体技术整合到桌面、服务器、平板电脑、网络和移动解决方案中&#xff0c;是一项企业级文档自动化解决方案&#xff0c;有捕捉&#xff0c;OCR&#xff0c;OMR&#xff0c;表单识别和处理&#x…

基于STM32或STC的手势控制MP3语音播放器的设计

一. 系统设计框图 区别于传统设计中的按键开关控制&#xff0c;本设计可以实现通过手势控制MP3播放器。采用STM32或STC15单片机和PAJ7620手势模块&#xff0c;能够识别九种手势&#xff0c;分别为上下左右前后&#xff0c;顺时针&#xff0c;逆时针&#xff0c;挥动。在本设计…

SpringBoot视图解析与模板引擎

目录 1、视图解析 1、视图解析原理流程 2、模板引擎-Thymeleaf 1、thymeleaf简介 2、基本语法 3、设置属性值-th:attr 4、迭代 5、条件运算 6、属性优先级 3、thymeleaf使用 1、引入Starter 2、自动配置好了thymeleaf 3、页面开发 4、构建后台管理系统 1、项目…

Java基础03——数组

Java基础03——数组一、数组介绍二、数组的定义与静态初始化1. 定义数组2. 数组静态初始化三、数组元素访问1. 数组的地址值2. 数组访问四、数组遍历五、数组动态初始化六、数组常见问题1. 索引越界异常七、数组常见操作1. 求最值2. 求和3. 交换数据4. 打乱数据八、数组内存图九…

java企业人事管理系统企业工资考勤系统

简介 Java基于ssm开发的企业人事考勤工资系统&#xff0c;员工可以打卡、请假。系统根据员工的打卡情况自动计算工资&#xff08;全勤、请假、旷工、加班、迟到、早退等计算出最终实发工资&#xff09;&#xff0c;员工还可以查看自己的考勤记录工资具体组成等。升级版加了部长…

Linux——信号知识归纳(中)

目录 一.信号与硬件异常 二.阻塞信号和信号结构 &#xff08;一&#xff09;.信号状态 &#xff08;二&#xff09;.信号结构 ①pending表 ②block表 ③handler表 &#xff08;三&#xff09;.信号处理过程 &#xff08;四&#xff09;.阻塞与忽略的区别 &#xff08…

Linux 中断子系统(二):GIC 中断控制器

GIC 是 ARM 公司给 Cortex-A/R 内核提供的一个中断控制器,类似 Cortex-M 内核(STM32)中的 NVIC。 GIC:Generic Interrupt Controller,通用中断控制器 NVIC:Nested Vectored. Interrupt Controller,嵌套向量中断控制器目前 GIC 有 4 个版本:V1 ~ V4,V1 是最老的版本,已…

react源码解析20.总结第一章的面试题解答

总结 至此我们介绍了react的理念&#xff0c;如果解决cpu和io的瓶颈&#xff0c;关键是实现异步可中断的更新 我们介绍了react源码架构&#xff08;uifn(state)&#xff09;&#xff0c;从scheduler开始调度&#xff08;根据过期事件判断优先级&#xff09;&#xff0c;经过r…

测试开发 | Jenkins job 机制该如何使用?

Jenkins 像老板一样管理各种 job 。job 是 Jenkins 的一个执行计划&#xff0c;是一系列操作的集合&#xff0c;Jenkins 里的最常用的功能就是 job 的构建&#xff0c;即任务的构建。通过构建 job 即可让工人为你工作。 image806387 84.3 KB 创建 job及配置步聚 可以通过如下步…

C#,图像二值化(20)——全局阈值的耶恩算法(Yen Thresholding)及源代码

1 全局阈值的耶恩算法&#xff08;Yen Throsholding&#xff09;常见阈值算法1.1黄算法HuangThresholdImageFilter使用Shannon的熵函数实现Huang的模糊阈值[1]。模糊性度量表示原始图像与其二进制版本之间的差异。对于给定的阈值级别&#xff0c;像素的模糊隶属度函数由像素灰度…

Java中常用API总结(7)—— BigDecimal类

BigDecimal类一、前言二、概述1.API帮助文档2.使用方法三、常见方法1.格式2.实例3.报错4.解决方法四、结语一、前言 在使用float或者double类型的数据在进行数学运算的时候&#xff0c;很有可能会产生 精度丢失问题 我们都知道计算机底层在进行运算的时候&#xff0c;使用的都…

Echarts image 使用

通过image://...xx.png 在扇形图中可能会失败&#xff0c;可以将需要载入的img转换成base64直接载入可以通过背景色来载入图片 backgroundColor: {image: xxx/xxx.jpg },实例&#xff08;扇形图&#xff09;&#xff1a;var option {tooltip: {trigger: "item",show…