返回列表 发帖

C语言艺术清屏

问题的提出:我们在编制程序时,经常要用到清屏处理,如dos下的cls,Turbo C下的clrscr()等都具有清屏功能,但这些均为一般意义的清屏,
6 z3 c2 h' z, r! n+ [0 z0 o3 u
, I) l! Z: e) h9 h7 Q: c* h  并未显示其清屏规律.而有时为了达到清屏的艺术美观,往往对清屏有一些具体要求,如:开幕清屏;闭幕清屏;上清屏;下清屏;中清屏.为此,这里" B( ]" B; S& N  x4 N9 S( w; c

1 h3 E% E" k( t4 S6 t  用C语言编制了几个子函数,用于程序中时,既可达到清屏的目的,有能增加屏幕的艺术美观.
1 m3 U7 O# T1 ~9 ~  子函数及演示程序:
0 n( x1 y3 R+ n, {. q9 W
8 m) z! f* B  v1 X  #include<stdio.h>
  X2 X! p% L; c) t  #include<dos.h>
8 q. Z7 y. T% o/ U$ B) K8 r  #include<conio.h>1 p' V; s5 ~' P$ F

; k/ r2 g, \( P/ e  void goto_xy(int x,int y);/ `' o: ]$ z* Z( o
  void dcls(int x1,int x2,int y1,int y2);9 _% J% c: l/ B% k! o: `
  void bcls(int x1,int x2,int y1,int y2);
. @+ j6 K- m8 R% G: d" g  void kcls(int x1,int x2,int y1,int y2);
% U9 x; ~- x2 \9 u& {# P* E2 B  void recls(int x1,int x2,int y1,int y2);% Z. N$ D% y& m+ s4 b4 l/ m/ X
  void zcls(int x1,int x2,int y1,int y2);
7 N6 J0 m6 k. S; J) G! ~1 i  void puta(void);2 r1 K7 h) L- E2 O8 b
- K- s5 @3 e5 X

9 ], h5 z! q+ Q* d* o  /*--------------演示程序---------------------*/
3 I3 u, Y$ C# \' k2 P5 a. G/ R9 W  main()' M- \6 Y+ f- O- A+ k/ X1 y* P
  {" x4 A- y& J; a7 M5 w$ e
  puta();" j' l2 ?9 z8 S+ z9 N, z& o
  getch();
1 ~' D' L: @  c2 F. A  dcls(0,4,0,79);
4 V4 V( @& J+ ]0 C  getch();
& _$ Y( n8 l' r2 h5 V6 l, C  puta();
) t$ j: U( B! S3 N0 h9 n  getch();3 w6 [7 w8 n* {7 c  z3 e8 T) [
  bcls(0,25,0,79);5 C2 Y4 x+ b6 _! I/ A4 ^9 G
  getch();
, D6 Z+ E1 T4 H6 I2 x5 H- l+ m9 d. p  puta();
/ \* P. t/ R6 ^  getch();
! l& V$ O, V, f% n; t  zcls(0,25,0,79);5 i! j9 j5 \- B3 K
  getch();3 J. j- E& r8 A
  }
# v' h- ^3 Q4 u8 X  /*********center clear screen(中心清屏)***********/+ r1 B7 }- r$ ]' w/ T+ }
  void zcls(int x1,int x2,int y1,int y2)
7 a& \  Q( A) ^8 @/ j  {9 [" a$ H5 ]6 K1 ^: X
  int x00,y00,x0,y0,i,d;
7 z4 G8 L- A0 w& M& |  if((y2-y1)>(x2-x1)){$ T. ^) D& g0 s: {! x  U8 @; q
  d=(x2-x1)/2;* c$ ~$ s( J/ n! i
  x0=(x1+x2)/2;) `6 b) I* x& s0 F# g. }& W$ |
  y0=y1+d;
% s6 U9 b9 ]6 _6 @  y00=y2-d;
2 ?+ v' ~# f! I# {7 ~  for(i=0;i<(d+1);i++)5 m+ m* t2 X) J$ b( `
  recls((x0-i),(x00+i),(y0-i),(y00+i));
0 u* ~& q; ?) w! t% Z3 u& @9 z  delay(10);2 c* d4 R, j$ @2 \! N, D
  }8 O4 m! g8 ]% |; ]9 Q! p
  else{
" y% y3 ^% A' m  d=(y2-y1)/2;
! T: V8 W& z3 L3 D% `( s  y0=(y1+y2)/2;
  `' q9 f) Q9 |- M  x0=x1+d;
4 T7 S; t; E) V% g  x00=x2-d;
! r4 i1 N, Y1 U8 V, o3 y  for(i=0;i<d+1;i++)
3 X7 L& D3 R  j5 v1 c, ^  recls(x0-i,x00+i,y0-i,y00+i);( A( E9 s" d* G2 w% h& q
  delay(10);
1 S* K& h8 i" t  }
* b3 ?% E, g5 F! r  }. F7 B; _  X6 S

0 o6 L7 T1 ?8 f/ S9 t" D9 Q  /************* clear rectangle side(矩形边清屏)***********************/
7 Y$ x9 ~+ c, o& M! ]* s( v/ d' b" [* Q& r2 K# S
  void recls(int x1,int x2,int y1,int y2)+ ]# a6 D  |8 \8 P
  {6 r* l% B- i6 T) a* p
  int i,j;% H* b6 x. _# i0 _
  for(i=y1;i<y2;i++){5 x' t3 b& Z& s7 ^* A
    goto_xy(x1,i);0 D6 W; m- z! b
  putchar(' ');  z! g# S" w: R9 m  E2 i
  goto_xy(x2,i);
( Y2 I1 \: K) S1 G5 X  putchar(' ');
; G: ^- x3 Q% _0 X, l8 S& R9 @  delay(10);
4 g, j& i# g1 t- M! o3 N8 ?  }* h. ?% ?8 T0 f
  for(j=x1;j<x2;j++){
" L+ S& \# {3 h: _5 j" ?9 ]  goto_xy(i,y1);6 I0 _9 x& F  n  m
  putchar(' ');
, [* V9 y9 r7 d. S7 |& P  goto_xy(j,y2);& q; c% }) G7 |2 y
  putchar(' ');
9 {3 Y( ]2 p3 h  delay(10);
$ n) R9 C0 r9 y2 c$ H  }  f, e) `; M. R
  }
% \4 G! @) p) g( {  /******************open screen clear(开屏式清屏)*********************/8 K# B  M6 Z3 M5 H+ w- i
# |$ T* H$ w. i
  void kcls(int x1,int x2,int y1,int y2). U0 D1 p$ G. k6 P: R4 [  U% C
  {5 s  F9 R* v7 m: U: t
  int t,s,i,j;- g& x* k0 o6 \+ X0 K
  t=s=(y1+y2)/2;
+ ]2 x* L, e; d1 g  }: A* z8 t7 p  for(;t<=y2;t++,s--)
4 i  w# m5 l( _- H  for(j=x1;j<x2;j++){
+ }8 P9 y+ a% @7 N% `9 O  e6 `  goto_xy(j,t);; C' o0 c* Q/ A- j/ I
  putchar(' ');
+ q; G# u- N2 g- Q9 K: K  goto_xy(j,s);
% D+ \3 _3 [! N2 Q+ i( x  putchar(' ');
9 E. D& E- l$ i1 k$ X) I  delay(10);
) P2 U) J& m# g$ o5 s. ?  }
5 x+ z0 H( q$ {, E$ Q8 j  }
1 v$ T3 u7 K) g* |) j  /*****************close screen clear*****闭幕式清屏*******************/: [6 T/ G8 }. o4 Q8 i: J5 b, c

1 }* A% N; l( d3 x' x8 p- L  void bcls(int x1,int x2,int y1,int y2)0 B+ J3 w5 h$ ]) s
  {' X( l1 o9 Y, s/ I: z! G; k% g
  int t,s,j;
- w) L& [6 w- f0 G; {: U# t  t=y1;
. p9 P6 M- _3 T) j  s=y2;' K$ b( n  h- l7 s
  for(t=y1;t<(y1+y2)/2;t++,s--)( _1 a) P! q5 H7 k: I1 G
  for(j=x1;j<x2;j++){1 H/ o% S$ q" K
  goto_xy(j,t);5 A+ ^- l5 `* J/ b6 V  k0 n5 ^
  putchar(' ');! f- Q0 m+ F4 B& `
  goto_xy(j,s);
% n+ U( v! ~; }/ Q1 x* h- Z  @  putchar(' ');# P& k5 H# F8 R  ]+ d8 x6 ^
  delay(10);$ `5 T+ @3 ?  r
  }) H, C& t+ Z3 [  B! m. L
  }
