- 效果
先简单对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; }