小破鍾,第一次用C編的圖形程序

TC下運行……





 

 #include <graphics.h>
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#include<bios.h>
#include<dos.h>
#define BK_COLOR         0       /* 時鐘外背景色,0-15 所有帶 COLOR 取值範圍爲0 到15 */
#define RING_COLOR       3       /* 環填充色 */
#define CLOCK_BK_COLOR   0       /* 時鐘內背景填充色 */
#define CENTER_COLOR     10      /* 中心圓填充色 */

#define SEC_HAND_COLOR   5       /* 秒針顏色 */
#define MIN_HAND_COLOR   7       /* 分針顏色 */
#define HOUR_HAND_COLOR  12      /* 時針顏色 */

#define NUM_COLOR        5       /* 數字顏色 */
#define NUM_SIZE         3       /* 數字大小 0-10 */
#define NUM_FONT         1       /* 數字字體 0-4 */
#define NUM_POSITION     175     /* 數字位置(半徑)最好小於 CIRCLE_SIZE_2 */

#define CIRCLE_SIZE_1    200     /* 最大的圓,從大到小,最好小於200,不然會覆蓋文字“小破鍾” */
#define CIRCLE_SIZE_2    190     /* 第二大圓,最好比各時針要大 */
#define CIRCLE_SIZE_3    7       /* 第三大圓,大於 3最好不要超過20,不美觀的*/

#define SEC_HAND_LENGTH  160     /* 秒針長度,以下從大到小,最好小於 CIRCLE_SIZE_2 */
#define MIN_HAND_LENGTH  130     /* 分針長度,最好比NUM_POSITION要小上10到20左右,不然秒針走一圈後數字有點殘缺 */
#define HOUR_HAND_LENGTH 110     /* 時針長度 */

#define RING_FILL_STYLE  9       /* 0-11 環填充方式 */

#define Y 0x1579
#define N 0x316e

int midx,midy,h,r1,key;
struct arccoordstype arci;

char xiao32H[]={
0x00,0x60,0x00,0x00,  0x00,0x60,0x00,0x00,  0x00,0x60,0x00,0x00,  0x00,0x60,0x00,0x00,  
0x00,0x60,0x00,0x00,  0x0C,0x63,0x00,0x00,  0x0C,0x63,0x00,0x00,  0x0C,0x63,0x00,0x00,  
0x18,0x61,0x80,0x00,  0x18,0x61,0x80,0x00,  0x18,0x60,0xC0,0x00,  0x30,0x60,0xE0,0x00,  
0x30,0x60,0x60,0x00,  0x00,0x60,0x00,0x00,  0x00,0x60,0x00,0x00,  0x00,0x60,0x00,0x00,  
0x01,0xE0,0x00,0x00,  0x01,0xC0,0x00,0x00,  0x00,0x00,0x00,0x00,  0x00,0x00,0x00,0x00,  
0x00,0x00,0x00,0x00,  0x00,0x00,0x00,0x00,  0x00,0x00,0x00,0x00,  0x00,0x00,0x00,0x00,  
0x00,0x00,0x00,0x00,  0x00,0x00,0x00,0x00,  0x00,0x00,0x00,0x00,  0x00,0x00,0x00,0x00,  
0x00,0x00,0x00,0x00,  0x00,0x00,0x00,0x00,  0x00,0x00,0x00,0x00,  0x00,0x00,0x00,0x00
};
char po32H[]={
0x00,0x06,0x00,0x00,  0x00,0x06,0x00,0x00,  0x7F,0x86,0x00,0x00,  0x7F,0xFF,0xE0,0x00,  
0x0C,0x7F,0xE0,0x00,  0x0C,0x66,0x60,0x00,  0x18,0x66,0xC0,0x00,  0x1F,0x66,0x00,0x00,  
0x3F,0x7F,0xC0,0x00,  0x7B,0x7F,0xC0,0x00,  0x7B,0x6C,0xC0,0x00,  0x1B,0x6D,0xC0,0x00,  
0x1B,0x6D,0x80,0x00,  0x1F,0x6F,0x80,0x00,  0x1F,0x67,0x00,0x00,  0x1B,0x6F,0x80,0x00,  
0x18,0xDD,0xE0,0x00,  0x00,0xD8,0xE0,0x00,  0x00,0x00,0x00,0x00,  0x00,0x00,0x00,0x00,  
0x00,0x00,0x00,0x00,  0x00,0x00,0x00,0x00,  0x00,0x00,0x00,0x00,  0x00,0x00,0x00,0x00,  
0x00,0x00,0x00,0x00,  0x00,0x00,0x00,0x00,  0x00,0x00,0x00,0x00,  0x00,0x00,0x00,0x00,  
0x00,0x00,0x00,0x00,  0x00,0x00,0x00,0x00,  0x00,0x00,0x00,0x00,  0x00,0x00,0x00,0x00
};
char zhong32H[]={
0x0C,0x06,0x00,0x00,  0x0C,0x06,0x00,0x00,  0x0C,0x06,0x00,0x00,  0x1F,0x06,0x00,0x00,  
0x3F,0x7F,0xE0,0x00,  0x70,0x7F,0xE0,0x00,  0x7F,0x66,0x60,0x00,  0x1F,0x66,0x60,0x00,  
0x0C,0x66,0x60,0x00,  0x0C,0x66,0x60,0x00,  0x3F,0x66,0x60,0x00,  0x3F,0x7F,0xE0,0x00,  
0x0C,0x7F,0xE0,0x00,  0x0C,0x66,0x60,0x00,  0x0D,0x06,0x00,0x00,  0x0F,0x06,0x00,0x00,  
0x0E,0x06,0x00,0x00,  0x0C,0x06,0x00,0x00,  0x00,0x00,0x00,0x00,  0x00,0x00,0x00,0x00,  
0x00,0x00,0x00,0x00,  0x00,0x00,0x00,0x00,  0x00,0x00,0x00,0x00,  0x00,0x00,0x00,0x00,  
0x00,0x00,0x00,0x00,  0x00,0x00,0x00,0x00,  0x00,0x00,0x00,0x00,  0x00,0x00,0x00,0x00,  
0x00,0x00,0x00,0x00,  0x00,0x00,0x00,0x00,  0x00,0x00,0x00,0x00,  0x00,0x00,0x00,0x00
};

