C++中模拟一个可以旋转的魔方(一)

一直在玩魔方,也一直想把它程序化

今天终于开始动手了喔~

思路:

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度旋转

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值