⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cube1.c

📁 这是一个简单的魔方游戏
💻 C
📖 第 1 页 / 共 2 页
字号:
				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(&reg,&reg);
}

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 + -