📄 cube1.c
字号:
face[cond(ch)].srim[thisface[i].color[j]];
if(begin==1)
begin=12;
else
begin--;
}
}
for(i=0;i<12;i++)
face[sstruct[cond(ch)].color[i]].srim[sstruct[cond(ch)].num[i]]
=face[cond(ch)].brim[i+1];
for(i=0;i<3;i++)
{
begin=conddata[next].lefttop[i];
for(j=0;j<8;j++)
{
vface[i].color[j]=*face[condition[i]].srim[begin];
if(begin==8)
begin=1;
else
begin++;
}
}
}
/* 重绘三个可见面的颜色 */
void showcube(void)
{
int i,j;
int pt[][9][2]={
{192,113,216,129,240,146,241,170,241,196,216,
176,195,160,192,137,216,153},
{263,148,288,131,312,115,314,138,315,159,291,
176,260,194,265,171,285,156},
{253,61,278,79,300,96,280,108,250,127,230,
110,204,90,230,78,250,92}
};
setcolor(DARKGRAY);
hide_mouse();
for(i=0;i<3;i++)
for(j=1;j<=9;j++)
{
if(j==9)
setfillstyle(SOLID_FILL,color[condition[i]]);
else
setfillstyle(SOLID_FILL,vface[i].color[j-1);
floodfill(pt[i][j-1][0]+i,pt[i][j-1][1],BLUE);
}
show_mouse();
}
/* 当魔方旋转时重置三个可见面的数据 */
void cube_rotate(char ch,int status)
{
int i,j,begin;
for(now=0;now<24;now++)
if((condition[F]==conddata[now].face[F])&&
(condition[R]==conddata[now].face[R]))
break;
for(next=0;next<24;next++)
{
if(status==CCW)&&
(conddata[next].face[F]==conddata[now].ccw[ch-'x'][F])&&
(conddata[next].face[R]==conddata[now].ccw[ch-'x'][R]))
break;
if(status==CCW)&&
(conddata[next].face[F]==conddata[now].cw[ch-'x'][F])&&
(conddata[next].face[R]==conddata[now].cw[ch-'x'][R]))
break;
}
for(i=0;i<6;i++)
condition[i]==conddata[next].face[i];
for(i=0;i<3;i++)
{
begin=conddata[next].lefttop[i];
for(j=0;j<8;j++)
{
vface[i].color[j]=*face[condition[i]].srim[begin];
if(begin==8)
begin=1;
else
begin++;
}
}
}
char getmousech(MOUSE *mu1)
{
int k;
for(k=0;k<(sizeof(def_click)/sizeof(struct mu_click));k++)
if((mu1->x>=def_click[k].cl)&&(mu1->x<=def_click[k].cr)&&
(mu1->y>=def_click[k].ct)&&(mu1->y<=def_click[k].cb))
return def_click[k].key;
}
/* 显示简单的提示信息 */
void message(int color,char *msg)
{
hide_mouse();
setcolor(color);
settextjustify(CENTER_TEXT,TOP_TEXT);
outtextxy(565,40,msg);
show_mouse();
}
void savegame(void)
{
int i,j;
FILE *fp;
char *filename="CUBE.SAV";
char *savemsg="Saving...";
if((fp=fopen(filename,"w"))==NULL)
file_error(filename);
message(3,savemsg);
for(i=0;i<6;i++)
{
fprintf(fp,"%d",condition[i]);
for(j=1;j<=SRIMN;j++)
fprintf(fp,"%d",*face[i].srim[j]);
for(j=1;j<=BRIMN;j++)
fprintf(fp,"%d",*face[i].brim[j]);
}
fclose(fp);
sleep(1);
message(BLACK,savemsg);
}
void loadgame(void)
{
int i,j;
FILE *fp;
char *filename="CUBE.SAV";
if((fp=fopen(filename,"r"))==NULL)
{
sound(1000);
delay(50);
nosound();
message(3,"Fail!");
sleep(1);
message(BLACK,"Fail!");
}
else
{
message(3,"Loading...");
for(i=0;i<6;i++)
{
fscanf(fp,"%d",&condition[i]);
for(j=1;j<=SRIMN;j++)
fscanf(fp,"%d",face[i].srim[j]);
for(j=1;j<=BRIMN;j++)
fscanf(fp,"%d",face[i].brim[j]);
}
fclose(fp);
cube_rotate('x',CCW);
cube_rotate('x'CCW);
showcube();
sleep(1);
message(BLACK,"Loading...");
}
}
void soundswitch(void)
{
extern soundflag;
char *soundmsg[]={"Sound Off","Sound On"};
soundflag=(soundflag==ON)?OFF:ON;
message(3,soundmsg[soundflag]);
sleep(1);
message(BLACK,soundmsg[soundflag]);
}
void title(void)
{
unsigned titlesize;
void *buff;
char *name="CUBE.TIT";
FILE *fp;
titlesize=50408;
if((buff=(void*)malloc(titlesize))==NULL)
mem_error();
if((fp=fopen(name,"rb"))==NULL)
file_error(name);
fread(buff,titlesize,1,fp);
fclose(fp);
palette(1);
hide_mouse();
cleardevice();
clr_kb_buff();
putimage(55,990,buff,COPY_PUT);
show_version(363,233,LIGHTBLUE);
free(buff);
show_mouse();
while(!kbhit())
if((mu_install)&&(which_pressed(&mouse)>0))
break;
hide_mouse();
cleardevice();
show_mouse();
}
void draw_win(void)
{
unsigned winsize;
void *winbuff[4];
char *winname="CUBE.WIN";
FILE *fp;
int i,j;
int width=65,hight=45;
char *facekey[][6]={"f","r","t","l","b","h",
"F","R","T","L","B","H"};
char *cubekey[][6]={"x","z","y","X","Z","Y"};
hide_mouse();
palette(0);
winsize=28024;
if((fp=fopen(winname,"rb"))==NULL)
file_error(winname);
for(i=0;i<4;i++)
{
if((winbuff[i]=malloc(winsize))==NULL)
mem_error();
fread(winbuff[i],winsize,1,fp);
putimage(160*i,0,winbuff[i],COPY_PUT);
free(winbuff[i]);
}
fclose(fp);
setcolor(BLUE);
for(i=0;i<2;i++)
{
for(j=0;j<6;j++)
outtextxy(18+j*(width+2)+2,253+(high+2)*i+2,facekey[i][j]);
for(j=0;j<3;j++)
outtextxy(426+j*(width+2)+2,253+(high+2)*i+2,cubekey[i][j]);
}
show_version(524,243,BLACK);
palette(2);
show_mouse();
}
void sink(int left,int top,int right,int bottom,int status)
{
setcolor((status==ON)?WHITE:BLUE);
line(left,top,right,top);
line(left,top,left,bottom);
setcolor((status==OFF)?WHITE:BLUE);
line(right,bottom,right,top);
line(right,bottom,left,bottom);
}
void mem_error(void)
{
closegraph();
printf("\nOut of memory!\n");
exit(1);
}
void file_error(char *filename)
{
closegraph();
printf("\nCan not open file '%s'!\n",filename);
exit(1);
}
void show_version(int x,int y,int color)
{
settextjustify(LEFT_TEXT,TOP_TEXT);
setcolor(color);
outtextxy(x,y,VERSION);
}
void palette(int num)
{
struct palettetype palette[]=
{
{16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{16,0,56,4,60,2,58,20,62,1,57,5,61,3,59,7,63}, /* for title */
{16,0,56,4,60,2,58,20,54,1,57,5,61,38,59,7,63} /* for game */
};
setallpalette(&palette[num]);
}
void shell(void)
{
hide_mouse();
closegraph();
printf("\nCUBE %s\nType\"EXIT\"to return to CUBE...\n",VERSION);
putenv("HAVE_CUBE=YES");
system("");
to_graphic_mode();
initialize();
draw_win();
setactivepage(1);
draw_win();
first=0;
body(0);
}
void clr_kb_buff(void)
{
union REGS reg;
reg.h.ah=ox0c;
intdos(®,®);
}
void sinkkey(char ch)
{
int i;
for(i=0;i<(sizeof(def_click)/sizeof(struct mu_click));i++)
if(ch==def_click[i].key)
{
hide_mouse();
sink(def_click[i].cl,def_click[i].ct,
def_click[i].cr,def_click[i].cb,OFF);
show_mouse();
while(mu_install)&&(which_pressed(&mouse)!=0));
delay(100);
hide_mouse();
sink(def_click[i].cl,def_click[i].ct,
def_click[i].cr,def_click[i].cb,ON);
show_mouse();
cubesound();
}
}
void help(void)
{
int i;
void *helpbuff;
unsigned helpsize;
char *helpmsg[]=
{
"F1:Help Menu",
"F2:Save Game",
"F3:Load Game",
"F4:Rotate Speed",
"F5:Sound Switch",
"F6:Dos Shell",
"Esc:Quit Game"
};
hide_mouse();
set_x_range(20,500);
set_y_range(10,240);
helpsize=imagesize(160,40,350,220);
if((helpbuff=malloc(helpsize))==NULL)
mem_error();
getimage(160,40,350,220,helpbuff);
setfillstyle(SOLID_FILL,BLACK);
bar(100,40,380,220);
show_version(180,160,13);
setcolor(LIGHTGRAY);
for(i=0;i<sizeof(helpmsg)/sizeof(helpmsg[0]);i++)
outtextxy(180,70+(2+textheight("H"))*i,helpmsg[i]);
show_mouse();
while(!kbhit())
if((mu_install)&&(which_pressed(&mouse)>0))
break;
hide_mouse();
bar(100,40,380,220);
putimage(160,40,helpbuff,COPY_PUT);
free(helpbuff);
clr_kb_buff();
set_x_range(0,getmaxx());
set_y_range(0,getmaxy());
show_mouse();
}
void speedswitch(void)
{
char *speedmsg[]={"Fast","Normal","Slow"};
speedcontrol=++speedcontrol%3;
speed=speeddata[speedcontrol];
message(3,speedmsg[speedmsg]);
sleep(1);
message(BLACK,speedmsg[speedmsg]);
}
void word(void)
{
int page=1;
unsigned name_size,wall_size,i,j,k;
void *name_buff[4],*wall_buff;
char *name="cube.wrd";
FILE *fp_name;
hide_mouse();
palette(1);
wall_size=26408;
name_size=74272/4;
for(i=0;i<4;++i)
if((namebuff[i]=malloc(name_size))==NULL)
mem_error();
if((wall_buff=malloc(wall_size))==NULL)
mem_error();
if((fp_name=fopen(name,"rb"))==NULL)
file_error();
for(i=0;i<4;++i)
fread(name_buff[i],name_size,1,fp_name);
fread(wall_buff,wall_size,1,fp_name);
fclose(fp_name);
setvisualpage(0);
for(j=0;j<4;++j)
{
if(khbit())
break;
for(i=0;i<90;i+=2)
{
if(khbit())
break;
setactivepage(page);
cleardevice();
putimage(76,210-i,name_buff[j],COPY_PUT);
putimage(48,210,wall_buff,COPY_PUT);
setvisualpage(page);
page=(page==0)?1:0;
}
if(i==90)
for(i=0;i<8;++i)
{
setactivepage(page);
outtextxy(400,120,"");
setvisualpage(page);
page=(page==0)?1:0;
delay(80);
}
if(j==3)
{
setactivepage(page);
cleardevice();
putimage(76,131,name_buff[3],COPY_PUT);
putimage(48,210,wall_buff,COPY_PUT);
setvisualpage(page);
for(i=0;i<544;++i)
{
setcolor(GREEN);
line(48,216,48+i,216);
line(48,217,48+i,217);
delay(1);
}
}
}
getch();
for(i=0:i<4;++i)
free(name_buff[i]);
free(wall_buff);
show_mouse();
}
void cubesound(void)
{
extern soundflag;
if(soundflag)
{
sound(700);
delay(20);
nosound();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -