返回列表 发帖

C语言艺术清屏

问题的提出:我们在编制程序时,经常要用到清屏处理,如dos下的cls,Turbo C下的clrscr()等都具有清屏功能,但这些均为一般意义的清屏,
3 C% k. W, r; ]/ B8 r3 O9 X% I$ _; z3 r6 ?8 j7 b
  并未显示其清屏规律.而有时为了达到清屏的艺术美观,往往对清屏有一些具体要求,如:开幕清屏;闭幕清屏;上清屏;下清屏;中清屏.为此,这里# N$ z# a' u" o- U5 t& O1 U

2 O9 I) W$ e) X! t& k6 n  用C语言编制了几个子函数,用于程序中时,既可达到清屏的目的,有能增加屏幕的艺术美观. 0 g, p" l, l8 L4 Y3 G
  子函数及演示程序:
! F9 ?5 ?' V! e. v5 j5 X2 A) C8 k! O. E, t9 |' E. X
  #include<stdio.h>
' c. P8 }9 q( P7 N# C7 I6 `  #include<dos.h>$ i' G1 `2 d! M: O1 ]
  #include<conio.h>
% ?7 ^) L! L3 a# Y( u4 A
* h6 ]; r( c( P: p  void goto_xy(int x,int y);" f; L- Z4 B+ v5 A5 S! n
  void dcls(int x1,int x2,int y1,int y2);3 F. a6 X* T1 V* x1 Y7 ]
  void bcls(int x1,int x2,int y1,int y2);
  L2 S5 x2 K$ r- v8 y* H  void kcls(int x1,int x2,int y1,int y2);! [4 |$ ?6 k% G6 j4 b0 a7 t
  void recls(int x1,int x2,int y1,int y2);; h1 F: b3 \9 ]' p. F" S
  void zcls(int x1,int x2,int y1,int y2);
3 a. A9 r* s* h% ^8 S  void puta(void);
5 _! P2 d" M3 q) l
7 _% o- C) y0 e% x4 L; t: I, E% h# E, _: Z+ o" N8 y# ~8 ~7 n" c
  /*--------------演示程序---------------------*/- k8 _8 a, Z( T. g
  main()4 e4 z2 g) Y4 k& B0 ~' A8 o8 ~
  {
/ d' N% m, f' {  puta();9 I1 _7 v& Y9 x
  getch();# O7 j/ ~, L5 Z) d/ v- k' e
  dcls(0,4,0,79);1 ^( b: G4 y: L0 M! T3 _
  getch();2 H3 c2 r, N; z$ h
  puta();
8 f3 J. u" e5 l' b. a  getch();- N. Z9 J- A* w2 }/ z3 J, k
  bcls(0,25,0,79);; V+ N( X8 @% Y, v7 P
  getch();0 X4 ^1 @! q. c$ S; N
  puta();
# ], F6 H' U) H, \, z  getch();, [& S$ E" x* }! N
  zcls(0,25,0,79);5 J" w+ k; ~+ |8 ~2 L, r2 w; T& ]# F
  getch();
; }9 |/ G0 O# t9 _5 O  }
9 O- v& ?6 ]. ]4 {& J" u9 |  /*********center clear screen(中心清屏)***********/
* ~9 r4 S: A% W9 H! U  void zcls(int x1,int x2,int y1,int y2)
. v6 ^9 V% ^% N2 p0 u$ v. F0 L  {. n6 Q) \  t: N
  int x00,y00,x0,y0,i,d;
7 m9 C7 i0 A4 Y( v: Q( ~5 v! y  if((y2-y1)>(x2-x1)){
6 q" [: o9 F( P  d=(x2-x1)/2;- n; K6 g& G" [: U" [. B$ v
  x0=(x1+x2)/2;
- C8 \  p+ i# F8 g2 m2 e  y0=y1+d;, P) d+ M6 ?1 S& ]# H
  y00=y2-d;
" B6 T8 G6 R8 L% X2 |6 f  for(i=0;i<(d+1);i++)1 B) n7 q2 Y: O, t+ H
  recls((x0-i),(x00+i),(y0-i),(y00+i));
6 _: C' m5 E; g9 U( {  ~" u  delay(10);
& r) ~# B, D9 z3 ]  }) k1 N/ _" n, x
  else{7 w+ N6 {& [: e& O) P1 N
  d=(y2-y1)/2;
7 W5 E4 e* b! C# S: G. `  y0=(y1+y2)/2;
# |8 f5 v4 F8 Q" p9 D! e$ I& o  x0=x1+d;! Q8 b0 E/ `4 r* N& a5 C
  x00=x2-d;