5 j5 h8 \; u9 [7 ^1 ?; k, e8 w  /******************bottom screen clear(自下清屏)********************/
2 s3 C; l0 ^2 K0 a1 P
3 c3 A; Z5 N' v6 b! b4 ~4 w  void dcls(int x1,int x2,int y1,int y2)# r$ Y8 A2 S' x1 p/ h& P
  {# t6 C4 |2 U) s! d
  int t,s,j,i;9 o  J0 o; U7 Z0 v# d
  t=s=(y1+y2)/2;$ S& j5 l+ s1 N9 C* T
  for(j=x2;j>x1;j--)
( m0 c6 d" V% h# [  for(i=y1;i<y2;i++){0 l( p& K; C* E9 |6 Z; z* _% M3 U+ @
  goto_xy(j,i);
/ x5 u3 o' i5 i, w. t8 I  putchar(' ');
" b  n+ h8 Z0 `! K1 c- r7 _  delay(10);
7 l3 f* }2 R1 ?5 p5 y. O( p  }5 x) q8 s, t" w# A/ L; X
  }
0 T( w: f$ g- I4 c4 ~1 G. ~+ a+ v  /******************设置光标子函数******************/# H6 t* Q; Y: O: a/ j+ _/ L- P

$ [! r  M6 z2 ?! {) o7 S  void goto_xy(int x,int y)  ^9 q4 Q2 b# h3 v" x7 J+ D
  {3 J% d' c- k4 z5 g. g, j
  union REGS r;
3 O$ h# {2 S5 x  r.h.ah=2;
1 m0 V* }( O2 H# s  r.h.dl=y;
# B7 Y7 B. E( k1 L  r.h.dh=x;) S3 Z  P. y# _, F1 `) Q# H
  r.h.bh=0;
4 E3 j$ a4 z0 }  l  int86(0x10,&r,&r);
& m: }, b2 B- B. Z& P  }' v1 B8 I8 r8 M: N

& ?, f4 O9 D6 F. _- U: J: U  /**********************在屏幕上打出一连串的a字母用于演示程序******************/
% K- p; j8 E4 m3 B% Z2 D0 E
* L# }$ ~- s" B; ]  void puta(void)  V5 _. s" s2 ~* i0 V- y, ]
  {  I8 p) c% y2 A6 d, q# i
  int i,j;' P; s- v. s# `2 p
  for(i=0;i<24;i++){' B0 i* |5 n( n
  for(j=0;j<79;j++){
% N  z( b! t0 Q. t# p  goto_xy(i,j);
$ l0 h3 J7 P! C9 B- a! F  printf("a");
9 N6 I& c1 z' K$ R" u- K3 F2 ~; G  }
1 D4 D0 [3 p2 y* O  }
! Y! F0 D: k* ~  }

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