返回列表 发帖

C语言艺术清屏

问题的提出:我们在编制程序时,经常要用到清屏处理,如dos下的cls,Turbo C下的clrscr()等都具有清屏功能,但这些均为一般意义的清屏,
! \; V9 f. p) H  g5 z( {9 J) D! J1 L* `) S  v
  并未显示其清屏规律.而有时为了达到清屏的艺术美观,往往对清屏有一些具体要求,如:开幕清屏;闭幕清屏;上清屏;下清屏;中清屏.为此,这里% t% J; X" `1 a6 o2 g

6 [* o; W/ l$ C' l  b8 v5 ]; ?  用C语言编制了几个子函数,用于程序中时,既可达到清屏的目的,有能增加屏幕的艺术美观. ; D& F) E4 Y$ V  _5 j5 s
  子函数及演示程序:1 q! w# J$ A6 _( j* R6 X6 a9 x
4 x2 T# E# v: g' I# j
  #include<stdio.h>
* Z2 @: v0 t4 G, S5 @7 [  #include<dos.h>6 a; j$ q  P; L/ ^  j
  #include<conio.h>6 w( u% v1 o" ^+ {' D3 a
) Z1 V3 r$ a1 M1 Q* ^  ]
  void goto_xy(int x,int y);. K" e+ L/ T. r- W' m
  void dcls(int x1,int x2,int y1,int y2);
( x5 F# u: s( T" n% h5 e0 Y3 w  void bcls(int x1,int x2,int y1,int y2);
5 V: t5 S) T+ k2 p3 w1 u  void kcls(int x1,int x2,int y1,int y2);
! h9 r. K/ T# L" y  void recls(int x1,int x2,int y1,int y2);
5 h) B8 U; f+ y: V) P& Q  void zcls(int x1,int x2,int y1,int y2);
  w2 x+ V% O0 Q7 q" |7 C  void puta(void);
  r7 E) m$ ?8 m& G2 u3 s6 K8 N4 ^: f. b
! a1 g: `; J. f8 l- E, P( r1 L
  /*--------------演示程序---------------------*/
! L+ K8 i# [, P  main()0 b) G9 U7 M/ Y# p6 p
  {8 ?  V+ o) Y( _) N1 W3 ~
  puta();
$ G* A3 O8 z) E  getch();
4 Z8 A" V0 I1 N  J7 u& M0 g8 v  dcls(0,4,0,79);  S3 ]& M  d# ?* C; p
  getch();
- _, ?3 W6 w& I- C1 i  puta();6 G2 i2 E9 t, s2 t3 c
  getch();
8 \3 B) @8 [7 J, R7 c' j  bcls(0,25,0,79);
! m1 c" g$ r8 f0 u& r7 x* W  getch();6 h6 d. j; {9 X/ V( H) e& T
  puta();  F# p6 K( ?8 J( L3 r4 v
  getch();
$ N7 I. Y2 R6 G$ I  zcls(0,25,0,79);% }6 {+ m8 F7 O7 n4 t
  getch();; `8 S: ]) m. T& B, F5 D
  }