" q' F" F% k* r  T5 b+ D# o  for(i=0;i<d+1;i++)8 v( Z) m8 a3 s) {" i3 g
  recls(x0-i,x00+i,y0-i,y00+i);
4 v5 L$ Q$ Z7 K( i" d  delay(10);3 P' d  ^. K/ U9 ^5 v
  }
% E% e/ t0 o) f) l  }
. V2 J; k& l6 I' Y8 v8 R; a% c
" z- S9 i. b5 s- u  /************* clear rectangle side(矩形边清屏)***********************/
3 D4 E: I6 S) s8 d4 l0 g& _# U+ g6 W. y- V- l2 ]. e
  void recls(int x1,int x2,int y1,int y2)) Q; J  h# H* l6 z! r" n5 Y- d
  {# l: L8 U* B( a3 A' r, u+ f% m
  int i,j;
; i4 A) g6 M% l3 B& G/ f$ s  for(i=y1;i<y2;i++){
: r4 F9 E- Q0 D( b    goto_xy(x1,i);/ u* g  ~; P0 H0 Y% z2 k
  putchar(' ');
) C+ z- D  H; F  goto_xy(x2,i);
. ?1 R- C& a4 b  I) m/ d) l  putchar(' ');
9 c$ q0 n+ L9 ?! X+ f& q0 o  delay(10);/ j' ]9 {  w# |: H
  }3 ]2 W. l/ p9 T7 V) ~
  for(j=x1;j<x2;j++){1 E; e1 F: [0 u$ G
  goto_xy(i,y1);
+ Z/ i0 E. d8 q0 G/ A  S  putchar(' ');* i* I1 i5 O) s/ b! H+ A7 z
  goto_xy(j,y2);
1 [. G: G- R. r- O* f6 y/ }6 t1 N  putchar(' ');% C- }  Q7 D/ n! K3 y$ I, r
  delay(10);7 c$ V' y, f& g9 @8 p6 B$ G
  }' b# u. V) w+ U! p- h. v
  }
  x9 D* `4 i" |+ G$ B& ?5 }- Y  /******************open screen clear(开屏式清屏)*********************/7 ~0 H( c; A  _5 c* }) H$ _1 ]: n
6 g" K* d$ c9 R! S, u5 j
  void kcls(int x1,int x2,int y1,int y2)
5 M0 t+ J" L9 S: P  {
( W  j5 t+ ^3 H! A9 c  int t,s,i,j;
, x0 q# i# m: c; B6 q& k  t=s=(y1+y2)/2;
$ b9 }3 b# N& H2 Y) s+ x5 I7 p  for(;t<=y2;t++,s--)
& @' P. P1 x8 O  M1 Z( f  for(j=x1;j<x2;j++){! f7 ?! j# E) e, }& P
  goto_xy(j,t);
5 k7 ?; Y" h0 `: }0 a2 \6 ?) S3 b  putchar(' ');2 Z" S: L# I& Q2 u6 T0 b6 ^
  goto_xy(j,s);" L; E( v. @( n1 N( ]
  putchar(' ');
& B) H* ?# T" n. i  delay(10);9 B8 z( T2 `) ^/ A& A3 O
  }