char zuo16H[]={
  0x18,0xC0,0x18,0xC0,0x19,0x80,0x31,0xFE,
  0x33,0xFE,0x76,0xC0,0xF0,0xFC,0xB0,0xFC,
  0x30,0xC0,0x30,0xC0,0x30,0xFE,0x30,0xFE,
  0x30,0xC0,0x30,0xC0,0x30,0xC0,0x00,0x00,
};
char zhe16H[]={
  0x03,0x00,0x03,0x0C,0x1F,0xCC,0x1F,0xD8,
  0x03,0x30,0xFF,0xFE,0xFF,0xFE,0x03,0x00,
  0x0F,0xF8,0x3F,0xF8,0xEC,0x18,0xCF,0xF8,
  0x0C,0x18,0x0F,0xF8,0x0F,0xF8,0x00,0x00,
};
char mh16H[]={
0x00,0x00,  0x00,0x00,  0x00,0x00,  0x00,0x00,  
0x00,0x00,  0x00,0x00,  0x00,0x00,  0x00,0x00,  
0x30,0x00,  0x30,0x00,  0x00,0x00,  0x00,0x00,  
0x30,0x00,  0x30,0x00,  0x00,0x00,  0x00,0x00
};

char zhao16H[]={
0x0C,0x00,  0x0C,0x0C,  0x7F,0x8C,  0x7F,0xCC,  
0x0C,0x6C,  0x0C,0x38,  0xFF,0x98,  0xFF,0xB8,  
0x0C,0x38,  0x6F,0x6C,  0x6F,0xCC,  0x7C,0x84,  
0x7C,0x00,  0xCF,0xFE,  0x87,0xFE,  0x00,0x00
};
char peng16H[]={
0x00,0x30,  0x77,0x7C,  0x77,0x7C,  0x55,0x64,  
0x55,0x7C,  0x77,0x64,  0x55,0x6C,  0x55,0x60,  
0x77,0x7E,  0x77,0x7E,  0x55,0x06,  0x55,0x76,  
0x55,0x06,  0xD5,0x1E,  0xAB,0x0C,  0x00,0x00
};

/*圖形驅動初始化*/
void init(void)
{
    int gdriver = DETECT, gmode, errorcode;
	errorcode=registerbgidriver(EGAVGA_driver);	
    if(errorcode<0)
    {
        printf("Graphics error: %s", grapherrormsg(errorcode));
        printf("Press any key to halt:");
        getch();
        exit(1);
    }
    initgraph(&gdriver, &gmode,"" );
    errorcode = graphresult();
    if (errorcode != grOk)
    {
        printf("Graphics error: %s", grapherrormsg(errorcode));
        printf("Press any key to halt:");
        getch();
        exit(1);
    }
}

/* 畫圓並填充函數 */
void circle_fill(circle_line_color,fill_color,fill_style,radius,x)
int circle_line_color,fill_color,fill_style,radius,x;
{
      setcolor(circle_line_color);
      circle(midx,midy,radius);
      setfillstyle(fill_style,fill_color);
      floodfill(x,midy,circle_line_color);
}

