返回列表 发帖

C语言艺术清屏

问题的提出:我们在编制程序时,经常要用到清屏处理,如dos下的cls,Turbo C下的clrscr()等都具有清屏功能,但这些均为一般意义的清屏,* l1 g$ j' A7 q$ _" O  H

* p  ^* d4 _% ^5 u, h: z  并未显示其清屏规律.而有时为了达到清屏的艺术美观,往往对清屏有一些具体要求,如:开幕清屏;闭幕清屏;上清屏;下清屏;中清屏.为此,这里; x7 |0 }9 m7 w1 f
, y( Z2 l% ?  N  g
  用C语言编制了几个子函数,用于程序中时,既可达到清屏的目的,有能增加屏幕的艺术美观. 4 e, D, L% N" J0 {/ g3 P
  子函数及演示程序:
$ f; D; O& U6 W4 N' v" W6 m4 G5 i( U7 x: e' q" w* G
  #include<stdio.h>
) u# c3 t6 ?( D% b. P! Z  #include<dos.h>" @" b2 e' v7 C, j8 k
  #include<conio.h>+ S0 U! b9 P- ?3 [4 D. G& f
* @# N  Z0 F' j" ?/ O9 j
  void goto_xy(int x,int y);
2 A( }: f5 }9 V  void dcls(int x1,int x2,int y1,int y2);0 c1 r, ?- N  b
  void bcls(int x1,int x2,int y1,int y2);
( }7 s0 ]0 u+ I& p7 @! V  void kcls(int x1,int x2,int y1,int y2);
% K4 W/ H$ I# Q8 o( s* P  void recls(int x1,int x2,int y1,int y2);2 V/ M5 ?3 k# G/ \4 {! Q) I
  void zcls(int x1,int x2,int y1,int y2);
, \& B" y: ~9 P. T' o$ Z  void puta(void);$ n. w/ O( S& M% U$ H
2 `& @. b6 F  g2 C) N

) I. Y# b, d6 R$ X3 H' _. k9 [. d* t2 f  /*--------------演示程序---------------------*/
* \$ D  ?& _$ d1 ]1 ~7 W9 {  main()
4 n% x6 ^) J* I9 I* F  {
' q/ Y! n$ J3 U8 x" q; `  puta();$ m5 z) x% e2 b5 n' \
  getch();
7 q$ z' C/ O1 k/ Q3 A! r  dcls(0,4,0,79);6 j+ M" y% t7 }. G+ o
  getch();, n" V5 S' m/ M9 h, T; K$ J& L: i
  puta();
- s$ V! U8 m- U  getch();2 f+ m- k3 e) u6 T! v* ]" r6 N
  bcls(0,25,0,79);