& v! J. H& ~' ]) s2 g$ l$ V( L  }, v5 B4 S: P, P* O) L
  /*****************close screen clear*****闭幕式清屏*******************/- l" M0 p$ e4 \- g  s% X

- ^% d7 J7 k8 F4 s# _+ w$ x  void bcls(int x1,int x2,int y1,int y2), l5 _, |- J. h8 T
  {
; H' j- f$ R6 |1 @4 W, \  int t,s,j;$ n, T, T$ m3 P
  t=y1;* c0 w8 [) O" p- _1 x
  s=y2;
- C9 l# o% }$ p) L6 Q  for(t=y1;t<(y1+y2)/2;t++,s--)
) |8 T6 A: D) ]/ i8 G. ~  for(j=x1;j<x2;j++){
- r3 _, @, C1 {& z* Q& X  goto_xy(j,t);
3 N4 B' |3 ~% v! L  putchar(' ');1 E5 \  }& a& s; K! @
  goto_xy(j,s);
+ `) B1 K% T- \& J5 M  putchar(' ');
! E$ ?9 n: ^/ L8 A2 Q  delay(10);
7 _9 h' w$ f8 b9 e* t  }# c; t) t/ k% A( o2 b+ |
  }
, X4 Z9 c. J6 |- y  /******************bottom screen clear(自下清屏)********************/
& b2 J/ Z4 H2 B% X; p* S5 J8 {/ Q5 _6 v; N: q7 ^! S/ y* ]+ d
  void dcls(int x1,int x2,int y1,int y2)
' U* l/ u; D8 `6 Z4 P* @  {
4 x8 [! C6 ^! A- w2 l  int t,s,j,i;
: ^; n; Q/ v: o, j8 g8 o8 A  t=s=(y1+y2)/2;
% i% w6 m) L% P2 x. F3 v: {0 Q. `  for(j=x2;j>x1;j--)
1 `# C/ z8 [3 {+ k  for(i=y1;i<y2;i++){% }0 E+ C; i5 w" F( ]
  goto_xy(j,i);
6 ]' Z* _1 N* j% Z) O8 t  putchar(' ');( F- I0 r, a1 r+ W
  delay(10);
- s" j, z! y' |+ k4 l7 d7 A  }, H, A* z6 [+ G, C2 }, a2 \
  }
2 X% }6 @; r1 B$ x$ P2 h# m4 T  /******************设置光标子函数******************/# U$ m- E  @: N" y, ]

  T, }  h1 {. T& N) ^! l  void goto_xy(int x,int y)3 q8 {& P; C9 ]
  {1 M/ d& ~4 ~3 X. p$ E- V6 K
  union REGS r;+ ]' R/ K9 `, H- a: `' g5 I
  r.h.ah=2;) s' R6 h3 b: W" I
  r.h.dl=y;. h7 |3 d$ p$ f* a$ }, q
  r.h.dh=x;, i; j: x! a; B& _
  r.h.bh=0;3 T( T1 M$ q1 e4 C. m9 R* l
  int86(0x10,&r,&r);
+ C$ ~$ P2 H8 ]/ g0 V6 l  }* }3 T! @% }& C" ?
! B) ^; [- Q/ F
  /**********************在屏幕上打出一连串的a字母用于演示程序******************/
" Y/ ?/ I, e; Y* k3 o# P+ |
- |, E7 S5 h: Q, c8 {  void puta(void)
: g2 S+ @# b: {( ?7 K  {5 [6 P, t7 ~; Z6 ~1 {& e5 g
  int i,j;9 S; p2 \9 n: L5 m. t) `: S
  for(i=0;i<24;i++){8 R8 S* G4 m/ D* J
  for(j=0;j<79;j++){
9 ~, _! c9 K1 M4 h% Z! U  goto_xy(i,j);9 n- ~1 \! [- F8 d
  printf("a");. f! b% E6 ?3 M' R* b7 A
  }
) [7 n( {8 i5 m0 i% a3 I2 N  }
4 E; ^/ Y5 H' p& |. }  }

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