一直在玩魔方,也一直想把它程序化
今天终于开始动手了喔~
思路:
1.把魔方分解成六个片 (每片是1×3×3的立方体) 用一个5×5的char数组表示,分别用w,y,b,g,o,r六个字母填充数组代表各种颜色
例如: [ ][b ][b][b ][ ] b-蓝色 o-橙色 w-白色 r-红色 g-绿色
[o][w][w][w][r]
[o][w][w][w][r]
[o][w][w][w][r]
[ ][g ][g ][g][ ]
(如图所示 所谓1×3×3就是荧光线标出的区域)
2.建立Piece类,加入片的旋转属性:顺时针90度、逆时针90度、180度
3.建立Cube 类,类中有6个片分别对应魔方中的6个片,
建立函数1,控制每个片旋转对其他片的影响
建立函数2,读取用户的命令控制魔方的旋转 (比如U,L,R'等)
4.调用C++的图形库使Cube类图形化。(这部分还没有什么接触)
片类的代码:
//piece.h 方片类 #include <iostream.h> #define M 5 //====================================================== class Piece { private: char a[M][M]; public: Piece(char x[M][M]) //构造函数引入主程序中的数组进行初始化 { for (int i=0;i<M;i++) for (int j=0;j<M;j++) a[i][j]=x[i][j]; } void cirNI(void) //逆时针旋转函数 { int b[M][M]; int i,j; for (i=0;i<M;i++) for (j=0;j<M;j++) b[M-1-j][i]=a[i][j]; //将数组a转向放入数组b for (i=0;i<M;i++) for (j=0;j<M;j++) a[i][j]=b[i][j]; } void cirSH(void) //顺时针旋转函数 { int b[M][M]; int i,j; for (i=0;i<M;i++) for (j=0;j<M;j++) b[j][M-i-1]=a[i][j]; for (i=0;i<M;i++) for (j=0;j<M;j++) a[i][j]=b[i][j]; } void cirNIPP(void) //180度旋转函数 { int b[M][M]; int i,j; for (i=0;i<M;i++) for (j=0;j<M;j++) b[M-i-1][M-j-1]=a[i][j]; for (i=0;i<M;i++) for (j=0;j<M;j++) a[i][j]=b[i][j]; } void show(void) //打印数组 { for(int i=0;i<M;i++) { for(int j=0;j<M;j++) cout<<a[i][j]<<" "; cout<<endl; } } };
这个头文件的思路来源于这里:http://zhidao.baidu.com/question/165615023.html?si=1
核心语句:
b[M-1-j][i]=a[i][j]; 逆时针旋转
b[j][M-i-1]=a[i][j]; 顺时针旋转
b[M-i-1][M-j-1]=a[i][j]; 180度旋转