从小学5年级开始,我就比较喜欢玩魔方。今天闲得没事,用了一个下午加一个晚上的时间,写了个电子版的3阶魔方,自己打乱,然后再亲自还原,测试后代码没问题。不同于现实生活中的魔方,我这个电子版的3阶魔方要用键盘来玩。不同的按键代表不同的转法,按一次就转一次。代码思路类似我曾经写的推箱子小游戏,本文就不再做一些详细的代码注释。请参见往期文章:C语言数组+内存编址+推箱子小游戏中的推箱子小游戏
,里面有详细的代码注释。
思路描述:一个三阶的魔方总共有6个面,每个面有9个小块。三阶魔方总共有三层。总共有54个小块。由于不能填充颜色,我分别用1,2,3,4,5,6六个数字来填充每个面。每个小块中的数字我保存到一个一维数组中的,当然代码可以更改,因为保存到一个一维数组会使程序设计起来非常的繁琐,所以也可以用多个数组来保存数字。以下是运行的效果图:
第一行介绍了按键表,一开始玩家可能会因为不熟练感到很麻烦,不过熟悉了这些按键后,拼起来会很迅速。
T
顶层左转Y
顶层右转R
左层上转F
左层下转U
右层上转J
右层下转B
底层左转N
底层右转G
后层逆时针H
后层顺时针E
竖中间层上转D
竖中间层下转I
横中间层左转K
横中间层右转W
前层逆时针O
前层顺时针V
前后中间层逆时针M
前后中间层顺时针
左视图:即从左边看的图,作为辅助面
底透视图:从魔方的上面往下看,透视上面的三层直接看底面的数字,作为辅助面
后透视图:从魔方的前面往后看,透视前三层直接看后面,作为拼魔方时的辅助面
竖中间层:最左层和最右层中间的一层
横中间层:最上面一层和最下面一层中间的一层
前后中间层:最前面的一层和最后面的一层中间的一层
代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
int a[55]={0,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,3,4,4,4,4,4,4,4,4,4,5,5,5,5,5,5,5,5,5,6,6,6,6,6,6,6,6,6};
void PRINT();
void Play();
int main()
{
system("color 70");
Play();
return 0;
}
void Play()
{
char input;
int t;
while(1)
{
system("cls");
PRINT();
input = _getch();
switch(input)
{
case'T':case't':
t=a[1];a[1]=a[7];a[7]=a[9];a[9]=a[3];a[3]=t;t=a[2];a[2]=a[4];a[4]=a[8];a[8]=a[6];a[6]=t;t=a[37];a[37]=a[10];a[10]=a[19];a[19]=a[30];a[30]=t;
t=a[38];a[38]=a[11];a[11]=a[20];a[20]=a[29];a[29]=t;t=a[39];a[39]=a[12];a[12]=a[21];a[21]=a[28];a[28]=t;
break;
case'Y':case'y':
t=a[3];a[3]=a[9];a[9]=a[7];a[7]=a[1];a[1]=t;t=a[6];a[6]=a[8];a[8]=a[4];a[4]=a[2];a[2]=t;t=a[30];a[30]=a[19];a[19]=a[10];a[10]=a[37];a[37]=t;
t=a[29];a[29]=a[20];a[20]=a[11];a[11]=a[38];a[38]=t;t=a[28];a[28]=a[21];a[21]=a[12];a[12]=a[39];a[39]=t;
break;
case'R':case'r':
t=a[39];a[39]=a[45];a[45]=a[43];a[43]=a[37];a[37]=t;t=a[42];a[42]=a[44];a[44]=a[40];a[40]=a[38];a[38]=t;t=a[10];a[10]=a[52];a[52]=a[34];a[34]=a[1];a[1]=t;
t=a[4];a[4]=a[13];a[13]=a[49];a[49]=a[31];a[31]=t;t=a[7];a[7]=a[16];a[16]=a[46];a[46]=a[28];a[28]=t;
break;
case'F':case'f':
t=a[37];a[37]=a[43];a[43]=a[45];a[45]=a[39];a[39]=t;t=a[38];a[38]=a[40];a[40]=a[44];a[44]=a[42];a[42]=t;t=a[1];a[1]=a[34];a[34]=a[52];a[52]=a[10];a[10]=t;
t=a[31];a[31]=a[49];a[49]=a[13];a[13]=a[4];a[4]=t;t=a[28];a[28]=a[46];a[46]=a[16];a[16]=a[7];a[7]=t;
break;
case'U':case'u':
t=a[3];a[3]=a[12];a[12]=a[54];a[54]=a[36];a[36]=t;t=a[9];a[9]=a[18];a[18]=a[48];a[48]=a[30];a[30]=t;t=a[6];a[6]=a[15];a[15]=a[51];a[51]=a[33];a[33]=t;
t=a[19];a[19]=a[25];a[25]=a[27];a[27]=a[21];a[21]=t;t=a[22];a[22]=a[26];a[26]=a[24];a[24]=a[20];a[20]=t;
break;
case'J':case'j':
t=a[36];a[36]=a[54];a[54]=a[12];a[12]=a[3];a[3]=t;t=a[30];a[30]=a[48];a[48]=a[18];a[18]=a[9];a[9]=t;t=a[33];a[33]=a[51];a[51]=a[15];a[15]=a[6];a[6]=t;
t=a[21];a[21]=a[27];a[27]=a[25];a[25]=a[19];a[19]=t;t=a[20];a[20]=a[24];a[24]=a[26];a[26]=a[22];a[22]=t;
break;
case'B':case'b':
t=a[46];a[46]=a[52];a[52]=a[54];a[54]=a[48];a[48]=t;t=a[49];a[49]=a[53];a[53]=a[51];a[51]=a[47];a[47]=t;t=a[43];a[43]=a[16];a[16]=a[25];a[25]=a[36];a[36]=t;
t=a[44];a[44]=a[17];a[17]=a[26];a[26]=a[35];a[35]=t;t=a[45];a[45]=a[18];a[18]=a[27];a[27]=a[34];a[34]=t;
break;
case'N':case'n':
t=a[48];a[48]=a[54];a[54]=a[52];a[52]=a[46];a[46]=t;t=a[47];a[47]=a[51];a[51]=a[53];a[53]=a[49];a[49]=t;t=a[36];a[36]=a[25];a[25]=a[16];a[16]=a[43];a[43]=t;
t=a[35];a[35]=a[26];a[26]=a[17];a[17]=a[44];a[44]=t;t=a[34];a[34]=a[27];a[27]=a[18];a[18]=a[45];a[45]=t;
break;
case'G':case'g':
t=a[28];a[28]=a[30];a[30]=a[36];a[36]=a[34];a[34]=t;t=a[29];a[29]=a[33];a[33]=a[35];a[35]=a[31];a[31]=t;t=a[1];a[1]=a[21];a[21]=a[48];a[48]=a[43];a[43]=t;
t=a[2];a[2]=a[24];a[24]=a[47];a[47]=a[40];a[40]=t;t=a[3];a[3]=a[27];a[27]=a[46];a[46]=a[37];a[37]=t;
break;
case'H':case'h':
t=a[34];a[34]=a[36];a[36]=a[30];a[30]=a[28];a[28]=t;t=a[31];a[31]=a[35];a[35]=a[33];a[33]=a[29];a[29]=t;t=a[43];a[43]=a[48];a[48]=a[21];a[21]=a[1];a[1]=t;
t=a[40];a[40]=a[47];a[47]=a[24];a[24]=a[2];a[2]=t;t=a[37];a[37]=a[46];a[46]=a[27];a[27]=a[3];a[3]=t;
break;
case'E':case'e':
t=a[2];a[2]=a[11];a[11]=a[53];a[53]=a[35];a[35]=t;t=a[5];a[5]=a[14];a[14]=a[50];a[50]=a[32];a[32]=t;t=a[8];a[8]=a[17];a[17]=a[47];a[47]=a[29];a[29]=t;
break;
case'D':case'd':
t=a[35];a[35]=a[53];a[53]=a[11];a[11]=a[2];a[2]=t;t=a[32];a[32]=a[50];a[50]=a[14];a[14]=a[5];a[5]=t;t=a[29];a[29]=a[47];a[47]=a[17];a[17]=a[8];a[8]=t;
break;
case'I':case'i':
t=a[40];a[40]=a[13];a[13]=a[22];a[22]=a[33];a[33]=t;t=a[41];a[41]=a[14];a[14]=a[23];a[23]=a[32];a[32]=t;t=a[42];a[42]=a[15];a[15]=a[24];a[24]=a[31];a[31]=t;
break;
case'K':case'k':
t=a[33];a[33]=a[22];a[22]=a[13];a[13]=a[40];a[40]=t;t=a[32];a[32]=a[23];a[23]=a[14];a[14]=a[41];a[41]=t;t=a[31];a[31]=a[24];a[24]=a[15];a[15]=a[42];a[42]=t;
break;
case'W':case'w':
t=a[10];a[10]=a[12];a[12]=a[18];a[18]=a[16];a[16]=t;t=a[11];a[11]=a[15];a[15]=a[17];a[17]=a[13];a[13]=t;t=a[7];a[7]=a[19];a[19]=a[54];a[54]=a[45];a[45]=t;
t=a[8];a[8]=a[22];a[22]=a[53];a[53]=a[42];a[42]=t;t=a[9];a[9]=a[25];a[25]=a[52];a[52]=a[39];a[39]=t;
break;
case'O':case'o':
t=a[16];a[16]=a[18];a[18]=a[12];a[12]=a[10];a[10]=t;t=a[13];a[13]=a[17];a[17]=a[15];a[15]=a[11];a[11]=t;t=a[45];a[45]=a[54];a[54]=a[19];a[19]=a[7];a[7]=t;
t=a[42];a[42]=a[53];a[53]=a[22];a[22]=a[8];a[8]=t;t=a[39];a[39]=a[52];a[52]=a[25];a[25]=a[9];a[9]=t;
break;
case'V':case'v':
t=a[4];a[4]=a[20];a[20]=a[51];a[51]=a[44];a[44]=t;t=a[5];a[5]=a[23];a[23]=a[50];a[50]=a[41];a[41]=t;t=a[6];a[6]=a[26];a[26]=a[49];a[49]=a[38];a[38]=t;
break;
case'M':case'm':
t=a[44];a[44]=a[51];a[51]=a[20];a[20]=a[4];a[4]=t;t=a[41];a[41]=a[50];a[50]=a[23];a[23]=a[5];a[5]=t;t=a[38];a[38]=a[49];a[49]=a[26];a[26]=a[6];a[6]=t;
break;
}
}
}
void PRINT()
{
printf("按键表:T顶层左转 Y顶层右转 R左层上转 F左层下转 U右层上转 J右层下转 B底层左转 N底层右转 G后层逆时针 H后层顺时针\n");
printf(" E竖中间层上转 D竖中间层下转 I横中间层左转 K横中间层右转 W前层逆时针 O前层顺时针 V前后中间层逆时针 M前后中间层顺时针\n");
printf("\t\t\t\t\t\t\t\t____________________________________\n");
printf("\t\t\t\t\t\t\t / / / /|\n");
printf("\t\t\t\t\t\t\t / %d / %d / %d / |\n",a[1],a[2],a[3]);
printf("\t\t\t\t\t\t\t /___________/___________/___________/ | 后透视图:_______________________\n");
printf("\t\t\t\t\t\t\t / / / /| | | | | |\n");
printf("\t\t\t\t\t前后中间层---------/ %d / %d / %d / |%d | | %d | %d | %d |\n",a[4],a[5],a[6],a[21],a[28],a[29],a[30]);
printf("\t\t\t\t\t\t\t /___________/___________/___________/ | | |_______|_______|_______|\n");
printf("\t\t\t\t\t\t\t / / / /| | /| | | | |\n");
printf("\t\t\t\t\t\t\t/ %d / %d / %d / |%d |/ | | %d | %d | %d |\n",a[7],a[8],a[9],a[20],a[31],a[32],a[33]);
printf("\t\t\t\t\t\t /___________/___________/___________/ | | | |_______|_______|_______|\n");
printf("\t\t\t\t\t\t | | | | | /|%d | | | | |\n",a[24]);
printf("\t\t\t\t\t\t | | | |%d |/ | | | %d | %d | %d |\n",a[19],a[34],a[35],a[36]);
printf("\t左视图:_______________________\t\t | %d | %d | %d | | | /| |_______|_______|_______|\n",a[10],a[11],a[12]);
printf("\t | | | |\t | | | | /|%d |/ |\n",a[23]);
printf("\t | %d | %d | %d |\t |___________|___________|___________|/ | | |\n",a[37],a[38],a[39]);
printf("\t |_______|_______|_______|\t | | | | | /|%d |\n",a[27]);
printf("\t | | | |\t | | | |%d |/ | |\n",a[22]);
printf("\t | %d | %d | %d |横中间层-------| %d | %d | %d | | | /\n",a[40],a[41],a[42],a[13],a[14],a[15]);
printf("\t |_______|_______|_______|\t | | | | /|%d |/\n",a[26]);
printf("\t | | | |\t |___________|___________|___________|/ | |\n");
printf("\t | %d | %d | %d |\t | | | | | /\n",a[43],a[44],a[45]);
printf("\t |_______|_______|_______|\t | | | |%d |/\n",a[25]);
printf("\t\t\t\t\t\t | %d | %d | %d | |\n",a[16],a[17],a[18]);
printf("\t\t\t\t\t\t | | | | /\n");
printf("\t\t\t\t\t\t |___________|___________|___________|/\n");
printf("\t\t\t\t\t\t\t\t 竖中间层\n\n\n\n");
printf("\t\t\t\t\t\t 底透视图:_______________________\t\n");
printf("\t\t\t\t\t\t | | | |\n");
printf("\t\t\t\t\t\t | %d | %d | %d |\n",a[46],a[47],a[48]);
printf("\t\t\t\t\t\t |_______|_______|_______|\n");
printf("\t\t\t\t\t\t | | | |\n");
printf("\t\t\t\t\t\t | %d | %d | %d |\n",a[49],a[50],a[51]);
printf("\t\t\t\t\t\t |_______|_______|_______|\n");
printf("\t\t\t\t\t\t | | | |\n");
printf("\t\t\t\t\t\t | %d | %d | %d |\n",a[52],a[53],a[54]);
printf("\t\t\t\t\t\t |_______|_______|_______|\n");
}