0 H! }, h9 \( M" A' m6 S: N; ^  /*********center clear screen(中心清屏)***********/2 \* u4 ^( n6 `! v' z
  void zcls(int x1,int x2,int y1,int y2): [6 p0 \2 P' m( f5 `: `% X
  {' @; m* l& @# r
  int x00,y00,x0,y0,i,d;  [  A7 o* @$ V
  if((y2-y1)>(x2-x1)){
7 {2 ?' ?7 ~; o5 z! l  d=(x2-x1)/2;; O! Z" k5 n" m9 P% \2 [2 }
  x0=(x1+x2)/2;
7 }( j9 M* C" v0 u# L  y0=y1+d;
( S( u) q8 w5 `4 s8 h  y00=y2-d;3 \' A& g2 s* U- k: x7 |
  for(i=0;i<(d+1);i++)
* a8 t8 `. O5 @, r  recls((x0-i),(x00+i),(y0-i),(y00+i));+ r: m+ T& _/ u7 a7 M/ d
  delay(10);
' a& q6 L$ _9 H8 l9 k  }" h; z4 c  }! H$ ]  {# j+ G) ]
  else{
/ V2 |; H. z) T8 O; U3 u9 V  d=(y2-y1)/2;2 W- m6 g* p" \: O2 ]
  y0=(y1+y2)/2;: X9 H+ o8 z' o
  x0=x1+d;+ ^. @9 |3 b8 u
  x00=x2-d;# v  O, g2 r- I, A5 u
  for(i=0;i<d+1;i++)
) P+ @. K+ y. W9 r+ M5 H  recls(x0-i,x00+i,y0-i,y00+i);
2 [% C: B* L* P7 |  delay(10);( U* V/ O# i7 X  _7 R: Y( x8 z4 }
  }: g0 A* e3 H4 f1 X
  }1 I: u1 r& {1 j# ^* z
( O# X$ K% n$ X! Z* }7 ^) q+ E9 K
  /************* clear rectangle side(矩形边清屏)***********************/
1 U/ ^4 L. @$ p4 U
- i8 c2 _* N& P  I! F- I4 e- v' k  void recls(int x1,int x2,int y1,int y2)
6 }9 g+ ~& Z; }4 ^  {) Y- }) Q/ A4 R6 ]9 f2 s
  int i,j;
/ F/ Z0 Z8 s' T1 }" a# u; |$ D! o8 v  for(i=y1;i<y2;i++){/ |+ a! m2 ^' e2 A
    goto_xy(x1,i);
3 h6 w( n4 b: L; W  putchar(' ');5 v9 ]& x2 V) _" A# Q( [
  goto_xy(x2,i);" H, j/ [* x1 t+ c
  putchar(' ');
) m3 G1 Y6 Q3 z* O$ V* R5 v  delay(10);: u: }5 ^' G  u6 B( C% j7 D
  }
/ E5 Z. [% z! W- c  for(j=x1;j<x2;j++){
5 j, p+ l+ S1 {# A  goto_xy(i,y1);2 A5 Y+ Z2 n, F
  putchar(' ');
/ [; Q3 f, e, N* N2 a  goto_xy(j,y2);
2 c& Y/ q$ \+ k  putchar(' ');
& j8 F7 b  ^5 g- S  delay(10);
2 s8 r6 ^% c3 X- A9 S  }" q8 C4 r7 ~! R2 A' T
  }
. |/ B' a; F6 A5 l; d, V+ _# K  /******************open screen clear(开屏式清屏)*********************/
: c1 Z* r$ U! j. R0 h. ~* u. o
" l9 O' E) E8 l. M) n  void kcls(int x1,int x2,int y1,int y2)
7 K+ G2 e: Y2 x; B3 f  {) w, }6 `# l/ e" e4 p) e
  int t,s,i,j;, y: O6 g( l" s& a1 z7 c5 W
  t=s=(y1+y2)/2;
5 M& S9 d, Q8 w4 x4 A% `+ i% V  for(;t<=y2;t++,s--)
0 B/ S$ O- |0 {8 D' }$ v8 g4 B  C  for(j=x1;j<x2;j++){
5 p! X: R5 X4 K7 S- N  goto_xy(j,t);
$ ^; W0 l4 q2 M2 q" B' W  putchar(' ');7 M& c0 n! i) [: W! _- h
  goto_xy(j,s);
5 U- k6 m6 u: \  putchar(' ');
: T# U" U- I( W6 A  I  delay(10);
6 a# e* d# g0 F& `" L+ a& V: }  }, D* P* O7 ?& k8 O% S# j5 E8 n  S
  }8 G9 K- g1 H1 V1 G/ H
  /*****************close screen clear*****闭幕式清屏*******************/9 x6 r) T) ^  ]' t) W