0 U5 T9 {& ~. j# b6 t# _  getch();- v8 j; G, D  y
  puta();" ?) O/ {$ `1 g( y5 q" d( K, Y
  getch();
9 P. R2 ^8 l( F) h  zcls(0,25,0,79);
% a$ Y& _2 c; L5 x+ g2 P  getch();' h$ H% F, \' x. L) U. m, l2 P
  }+ y6 E, P- p+ k# {$ z
  /*********center clear screen(中心清屏)***********/$ n0 Q5 K1 j  W9 {; Z
  void zcls(int x1,int x2,int y1,int y2)
2 ]3 d: w& X" F8 i7 V2 f! g) B/ F: Q" O  {: m6 q& W+ I. J. C
  int x00,y00,x0,y0,i,d;+ V6 R9 `) N4 X1 g# k# O6 D
  if((y2-y1)>(x2-x1)){. o3 Y1 x1 w  q& ~8 r, n2 Y
  d=(x2-x1)/2;
1 e  w9 n& C2 d2 d  x0=(x1+x2)/2;- N( P, w, \. N3 K2 m' l. N3 B+ I3 C) a* p
  y0=y1+d;* Y4 }8 k! J+ u, H5 R/ @
  y00=y2-d;( l! l2 C7 K! K0 o4 `
  for(i=0;i<(d+1);i++)
5 J2 Y3 z9 Z# E7 C5 h: @) h9 B  recls((x0-i),(x00+i),(y0-i),(y00+i));
8 N% A. s0 k/ w" N$ M  delay(10);
! E. @" Y* Y% b/ @/ T( o  }9 f3 z- Z" G9 X
  else{
) N, _9 h0 F/ p- s' z% x  L  d=(y2-y1)/2;; s$ G, E. X& ~/ u: _
  y0=(y1+y2)/2;9 P. g% d9 U+ F
  x0=x1+d;7 Z8 ]6 X& p9 G7 u6 k
  x00=x2-d;
4 ?" H' D; S3 ]) Z" Z! @# Q  for(i=0;i<d+1;i++)' g0 }. L7 `; h4 t: _) N7 X
  recls(x0-i,x00+i,y0-i,y00+i);
* B1 P6 B9 c3 }& [  I! v: s  delay(10);
7 m  `! C+ U- O! Z  }
. W! |3 M- ]3 N+ J. J! v. D  }
$ e; a# [4 L  S5 i% p( m+ G: i
+ P* ?! O# ~0 e  |; N  /************* clear rectangle side(矩形边清屏)***********************/
- ~5 b' X. S; Z) L# P
% h7 z9 s* X+ Z; X  void recls(int x1,int x2,int y1,int y2)
# D, n- ?$ }2 b% T9 |0 N  {4 y6 @- z- `3 S, p# n3 L. B6 c
  int i,j;" B" P$ Q" w. f2 M/ k; b  U
  for(i=y1;i<y2;i++){% V- P& x4 o! i: d1 l* h
    goto_xy(x1,i);
) i; g( V6 K/ n$ W$ k6 X+ {2 M/ P  putchar(' ');4 H; N  h) X( }( B) o
  goto_xy(x2,i);3 k$ p% S3 C9 @1 r0 {
  putchar(' ');
3 s! z, O2 i4 U$ a9 Q* M  delay(10);
% D' F1 R& k0 G8 G  }  Q, @- O* {( P! Z  K
  for(j=x1;j<x2;j++){
/ I8 f; X: o& a, u$ Y  goto_xy(i,y1);
' q* m5 G  s% U0 c4 p  putchar(' ');
+ a1 \% H' ~8 k0 P9 e2 {5 `2 \  goto_xy(j,y2);! F' w3 R! I( K6 b% r  a# s( x8 A; \
  putchar(' ');2 R' B' B$ T2 J8 }6 a  @
  delay(10);
& b& c3 q3 ^9 L9 v/ o; H0 \# m% E  }
+ @; H( k- }/ Q% m* ^& [2 ?  }1 M! u0 B, ~6 y; j- ~
  /******************open screen clear(开屏式清屏)*********************/6 p: Q0 _* U% O
3 J9 U2 |0 Y! ]9 C( f
  void kcls(int x1,int x2,int y1,int y2)
9 E. ?& ~- ^1 h2 k6 O7 \3 q* E  {, C# o  P* [( e+ w3 u+ C( J6 U
  int t,s,i,j;% _& F. z% z: ^4 \( p% Y/ }
  t=s=(y1+y2)/2;5 I3 M0 ]) K( p0 O$ L8 K
  for(;t<=y2;t++,s--)
6 R# x$ i8 o1 q  for(j=x1;j<x2;j++){) M- b9 F8 k8 O, y
  goto_xy(j,t);
  f/ O7 S; u) H  putchar(' ');
. z4 a9 S, n" F" y7 k0 I  goto_xy(j,s);
# f: v# Y! ~. l5 j% E  s" Y, I  putchar(' ');# \  H5 o! `# q' N) A* X+ `
  delay(10);- D7 T, D5 w$ t  k! U: G; |- d
  }5 T) y- |2 Z. U" k9 B0 D
  }. L9 N* `! L4 G, P9 B
  /*****************close screen clear*****闭幕式清屏*******************/% g6 ~# g/ B( v1 c2 Q  t
5 `1 S, d2 S: q
  void bcls(int x1,int x2,int y1,int y2)
* ~2 v! z5 n" j6 M" ~) I  {
5 C' t, F1 \! ?0 u0 C- t' k: }) t4 J  int t,s,j;& K" l& `2 ?. w5 [1 k. T
  t=y1;- U- l  n4 b  t8 q$ k- b
  s=y2;
! p5 M2 ]% i) R; @/ h  for(t=y1;t<(y1+y2)/2;t++,s--)
5 T- j+ e0 A! W! j  W3 ]; p1 o  for(j=x1;j<x2;j++){' Y) i. K4 k2 U5 e
  goto_xy(j,t);9 V3 f/ H- A4 q8 b" d
  putchar(' ');
3 k' v5 Q' e" i/ l: ?  goto_xy(j,s);. F9 E3 y5 n8 p3 L- j# ~
  putchar(' ');
$ N8 Z1 n" ~* a  delay(10);/ @6 u: s: d1 T# [; y/ M2 J
  }
+ g7 g: Q  q! ]' d$ k- G  }
0 S, K: [- c# A5 w4 D0 B% D* Q  /******************bottom screen clear(自下清屏)********************/
: {. q2 B( P2 N, C4 _7 f0 M5 }6 J% j
  void dcls(int x1,int x2,int y1,int y2)
" _/ Q5 m# B  H7 P  {
; u5 O% ~) S4 V" x% m; i" O  int t,s,j,i;# V; h6 U! m/ e
  t=s=(y1+y2)/2;
2 j0 t3 B: E! u6 u  for(j=x2;j>x1;j--)! U8 c1 a! \) a$ r4 V- `
  for(i=y1;i<y2;i++){0 B1 ?, S- F# P8 P/ |4 w* j: L
  goto_xy(j,i);5 k  d& ^% C6 X/ ~7 i5 g
  putchar(' ');
, t& ?1 L; d, {- C; t: q6 u5 S, G5 z  delay(10);
7 R( W4 i$ L% z8 h2 v: L. F/ z( N  }
8 w5 F! x3 ]: j1 {9 g& i  }
7 P3 M1 F  k" B: @$ }+ X' q  /******************设置光标子函数******************/+ u7 B, x2 T! G1 o, J. W
- j& {4 R1 g1 W+ U# P) n+ h! Z
  void goto_xy(int x,int y)1 X5 g9 M  y" f
  {" T  `6 |8 {/ p
  union REGS r;5 h* q7 Y4 b6 Y7 G$ n
  r.h.ah=2;
5 E/ R) E! \+ ]6 G  r.h.dl=y;
5 F: |/ ?6 ?  I! x( G, {) F; D  r.h.dh=x;
" u& N) ^1 }) K5 ?7 U  r.h.bh=0;
6 }* p- l. o6 M" _  int86(0x10,&r,&r);
% ?4 }8 m" O( t" z  }
7 I; q' Z0 ~1 g$ X3 o
( }2 V- |' W( g/ T% ~  /**********************在屏幕上打出一连串的a字母用于演示程序******************/
$ \7 D# T0 d/ G; M% \; H' t9 F4 D* b+ Y
  void puta(void)$ |+ `4 V$ l9 m
  {  J* h6 \: \* g
  int i,j;( \- N2 S( e) w
  for(i=0;i<24;i++){7 y5 V% G% u; y$ U$ u% c: ^
  for(j=0;j<79;j++){
+ E7 U2 L4 W8 M9 B( t' ~  goto_xy(i,j);
' W; ~! p1 w8 X2 y  printf("a");
8 `0 C6 d) _2 r/ v! O2 V) {& ~$ V0 m  }
9 G) {- j7 j, h8 N9 d  }) }4 `/ y; K4 C! e
  }

返回列表
【捌玖网络】已经运行: