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

📄 cube1.c

📁 C语言高级编程及实例剖析/王为青, 刘变红编著 ISBN号: 978-7-115-15423-1 出版发行项: 北京-人民邮电出版社 2007 光盘内容 附注项: 本书结合实
💻 C
📖 第 1 页 / 共 2 页
字号:
/* 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 + -