/* 魔方 -- 作者:邝镇kuang0516@yahoo.com.cn */
#include "graphics.h"
#include "stdio.h"
int color[6][9]={4,4,4,4,4,4,4,4,4,
2,2,2,2,2,2,2,2,2,
14,14,14,14,14,14,14,14,14,
15,15,15,15,15,15,15,15,15,
7,7,7,7,7,7,7,7,7,
9,9,9,9,9,9,9,9,9};
int column[6][9]={195,255,315,345,375,315,255,225,285,
180,180,180,240,300,300,300,240,240,
345,345,345,375,405,405,405,375,375,
470,470,470,530,590,590,590,530,530,
55,55,55,85,115,115,115,85,85,
195,255,315,345,375,315,255,225,285};
int row[6][9]={135,135,135,105,75,75,75,105,105,
180,240,300,300,300,240,180,180,240,
165,225,285,255,225,165,105,135,185,
90,150,210,210,210,150,90,90,150,
165,225,285,255,225,165,105,135,185,
425,425,425,395,365,365,365,395,395};
void boxinit()
{
setcolor(CYAN);
moveto(150,150);
lineto(330,150);
line(150,210,330,210);
line(150,270,330,270);
line(150,330,330,330);
line(180,120,360,120);
line(210,90,390,90);
line(240,60,420,60);
line(360,120,360,300);
line(390,90,390,270);
line(420,60,420,240);
line(330,210,420,120);
line(330,270,420,180);
line(330,330,420,240);
line(330,150,420,60);
line(330,150,330,330);
line(270,150,270,330);
line(210,150,210,330);
line(150,150,150,330);
line(150,150,240,60);
line(210,150,300,60);
line(270,150,360,60);
moveto(40,150);
lineto(130,60);
lineto(130,240);
lineto(40,330);
lineto(40,150);
line(70,120,70,300);
line(100,90,100,270);
line(40,210,130,120);
line(40,270,130,180);
moveto(440,60);
lineto(620,60);
lineto(620,240);
lineto(440,240);
lineto(440,60);
line(440,120,620,120);
line(440,180,620,180);
line(500,60,500,240);
line(560,60,560,240);
moveto(150,440);
lineto(330,440);
lineto(420,350);
lineto(240,350);
lineto(150,440);
line(210,440,300,350);
line(270,440,360,350);
line(180,410,360,410);
line(210,380,390,380);
}
void temp()
{ delay(1);
}
void upcolor()
{int i,j;
for(i=0;i<6;i++)
for(j=0;j<9;j++)
{setfillstyle(1,color[i][j]);
floodfill(column[i][j],row[i][j],CYAN);
temp();}
}
//该函数实现边面转90度的功能
//bt为要转的边面
void borderturn(int bt)
{int x1,x2;
x1=color[bt][0];
x2=color[bt][1];
color[bt][0]=color[bt][2];
color[bt][1]=color[bt][3];
color[bt][2]=color[bt][4];
color[bt][3]=color[bt][5];
color[bt][4]=color[bt][6];
color[bt][5]=color[bt][7];
color[bt][6]=x1;
color[bt][7]=x2;
}
//该函数实现中间面转90度的功能
//x1,x2,x3,x4为旋转涉及到的面参数,x5-x16为正方形参数说明是哪个正方形参与了旋转
//其中x5,x6,x7为x1面的
//x8,x9,x10为x2面的
//x11,x12,x13为x3面的
//x14,x15,x16为x4面的
//中间面旋转涉及到四个面的变化
void medturn(int x1,int x2,int x3,int x4,int x5,int x6,int x7,int x8,
int x9,int x10,int x11,int x12,int x13,int x14,int x15,int x16)
{int y1,y2,y3;
y1=color[x1][x5];
y2=color[x1][x6];
y3=color[x1][x7];
color[x1][x5]=color[x2][x8];
color[x1][x6]=color[x2][x9];
color[x1][x7]=color[x2][x10];
color[x2][x8]=color[x3][x11];
color[x2][x9]=color[x3][x12];
color[x2][x10]=color[x3][x13];
color[x3][x11]=color[x4][x14];
color[x3][x12]=color[x4][x15];
color[x3][x13]=color[x4][x16];
color[x4][x14]=y1;
color[x4][x15]=y2;
color[x4][x16]=y3;
}
//函数实现UP面顺时针转90*i度的功能
void turn1(int i)
{int k;
for(k=0;k<i;k++){
borderturn(0);
medturn(1,2,3,4,0,7,6,0,7,6,6,7,0,6,7,0);
}
}
//函数实现UP面和DOWN面中间层顺时针转90*i度的功能
void turn2(int i)
{int k;
for(k=0;k<i;k++){
medturn(1,2,3,4,1,8,5,1,8,5,5,8,1,5,8,1);
}
}
//函数实现DOWN面顺时针转90*i度的功能
void turn3(int i)
{int k;
for(k=0;k<i;k++){
borderturn(5);
medturn(1,2,3,4,2,3,4,2,3,4,4,3,2,4,3,2);
}
}
//函数实现FRONT面顺时针转90*i度的功能
void turn4(int i)
{int k;
for(k=0;k<i;k++){
borderturn(1);
medturn(4,5,2,0,0,1,2,0,1,2,2,1,0,2,1,0);
}
}
//函数实现FRONT面和BACK面的中间层顺时针转90*i度的功能
void turn5(int i)
{int k;
for(k=0;k<i;k++){
medturn(4,5,2,0,7,8,3,7,8,3,3,8,7,3,8,7);
}
}
//函数实现BACK面顺时针转90*i度的功能
void turn6(int i)
{int k;
for(k=0;k<i;k++){
borderturn(3);
medturn(4,5,2,0,6,5,4,6,5,4,4,5,6,4,5,6);
}
}
//函数实现RIGHT面顺时针转90*i度的功能
void turn7(int i)
{int k;
for(k=0;k<i;k++){
borderturn(2);
medturn(1,5,3,0,6,5,4,2,3,4,4,5,6,4,3,2);
}
}
//函数实现LEFT面和RIGHT面的中间层顺时针转90*i度的功能
void turn8(int i)
{int k;
for(k=0;k<i;k++){
medturn(1,5,3,0,7,8,3,1,8,5,3,8,7,5,8,1);
}
}
//函数实现LEFT面顺时针转90*i度的功能
void turn9(int i)
{int k;
for(k=0;k<i;k++){
borderturn(4);
medturn(1,5,3,0,0,1,2,0,7,6,2,1,0,6,7,0);
}
}
//实现i次L-E'-L'-U-L-E-L'-U'功能
void turna(int i)
{int k;
for(k=0;k<i;k++){
turn9(1);//L
turn2(3);//E'
turn9(3);//L'
turn1(1);//U
turn9(1);//L
turn2(1);//E
turn9(3);//L'
turn1(3);//U'
}
}
//实现i次R-E-R'-U'-R-E'-U功能
void turnb(int i)
{int k;
for(k=0;k<i;k++){
turn7(1);//R
turn2(1);//E
turn7(3);//R'
turn1(3);//U'
turn7(1);//R
turn2(3);//E'
turn7(3);//R'
turn1(1);//U
}
}
void turnc(int i)
{int k;
for(k=0;k<i;k++){
turn7(1);
turn9(1);
turn1(3);
turn9(3);
turn1(1);
turn7(3);
turn1(3);
turn9(1);
turn1(1);
turn9(3);
}
}
void turnd(int i)
{int k;
for(k=0;k<i;k++){
turn9(1);
turn7(1);
turn1(1);
turn7(3);
turn1(3);
turn9(3);
turn1(1);
turn7(1);
turn1(3);
turn7(3);
}
}
void turne(int i)
{int k;
for(k=0;k<i;k++){
turn7(3);
turn3(1);
turn7(1);
turn3(3);
turn4(1);
turn3(3);
turn4(3);
}
}
void turnf(int i)
{int k;
for(k=0;k<i;k++){
turn4(1);
turn2(1);
turn9(1);
turn2(3);
turn4(1);
}
}
void turnc1(int i)
{int k;
for(k=0;k<i;k++){
turn4(3);
turn2(3);
turn7(1);
turn2(1);
turn4(3);
}
}
void turnd1(int i)
{int k;
for(k=0;k<i;k++){
turn8(1);
turn9(1);
turnd(1);
turn8(3);
turn9(3);
}
}
void turnb1(int i)
{int k;
for(k=0;k<i;k++){
turn7(1);
turnd(1);
turn7(3);
}
}
void turnlast()
{int k,total,k1,total1,i,j,c0,c1,c2,c3,c4,c5;
c0=color[0][8];
c5=color[5][8];
/*对好第一层的十字架 */
total=0;
while(total<5){
i=0;
while(color[5][1]!=c5){
turn4(1);
if(i>4) break;
i++;
}
if(i==5){
i=0;
while(color[5][1]!=c5){
turn1(1);
if(i<4) turn4(2);
else {
turn5(1);
turn6(1);
turn8(3);
turn6(3);
turn5(3);
}
if(i>7) break;
i++;
}
if(i==8){
i=0;
while(color[5][1]!=c5){
turn2(1);
if(i<4) turn4(1);
else turn4(3);
if(i>7) break;
i++;
}
if(i==8){
}else {total++;turn1(1);turn2(1);turn3(1);}
}else {total++;turn1(1);turn2(1);turn3(1);}
}else {total++;turn1(1);turn2(1);turn3(1);}
}
c0=color[0][8];
c1=color[1][8];
c2=color[2][8];
c3=color[3][8];
c4=color[4][8];
c5=color[5][8];
while(color[3][3]!=c3) {
turn3(1);
}
upcolor();
if(color[4][3]==c1) turnf(1);
else if(color[2][3]==c1) turnc1(1);
if(color[4][3]!=c4) {turn5(2); turn1(2); turn5(2);}
upcolor();
/*对好第一层的十字架end*/
/*对好第一层*/
total=0;
k=0;
while(total<4){
c1=color[1][8];
c4=color[4][8];
i=0;
while(color[1][2]==c1 && color[4][2]==c4 && color[5][0]==c5){
turn2(1); turn3(1); turn1(1);
c1=color[1][8];
c4=color[4][8];
if(i>4) break;
i++;
}
while(color[1][2]!=c1 || color[4][2]!=c4 || color[5][0]!=c5){
i=0;
while(color[1][2]!=c1 || color[4][2]!=c4 || color[5][0]!=c5){
turn9(2); turnc(1); turn9(2); turn1(1);
if(i>3) break;
i++;
}
if(i<4) total++;
turn2(1); turn3(1);
c1=color[1][8];
c4=color[4][8];
}
if(k>10
- 1
- 2
- 3
前往页