/* 畫時鐘函數 */
void draw_clock(void)
{
    int n;
    char a[13][3],buf[20];
    circle_fill(2,BK_COLOR,1,CIRCLE_SIZE_1,getmaxx());
    circle_fill(2,RING_COLOR,RING_FILL_STYLE,CIRCLE_SIZE_1,midx+195);
    circle_fill(8,CLOCK_BK_COLOR,1,CIRCLE_SIZE_2,midx+175);
    for(n=1;n<12;n++)                /* 畫時間數字 */
    {
	 itoa(n,a[n],10);
        setcolor(CLOCK_BK_COLOR);
        arc(midx,midy,90,450-n*30,NUM_POSITION);
        getarccoords(&arci);
        settextstyle(NUM_FONT,0,NUM_SIZE);
        settextjustify(1,1);
        setcolor(NUM_COLOR);
	 outtextxy(arci.xend,arci.yend,a[n]);
        outtextxy(midx+1,midy-178,"12");
    }
}

/* 點陣字體轉換函數 */
void draw_mat(char *mat,int matsize,int x,int y,int color)
{
     int i,j,k,m;
     m=(matsize-1)/8+1;
     for(j=0;j<matsize;j++)
     for(i=0;i<m;i++)
          for(k=0;k<8;k++)
               if(mat[j*m+i]&(0x80>>k))
                    putpixel(x+i*8+k,y+j,color);
}

/* 輸出點陣文字 */
void show_character(void)/*input word*/
{
     draw_mat(xiao32H,32,midx-50,10,0);
     draw_mat(po32H,32,midx-10,10,0);
     draw_mat(zhong32H,32,midx+30,10,0);

     draw_mat(xiao32H,32,midx-49,11,14);
     draw_mat(po32H,32,midx-9,11,14);
     draw_mat(zhong32H,32,midx+31,11,14);
	 
     draw_mat(zuo16H,16,480,460,15);
     draw_mat(zhe16H,16,498,460,15);
     draw_mat(mh16H,16,516,460,15);
	 
     draw_mat(zhao16H,16,530,460,15);
     draw_mat(peng16H,16,552,460,15);
}

/* 時針轉動函數 */
void hand(time,t,xp,yp,times_hand_color,hand_length,hour_or_not)
int *time,*t,*xp,*yp,times_hand_color,hand_length,hour_or_not;
{
	setcolor(CLOCK_BK_COLOR);
	if(hour_or_not==1)
	{
		arc(midx,midy,90,90-30*h-*time,hand_length);
		if(*t==r1)
		{
			setcolor(CLOCK_BK_COLOR);
			line(midx,midy,*xp,*yp);
		}
		r1=*time+1;
	}
	else
		arc(midx,midy,90,90-*time*6,hand_length);
	if(*t==*time&&hour_or_not!=1)
	{
		setcolor(CLOCK_BK_COLOR);
		line(midx,midy,*xp,*yp);
	}
	*t=*time+1;
	getarccoords(&arci);
	*xp=arci.xend;
	*yp=arci.yend;
	setcolor(times_hand_color);
	line(midx,midy,*xp,*yp);
}
void main(void)
{
	int s,m,i=0,j=0,k=0,xs,ys,xm,ym,xh,yh,r,n;
	char buf[20];
	struct time t;	
	init();
	midx = getmaxx()/ 2;
       midy = getmaxy()/ 2;    	
	while(1)
	{
		gettime(&t);
		s=t.ti_sec;
		m=t.ti_min;
		xs=xm=xh=midx;
		ys=ym=yh=midy;
		draw_clock();
		show_character();
		while(!kbhit())
		{
			n=1;
			gettime(&t);
			h=t.ti_hour;		  
			sprintf(buf,"%2d:%02d:%02d ",t.ti_hour, t.ti_min, t.ti_sec); 		  
			setcolor(15);
			settextstyle(0,0,0);
			settextjustify(1,1);	  
			outtextxy(midx+6,midy+110,buf);	  	  
			circle_fill(11,CENTER_COLOR,1,CIRCLE_SIZE_3,midx+3);
			circle_fill(0,0,1,2,midx);
			sleep(1);		  
			s++;
			if(s%60==0)
			{
				m++;
				n=0;
			}
			r=m/2;
			sound(24);
			nosound();
			hand(&s,&i,&xs,&ys,SEC_HAND_COLOR,SEC_HAND_LENGTH,0);    /* 秒針轉動 */
			if(n<2)
			{
				hand(&m,&j,&xm,&ym,MIN_HAND_COLOR,MIN_HAND_LENGTH,0);   /* 分針轉動 */
				hand(&r,&k,&xh,&yh,HOUR_HAND_COLOR,HOUR_HAND_LENGTH ,1);    /* 時針轉動 */
			}
			n++;
			setcolor(CLOCK_BK_COLOR);		  
			outtextxy(midx+6,midy+110,buf);
		}
		setcolor(15);
		outtextxy(midx+6,midy+140,"QUIT ?(Y/N)");
		key=bioskey(0);			
		while(1)
		{	
			key=bioskey(0);	
			if(key==Y||key==N)
				break;
		}
		if(key==Y)
			break;		
	}	
       closegraph();
}


 

發佈了30 篇原創文章 · 獲贊 4 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章