5 [3 s* I; k  y. O- Z  y2 G  void bcls(int x1,int x2,int y1,int y2)
# K0 i* k7 v/ ]4 K# I  {
$ e2 {, E; g& M) M  int t,s,j;6 P2 y9 [1 f5 A0 N! e9 ^
  t=y1;6 }  t6 ?" ]) Q( p0 v) h+ _' k: i
  s=y2;& [' m5 H& g. P  Y
  for(t=y1;t<(y1+y2)/2;t++,s--)
! J6 ?9 j# {8 [# M3 v# T! Q2 ~  for(j=x1;j<x2;j++){/ v2 w7 f8 x6 y, w. e- \
  goto_xy(j,t);
4 U& N% ~# T& v5 B7 A  putchar(' ');( |. ^3 K9 ]2 E
  goto_xy(j,s);& N3 Q+ u: j4 t; f# w2 q
  putchar(' ');
, A; N  b7 X; u  delay(10);. l! L/ J% z# X) [5 Y8 U8 f
  }
0 M% a* ~: `& A% _5 O' k  }
% i- \* \! a/ X7 M9 b) S  /******************bottom screen clear(自下清屏)********************/
' B! T9 S. s3 @8 _8 {: `' l1 X/ e) v  s4 q
  void dcls(int x1,int x2,int y1,int y2)
5 d2 V% v+ b+ M& T6 w% s! m, m9 U  {4 u1 S0 o# R+ I) k
  int t,s,j,i;
7 ~4 F2 z# M' T& C  t=s=(y1+y2)/2;5 T3 [9 {% N/ _4 A& x; y
  for(j=x2;j>x1;j--)
, X& T4 l" e3 _7 {" u4 t  for(i=y1;i<y2;i++){
3 ~( X. }) f5 D9 Y5 C  goto_xy(j,i);
) ~7 n: I1 ?, B( k, o  putchar(' ');
* |6 n5 ?1 D3 k% H  l& x0 o4 p  delay(10);
  j- O9 I- {' P: t/ X* P  }
/ ]# E  E* S8 ~7 E: k0 d, ^  }! u9 [& ?$ @; @- j, m
  /******************设置光标子函数******************/9 c/ r% D7 r4 B
0 V1 A8 T2 T- }% ?% C& @' O
  void goto_xy(int x,int y)
0 Y  X  x( w2 p& y: I3 y# Z  {
6 v# d& H2 @# ~; T. v6 f" W& T8 V  union REGS r;' G% t' f, d, P1 l. Q# U, y% F
  r.h.ah=2;$ |6 E* }7 y' }
  r.h.dl=y;5 z- ?" q- ]+ {1 F9 n) d
  r.h.dh=x;* A' a$ |2 \5 p' c( i
  r.h.bh=0;
0 l  c# Z$ _  M+ D5 a  int86(0x10,&r,&r);
  l# i( R8 z3 J1 C3 C7 p  }
  ~7 i' V: j) c% U( U5 V7 J7 I9 q0 i: O* I; J
  /**********************在屏幕上打出一连串的a字母用于演示程序******************/
* H5 x+ F, Y2 o( R! q1 t6 t  n6 }3 o  m5 F8 h
  void puta(void)3 t8 I2 _9 m" {& L! P- M! z+ o; F
  {; J: H7 V* P! q
  int i,j;) e7 L! b  H* p5 A( c/ \& u
  for(i=0;i<24;i++){
* @  W/ M- @! p& O( X% B$ c  for(j=0;j<79;j++){
* z( r8 R6 }" P  goto_xy(i,j);+ Z6 M% H+ W2 c- u
  printf("a");
6 x  }/ X2 k$ s7 P1 A! G  }
& r! n3 \" H, n7 n" C  }8 V' V( }4 E, E& b$ ~
  }

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