📄 cube1.c
字号:
/* Note:Your choice is C IDE */
#define VERSION "Version 1.0"
#define F 0 /* Front face 前面 */
#define R 1 /* Right face 右面 */
#define T 2 /* Top face 上面 */
#define H 3 /* beHind face后面 */
#define L 4 /* Left face 左侧面 */
#define B 5 /* Bottom face 下面 */
#define RR 0 /* Red 红 */
#define OO 1 /* Orange 橙 */
#define GG 2 /* Green 绿 */
#define BB 3 /* Blue 蓝 */
#define YY 4 /* Yellow 黄 */
#define WW 5 /* White 白 */
#define SRIMN 8 /* 最小边缘数 */
#define BRIMN 8 /* 最大边缘数 */
#define CW -1 /* clockwise 顺时针 */
#define CCW -2 /* counterclockwise 逆时针 */
#define ESC 27 /* Esc的键值 */
#define F1 59
#define F2 60
#define F3 61
#define F4 62
#define F5 63
#define F6 64
#define ON 1
#define OFF 0
#include <stdio.h>
#include <dos.h>
#include <alloc.h>
#include <ctype.h>
#include <conio.h>
#include <stdlib.h>
#include <graphics.h>
#include "mouse.h"
void body(char);
char getmousech(MOUSE *);
void to_graphic_mode(void);
void initialize(void);
void handle(char);
void faceCW(char);
coid faceCCW(char);
int cond(char);
void reassignfacestruct(char);
void showcube(void);
void cube_rotate(char,int);
void savegame(void);
void loadgame(void);
void soundswitch(void);
void speedswitch(void);
void word(void);
void title(void);
void draw_win(void);
void sink(int,int,int,int,int);
void mem_error(void);
void file_error(void);
void show_versinon(int,int,int);
void palette(int);
void shell(void);
void clr_kb_buff(void);
void sinkkey(char);
void help(void);
void message(int,char *);
void cubesound(void);
int first=0; /* 检查是不是第一次绘制魔方画面 */
int speed=30; /* 设置魔方旋转速度 */
int speeddata[]={10,30,50}; /* 这是快、正常、慢时的值 */
int speedcontrol=1; /* 控制速 */
MOUSE mouse; /* 定义鼠标变量 */
int soundflag=ON; /* 声音开关标记,初值为ON */
int mu_install=OFF; /* 鼠标使用标记,初值为OFF */
int sq[49]; /* 魔方方块的颜色 */
int condition[]={RR,BB,YY,OO,GG,WW}; /* 分别对应F、R、T、H、L、B */
int now=0,next=0;
int color[]={GREEN,LIGHTRED,RED,DARKGRAY,LIGHTGRAY,WHITE};
/* 定义魔方六个面的结构 */
struct one_face
{
int *srim[SRIMN+1];
int *brim[SRIMN+1];
}face[]=
{
{ NULL,&sq[1],&sq[2],&sq[3],&sq[4],&sq[5],&sq[6],&sq[7],
&sq[8],NULL,&sq[39],&sq[38],&sq[37],&sq[25],&sq[32],
&sq[31],&sq[47],&sq[46],&sq[45],&sq[21],&sq[20],&sq[19]
},
{ NULL,&sq[9],&sq[10],&sq[11],&sq[12],&sq[13],&sq[14],&sq[15],
&sq[16],NULL,&sq[35],&sq[34],&sq[33],&sq[17],&sq[24],
&sq[23],&sq[43],&sq[42],&sq[41],&sq[29],&sq[28],&sq[27]
},
{ NULL,&sq[17],&sq[18],&sq[19],&sq[20],&sq[21],&sq[22],&sq[23],
&sq[24],NULL,&sq[33],&sq[40],&sq[39],&sq[1],&sq[8],
&sq[7],&sq[45],&sq[44],&sq[43],&sq[13],&sq[12],&sq[11]
},
{ NULL,&sq[25],&sq[26],&sq[27],&sq[28],&sq[29],&sq[30],&sq[31],
&sq[32],NULL,&sq[37],&sq[36],&sq[35],&sq[9],&sq[16],
&sq[15],&sq[41],&sq[48],&sq[47],&sq[5],&sq[4],&sq[3]
},
{ NULL,&sq[33],&sq[34,&sq[35],&sq[36],&sq[37],&sq[38],&sq[39],
&sq[40],NULL,&sq[11],&sq[10],&sq[9],&sq[27],&sq[26],
&sq[25],&sq[3],&sq[2],&sq[1],&sq[19],&sq[18],&sq[17]
},
{ NULL,&sq[41],&sq[42],&sq[43],&sq[44],&sq[45],&sq[46],&sq[47],
&sq[48],NULL,&sq[15],&sq[14],&sq[13],&sq[23],&sq[22],
&sq[21],&sq[7],&sq[6],&sq[5],&sq[31],&sq[320],&sq[29]
}
};
struct condition_data
{
int face[6];
int lefttop[3];
int cw[3][2];
int ccw[3][2];
}conddata[]=
{
{RR,BB,YY,OO,GG,WW,1,1,1, WW,BB,RR,YY,BB,OO, YY,BB,RR,WW,GG,RR},
{RR,WW,BB,OO,YY,GG,3,7,3, GG,WW,RR,BB,WW,OO, BB,WW,RR,GG,YY,RR},
{RR,GG,WW,OO,BB,YY,5,5,1, YY,GG,RR,WW,GG,OO, WW,GG,RR,YY,BB,RR},
{RR,YY,GG,OO,WW,BB,7,7,7, BB,YY,RR,GG,YY,OO, GG,YY,RR,BB,WW,RR},
{OO,GG,YY,RR,BB,WW,1,1,5, WW,GG,OO,YY,GG,RR, YY,GG,OO,WW,BB,OO},
{OO,WW,GG,RR,YY,BB,3,3,3, BB,WW,OO,GG,WW,RR, GG,WW,OO,BB,YY,OO},
{OO,BB,WW,RR,GG,YY,5,5,5, YY,BB,OO,WW,BB,RR, WW,BB,OO,YY,GG,OO},
{OO,YY,BB,RR,WW,GG,7,3,7, GG,YY,OO,BB,YY,RR, BB,YY,OO,GG,WW,OO},
{GG,YY,OO,BB,WW,RR,7,1,7, RR,YY,GG,OO,YY,BB, OO,YY,GG,RR,WW,GG},
{GG,RR,YY,BB,OO,WW,1,1,3, WW,RR,GG,YY,RR,BB, YY,RR,GG,WW,OO,GG},
{GG,WW,RR,BB,YY,OO,3,5,3, OO,WW,GG,RR,WW,BB, RR,WW,GG,OO,YY,GG},
{GG,OO,WW,BB,RR,YY,5,5,7, YY,OO,GG,WW,OO,BB, WW,OO,GG,YY,RR,GG},
{BB,OO,YY,GG,RR,WW,1,1,7, WW,OO,BB,YY,OO,GG, YY,OO,BB,WW,RR,BB},
{BB,WW,OO,GG,YY,RR,3,1,3, RR,WW,BB,OO,WW,GG, OO,WW,BB,RR,YY,BB},
{BB,RR,WW,GG,OO,YY,5,5,3, YY,RR,BB,WW,RR,GG, WW,RR,BB,YY,OO,BB},
{BB,YY,RR,GG,WW,OO,7,5,7, OO,YY,BB,RR,YY,GG, OO,YY,BB,OO,WW,BB},
{YY,BB,OO,WW,GG,RR,1,3,5, RR,BB,YY,OO,BB,WW, OO,BB,YY,RR,GG,YY},
{YY,RR,BB,WW,OO,GG,3,3,5, GG,RR,YY,BB,RR,WW, BB,RR,YY,GG,OO,YY},
{YY,GG,RR,WW,BB,OO,5,3,5, OO,GG,YY,RR,GG,WW, RR,GG,YY,OO,BB,YY},
{YY,OO,GG,WW,RR,BB,7,3,5, BB,OO,YY,GG,OO,WW, GG,OO,YY,BB,RR,YY},
{WW,GG,OO,YY,BB,RR,1,7,1, RR,GG,WW,OO,GG,YY, OO,GG,WW,RR,BB,WW},
{WW,RR,GG,YY,OO,BB,3,7,1, BB,RR,WW,GG,RR,YY, GG,RR,WW,BB,OO,WW},
{WW,BB,RR,YY,GG,OO,5,7,1, OO,BB,WW,RR,BB,YY, RR,BB,WW,OO,GG,WW},
{WW,OO,BB,YY,RR,GG,7,7,1, GG,OO,WW,BB,OO,YY, BB,OO,WW,GG,RR,WW}
};
/* 初始化可看到的面即前、右和上面的颜色 */
struct vfacedata
{
int color[8];
}vface[]=
{
{GREEN,GREEN,GREEN,GREEN,GREEN,GREEN,GREEN,GREEN},
{DARKGRAY,DARKGRAY,DARKGRAY,DARKGRAY,DARKGRAY,DARKGRAY,
DARKGRAY,DARKGRAY},
{LIGHTGRAY,LIGHTGRAY,LIGHTGRAY,LIGHTGRAY,LIGHTGRAY,LIGHTGRAY,
LIGHTGRAY,LIGHTGRAY}
};
/* 定义鼠标可移动区域和相应的键值 */
struvt mu_click
{
int cl,ct,cr,cb; /* left,top,right,bottom,即鼠标的左、上、右、下的区域 */
char key; /* 区域内相应键值 */
}def_click[]=
{
{ 18+(65+1)*0,253, 18+(65+1)*0+64, 253+44, 'f'},
{ 18+(65+1)*1,253, 18+(65+1)*1+64, 253+44, 'r'},
{ 18+(65+1)*2,253, 18+(65+1)*2+64, 253+44, 't'},
{ 18+(65+1)*3,253, 18+(65+1)*3+64, 253+44, 'l'},
{ 18+(65+1)*4,253, 18+(65+1)*4+64, 253+44, 'b'},
{ 18+(65+1)*5,253, 18+(65+1)*5+64, 253+44, 'h'},
{ 426+(65+1)*0,253, 426+(65+1)*0+64, 253+44,'x'},
{ 426+(65+1)*1,253, 426+(65+1)*1+64, 253+44,'z'},
{ 426+(65+1)*2,253, 426+(65+1)*2+64, 253+44,'y'},
{ 18+(65+1)*0,253+46, 18+(65+1)*0+64, 253+44+46, 'F'},
{ 18+(65+1)*1,253+46, 18+(65+1)*1+64, 253+44+46, 'R'},
{ 18+(65+1)*2,253+46, 18+(65+1)*2+64, 253+44+46, 'T'},
{ 18+(65+1)*3,253+46, 18+(65+1)*3+64, 253+44+46, 'L'},
{ 18+(65+1)*4,253+46, 18+(65+1)*4+64, 253+44+46, 'B'},
{ 18+(65+1)*5,253+46, 18+(65+1)*5+64, 253+44+46, 'H'},
{ 426+(65+1)*0,253+46, 426+(65+1)*0+64, 253+44+46, 'X'},
{ 426+(65+1)*1,253+46, 426+(65+1)*1+64, 253+44+46, 'Z'},
{ 426+(65+1)*2,253+46, 426+(65+1)*2+64, 253+44+46, 'Y'},
{526,62+(21+7)*0,526+80,62+(21+7)*0+20,F2},
{526,62+(21+7)*1,526+80,62+(21+7)*1+20,F3},
{526,62+(21+7)*2,526+80,62+(21+7)*2+20,F4},
{526,62+(21+7)*3,526+80,62+(21+7)*3+20,F5},
{526,62+(21+7)*4,526+80,62+(21+7)*4+20,F6}
};
/***********main()*********/
void main(void)
{
int i;
char ch=0;
#ifndef _LARGE_
clrscr();
prinf("\n\nNeeds to compile in Large Model.\n");
exit(1);
#endif
if(strcmp(getenv("HAVE_CUBE"),"YES")==0)
{
printf("\nMagic Cube has already executed!\n");
printf("Type EXIT to return to Magic Cube...\n");
exit(1);
}
to_graphic_mode();
initialize();
word();
setactivepage(0);
setvisualpage(0);
title();
draw_win();
setactivepage(1);
draw_win();
/* 给魔方块分配颜色 */
for(i=1;i<=48;i++)
sq[i]=color[(int)(i-1)/8];
body(ch);
showcube();
clr_kb_buff();
while(ch!=ESC)
{
ch=-1;
if(!kbhit())
{
if(click_button(&mouse,LEFT_B))
ch=getmousech(&mouse);
}
else
ch=getch();
handle(ch);
if(ch!=-1)
body(ch);
}
closegraph();
}
/*******************End of main()******************/
/* 初始化图形函数 */
void to_graphic_mode(void)
{
int gdriver=DETECT,gmode,gcode;
registerbgidriver(EGAVGA_driver);
initgraph(&gdriver,&gmode,"");
closegraph();
if(!((gdriver==EGA)||(gdriver==VGA)))
{
printf("\nThis game needs a EGA/VGA monitor!\n");
exit(1);
}
gdriver=EGA;
gmode=EGAHI;
initgraph(&gdriver,&gmode,"");
gcode=graphresult();
if(gcode!grOK)
{
printf("\nGraphic System Error:%s\n",grapherrormsg(gcode));
exit(1);
}
}
/* 初始化鼠标函数 */
void initialize(void)
{
extern unsigned Cursor[][32];
delay(1);
init_mouse();
set_graphic_cursor(5,1,Cursor[0]);
show_mouse();
}
void handle(char ch)
{
extern speed;
sinkkey(ch);
switch(ch)
{
case 't':
case 'T':
case 'f':
case 'F':
case 'r':
case 'R':
case 'l':
case 'L':
case 'h':
case 'H':
case 'b':
case 'B':
if(islower(ch))
faceCW(ch);
else
{
ch=tolower(ch);
faceCCW(ch);
}
break;
case 'x':
case 'X':
case 'y':
case 'Y':
case 'z':
case 'Z':
if(islower(ch))
cube_rotate(ch,CW);
else
{
ch=tolower(ch);
cube_rotate(ch,CCW);
}
break;
case F1:
help();
break;
case F2:
savegame();
break;
case F3:
loadgame();
break;
case F4:
speedswitch();
break;
case F5:
soundswitch();
break;
case F6:
shell();
break;
default:;
}
}
/* 顺时针改变指定面的结构 */
void faceCW(char ch)
{
int *temp[3],i;
for(i=0;i<2;i++)
temp[i]=face[cond(ch)].srim[i+SRIMN-1];
for(i=SRIMN;i>=3;i--)
face[cond(ch)].srim[i]=face[cond(ch)].srim[i-2];
for(i=1;i<=2;i++)
face[cond(ch)].srim[i]=temp[i-1];
for(i=0;i<3;i++)
temp[i]=face[cond(ch)].brim[i+BRIMN-2];
for(i=BRIMN;i>=4;i--)
face[cond(ch)].brim[i]=face[cond(ch)].brim[i-3];
for(i=1;i<=3;i++)
face[cond(ch)].brim[i]=temp[i-1];
reassignfacestruct(ch);
}
/* 逆时针改变指定面的结构 */
void faceCCW(char ch)
{
int *temp[3],i;
for(i=0;i<2;i++)
temp[i]=face[cond(ch)].srim[i+1];
for(i=1;i<=SRIMN-2;i++)
face[cond(ch)].srim[i]=face[cond(ch)].srim[i+2];
for(i=7;i<=8;i++)
face[cond(ch)].srim[i]=temp[i-7];
for(i=0;i<3;i++)
temp[i]=face[cond(ch)].brim[i+1];
for(i=1;i<=BRIMN-3;i++)
face[cond(ch)].brim[i]=face[cond(ch)].brim[i+3];
for(i=10;i<=BRIMN;i++)
face[cond(ch)].brim[i]=temp[i-10];
reassignfacestruct(ch);
}
/* 从direction-face转向color-face */
int cond(char)
{
char condmark[]={'f','r','t','h','l','b'};
int i;
for(i=0;i<sizeof(condmark).sizeof(char);i++)
if(ch==condmark[i])
return(condition[i]);
return 0;
}
/* 重新安排四个垂直面的结构 */
void reassignfacestruct(char ch)
{
int i,j,k,begin;
struct
{
int color[5];
}thisface[]=
{
12,1,2,3,4,
3,3,4,5,7,
6,5,6,7,10,
9,7,8,1,1
};
struct bst
{
int color[4],num[4];
}bstruct[]=
{
{YY,BB,WW,GG,
10,1 ,10,7}, /*RR*/
{YY,GG,WW,BB,
4, 1 , 4,7}, /*OO*/
{YY,RR,WW,OO,
1, 1 , 7,7}, /*GG*/
{YY,OO,WW,RR,
7, 1 ,1, 7}, /*BB*/
{OO,BB,RR,GG,
4, 1 ,4, 4}, /*YY*/
{OO,GG,RR,BB,
10,10 ,10,10} /*WW*/
};
struct sst
{
int color[12],num[12];
}sstruct[]=
{
{YY,YY,YY,BB,BB,BB,WW,WW,WW,GG,GG,GG,
7, 6, 5, 1, 8, 7, 7, 6, 5, 5, 4, 3}, /*RR*/
{YY,YY,YY,GG,GG,GG,WW,WW,WW,BB,BB,BB,
3, 2, 1, 1, 8, 7, 3, 2, 1, 5, 4, 3}, /*OO*/
{YY,YY,YY,RR,RR,RR,WW,WW,WW,OO,OO,OO,
1, 8, 7, 1, 8, 7, 5, 4, 3, 5, 4, 3}, /*GG*/
{YY,YY,YY,OO,OO,OO,WW,WW,WW,RR,RR,RR,
5, 4, 3, 1, 8, 7, 1, 8, 7, 5, 4, 3}, /*BB*/
{OO,OO,OO,BB,BB,BB,RR,RR,RR,GG,GG,GG,
3, 2, 1, 3, 2, 1, 3, 2, 1, 3, 2, 1}, /*YY*/
{OO,OO,OO,GG,GG,GG,RR,RR,RR,BB,BB,BB,
7, 6, 5, 7, 6, 5, 7, 6, 5, 7, 6, 5}, /*WW*/
};
for(i=0;i<4;i++)
{
begin=bstruct[cond(ch)].num[i];
for(j=0;j<5;j++)
{
if((i==0)||(j==4))
face[bstruct[cond(ch)].color[i]].brim[begin]=
face[cond(ch)].brim[thisface[i].color[j]];
else
face[bstruct[cond(ch)].color[i]].brim[begin]=
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -