C语言在Linux终端打印像素时钟

  • 效果
    在这里插入图片描述

先简单对ansi控制码封装一下

  • show.h

    #ifndef __SHOW_H
    #define __SHOW_H
    
    #define n 15 
    #define m 31 
    
    #define CH ' '
    
    #define NORMAL    0xffff
    #define CLEAR     0x01
    #define BRIGHT    0x02
    #define FLASH     0x04
    #define Invisable 0x08
    #define BLACK     0x10
    #define RED       0x20
    #define GREEN     0x40
    #define YELLOW    0x80
    #define BLUE      0x0100
    #define PURPLE    0x0200
    #define CYAN      0x0400
    #define WHITE     0x0800
    
    typedef struct point{
    	unsigned int x;
    	unsigned int y;
    	int set;
    	char ch;
    }point;
    
    static int color[8] = {RED,GREEN,YELLOW,BLUE,PURPLE,CYAN,WHITE,BLACK};
    
    void show_clear();
    
    void show_print();
    
    int show_set(int set);
    
    int show_one(unsigned int x,unsigned int y,int set,char ch);
    
    int show_one_del(unsigned int x,unsigned int y);
    
    int show_one_mv(unsigned int x,unsigned int y,char mv,int num);
    
    int show_line(unsigned int x,unsigned int y,int num,int flag,int set,char ch);
    
    int show_line_del(unsigned int x,unsigned int y,int num,int flag);
    
    int show_block(unsigned int x1,unsigned int y1,unsigned int x2,unsigned int y2,int set,char ch);
    
    int show_block_del(unsigned int x1,unsigned int y1,unsigned int x2,unsigned int y2);
    
    #endif
    
    
  • show.c

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <unistd.h>
    #include "show.h"
    
    static int show[n][m];
    static char show_ch[n][m];
    
    int show_set(int set)
    {
    	switch(set){
    		case 0xffff : printf("\033[0m");break;	
    		case 0x01   : printf("\033[2J");break;	
    		case 0x02   : printf("\033[1m");break;	
    		case 0x04   : printf("\033[5m");break;	
    		case 0x08   : printf("\033[8m");break;	
    		
    		case 0x10   : printf("\033[40m");break;	
    		case 0x20   : printf("\033[41m");break;	
    		case 0x40   : printf("\033[42m");break;	
    		case 0x80   : printf("\033[43m");break;	
    		case 0x0100 : printf("\033[44m");break;	
    		case 0x0200 : printf("\033[45m");break;	
    		case 0x0400 : printf("\033[46m");break;	
    		case 0x0800 : printf("\033[47m");break;	
    		
    		case 0x12   : printf("\033[1;40m");break;	
    		case 0x22   : printf("\033[1;41m");break;	
    		case 0x42   : printf("\033[1;42m");break;	
    		case 0x82   : printf("\033[1;43m");break;	
    		case 0x0102 : printf("\033[1;44m");break;	
    		case 0x0202 : printf("\033[1;45m");break;	
    		case 0x0402 : printf("\033[1;46m");break;	
    		case 0x0802 : printf("\033[1;47m");break;	
    		
    		case 0x14   : printf("\033[5;40m");break;	
    		case 0x24   : printf("\033[5;41m");break;	
    		case 0x44   : printf("\033[5;42m");break;	
    		case 0x84   : printf("\033[5;43m");break;	
    		case 0x0104 : printf("\033[5;44m");break;	
    		case 0x0204 : printf("\033[5;45m");break;	
    		case 0x0404 : printf("\033[5;46m");break;	
    		case 0x0804 : printf("\033[5;47m");break;
    
    		case 0x16   : printf("\033[1;5;40m");break;	
    		case 0x26   : printf("\033[1;5;41m");break;	
    		case 0x46   : printf("\033[1;5;42m");break;	
    		case 0x86   : printf("\033[1;5;43m");break;	
    		case 0x0106 : printf("\033[1;5;44m");break;	
    		case 0x0206 : printf("\033[1;5;45m");break;	
    		case 0x0406 : printf("\033[1;5;46m");break;	
    		case 0x0806 : printf("\033[1;5;47m");break;	
    		
    		default : return -1;	      
    	}
    
    	return 0;
    }
    
    void show_print()
    {
    	int set = 0;
    	printf("\033[H");
    	for(int i=0; i < n; i++){
    		for(int j=0; j < m; j++){
    			set = show[i][j];
    			if(set){
    				show_set(set);
    				printf("%c%c",show_ch[i][j],show_ch[i][j]);
    				show_set(NORMAL);
    			}else{
    				printf("%c%c",show_ch[i][j],show_ch[i][j]);
    			}
    		}
    	      	printf("\n");	
    	}
    }
    
    int show_one(unsigned int x,unsigned int y,int set,char ch)
    {
    	if(x > n || y > m )
    		return -1;
    
    	show[x][y] = set;
    	show_ch[x][y] = ch;
    	show_print();
    	
    	return 0;
    }
    
    int show_one_del(unsigned int x,unsigned int y)
    {
    	return show_one(x,y,0,CH);
    }
    
    int show_one_mv(unsigned int x,unsigned int y,char mv,int num)
    {
    	if(x+num > n || y+num > m || x+num < 0 || y+num < 0 ||(num > n && num > m))
    		return -1;
    	if(mv == 'U' && x-num >= 0){
    		show[x-num][y] = show[x][y];
    		show[x][y] = 0;
    		show_ch[x-num][y] = show_ch[x][y];
    		show_ch[x][y] = CH;
    		show_print();
    		return 0;
    	}else if(mv == 'D' && x+num <= n){
    		show[x+num][y] = show[x][y];
    		show[x][y] = 0;
    		show_ch[x+num][y] = show_ch[x][y];
    		show_ch[x][y] = CH;
    		show_print();
    		return 0;	
    	}else if(mv == 'L' && y-num >= 0){
    		show[x][y-num] = show[x][y];
    		show[x][y] = 0;
    		show_ch[x][y-num] = show_ch[x][y];
    		show_ch[x][y] = CH;
    		show_print();
    		return 0;
    	}else if(mv == 'R' && y+num <= m){
    		show[x][y+num] = show[x][y];
    		show[x][y] = 0;
    		show_ch[x][y+num] = show_ch[x][y];
    		show_ch[x][y] = CH;
    		show_print();
    		return 0;
    	}	
    	return -1;
    }
    
    int show_one_cp(unsigned int ox,unsigned int oy,unsigned int nx,unsigned int ny)
    {
    	if(ox > n || oy > m || nx > n || ny > m ) 
    		return -1;
    	
    	show[nx][ny] = show[ox][oy];
    	show[ox][oy] = 0;
    	show_ch[nx][ny] = show_ch[ox][oy];
    	show_ch[ox][oy] = CH;
    	show_print();
    
    	return 0;
    }
    
    int show_line(unsigned int x,unsigned int y,int num,int flag,int set,char ch)
    {
    	int i = 0;
    	if(x > n || y > m || x+num > n || x+num < 0 || y+num > n || y+num < 0)
    		return -1;
    	
    	if(flag == 0){
    		for(i = 0;i < num;i++){
    			show[x+i][y] = set;
    			show_ch[x+i][y] = ch;
    		}
    	}else{
    		for(i = 0;i < num;i++){
    			show[x][y+i] = set;
    			show_ch[x][y+i] = ch;
    		}
    	}
    	
    	show_print();
    
    	return 0;
    }
    
    int show_line_del(unsigned int x,unsigned int y,int num,int flag)
    {
    	return show_line(x,y,num,flag,0,CH);
    }
    
    int show_block(unsigned int x1,unsigned int y1,unsigned int x2,unsigned int y2,int set,char ch)
    {
    	if(x1 > n || y1 > m || x1 < 0 || y1 < 0 || x2 > n || y2 > m || x2 < x1 ||y2 < y1){ 
    		return -1;
    	}
    
    	for(int i = x1; i <= x2; i++){
    		for(int j = y1; j <= y2; j++){
    			show[i][j] = set;
    			show_ch[i][j] = ch;
    		}
    	}
    	show_print();
    
    	return 0;
    }
    
    int show_block_del(unsigned int x1,unsigned int y1,unsigned int x2,unsigned int y2)
    {
    	return show_block(x1,y1,x2,y2,0,CH);
    }
    
    void show_clear()
    {
    	printf("\033[?25l");
    	show_set(CLEAR);
    	memset(show,0,sizeof(show));
    	memset(show_ch,CH,sizeof(show_ch));
    	show_print();
    }
    

时钟代码

  • main.c

    #include "show.h"
    #include <string.h>
    #include <unistd.h>
    #include <time.h>
    #include <stdlib.h>
    
    
    int showNum(int num,int set,unsigned int x,unsigned int y)
    {
    	if(num<0 || num>9 || x+5>n || y+3>m)
    		return -1;
    
    	int max = 0;
    	point buf[13] = {0};
    	if(num == 0){
    		point num1[] = {{0,0,set,CH},{0,1,set,CH},{0,2,set,CH},
    			{1,0,set,CH},{2,0,set,CH},{3,0,set,CH},
    			{4,0,set,CH},{4,1,set,CH},{4,2,set,CH},
    			{1,2,set,CH},{2,2,set,CH},{3,2,set,CH}};
    		memcpy(buf,num1,12*sizeof(point));
    		max = 12;	
    	}else if(num == 1){
    		point num2[] = {{0,2,set,CH},{1,2,set,CH},{2,2,set,CH},
    			{3,2,set,CH},{4,2,set,CH}};
    		memcpy(buf,num2,5*sizeof(point));
    		max = 5;
    	}else if(num == 2){
    		point num3[] = {{0,0,set,CH},{0,1,set,CH},{0,2,set,CH},
    			{1,2,set,CH},{2,2,set,CH},{2,1,set,CH},
    			{2,0,set,CH},{3,0,set,CH},{4,0,set,CH},
    			{4,1,set,CH},{4,2,set,CH}};
    		memcpy(buf,num3,11*sizeof(point));
    		max = 11;	
    	}else if(num == 3){
    		point num3[] = {{0,0,set,CH},{0,1,set,CH},{0,2,set,CH},
    			{1,2,set,CH},{2,0,set,CH},{2,1,set,CH},
    			{2,2,set,CH},{3,2,set,CH},{4,2,set,CH},
    			{4,1,set,CH},{4,0,set,CH}};
    		memcpy(buf,num3,11*sizeof(point));
    		max = 11;	
    	}else if(num == 4){
    		point num4[] = {{0,0,set,CH},{1,0,set,CH},{2,0,set,CH},
    			{2,1,set,CH},{2,2,set,CH},{0,2,set,CH},
    			{1,2,set,CH},{3,2,set,CH},{4,2,set,CH}};
    		memcpy(buf,num4,9*sizeof(point));
    		max = 9;	
    	
    	}else if(num == 5){
    		point num5[] = {{0,0,set,CH},{0,1,set,CH},{0,2,set,CH},
    			{1,0,set,CH},{2,0,set,CH},{2,1,set,CH},
    			{4,0,set,CH},{4,1,set,CH},{4,2,set,CH},
    			{2,2,set,CH},{3,2,set,CH}};
    		memcpy(buf,num5,11*sizeof(point));
    		max = 11;	
    	}else if(num == 6){
    		point num6[] = {{0,0,set,CH},{0,1,set,CH},{0,2,set,CH},
    			{1,0,set,CH},{2,0,set,CH},{2,1,set,CH},
    			{4,0,set,CH},{4,1,set,CH},{4,2,set,CH},
    			{2,2,set,CH},{3,2,set,CH},{3,0,set,CH}};
    		memcpy(buf,num6,12*sizeof(point));
    		max = 12;	
    	}else if(num == 7){
    		point num7[] = {{0,0,set,CH},{0,1,set,CH},{0,2,set,CH},
    			{4,2,set,CH},{1,2,set,CH},{2,2,set,CH},{3,2,set,CH}};
    		memcpy(buf,num7,7*sizeof(point));
    		max = 7;	
    	}else if(num == 8){
    		point num8[] = {{0,0,set,CH},{0,1,set,CH},{0,2,set,CH},
    			{1,0,set,CH},{2,0,set,CH},{3,0,set,CH},
    			{4,0,set,CH},{4,1,set,CH},{4,2,set,CH},
    			{1,2,set,CH},{2,2,set,CH},{3,2,set,CH},{2,1,set,CH}};
    		memcpy(buf,num8,13*sizeof(point));
    		max = 13;	
    	}else if(num == 9){
    		point num9[] = {{0,0,set,CH},{0,1,set,CH},{0,2,set,CH},
    			{1,0,set,CH},{2,0,set,CH},{4,0,set,CH},
    			{4,1,set,CH},{4,2,set,CH},{1,2,set,CH},
    			{2,2,set,CH},{3,2,set,CH},{2,1,set,CH}};
    		memcpy(buf,num9,12*sizeof(point));
    		max = 12;	
    	}
    		
    
    	for(int i = 0;i < max;i++){
    		show_one(buf[i].x+x,buf[i].y+y,buf[i].set,buf[i].ch);
    	}
    	
    	return 0;		
    }
    
    void showTime()
    {
    	time_t t;
    	struct tm *st;
            time(&t);
           	st = localtime(&t);
    	
    	showNum(st->tm_hour/10,BRIGHT|BLUE,3,1);
    	showNum(st->tm_hour%10,BRIGHT|BLUE,3,5);
    	showNum(st->tm_min/10,BRIGHT|PURPLE,3,13);
    	showNum(st->tm_min%10,BRIGHT|PURPLE,3,17);
    }
    
    int main()
    {
    	int i = 0;
    	show_clear();
    	while(1){
    		show_clear();
    		showTime();
    		for(i = 0;i < 22;i++){
    			show_one(1,i,BRIGHT|color[rand()%8],CH);
    			show_one(9,i,BRIGHT|color[rand()%8],CH);
    		}
    		show_one(4,10,BRIGHT|RED,CH);
    		show_one(6,10,BRIGHT|RED,CH);
    		usleep(500000);
    		show_one_del(4,10);
    		show_one_del(6,10);
    		usleep(500000);
    	}
    
    	return 0;
    }
    
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

money的大雨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值