返回列表 发帖

C语言艺术清屏

问题的提出:我们在编制程序时,经常要用到清屏处理,如dos下的cls,Turbo C下的clrscr()等都具有清屏功能,但这些均为一般意义的清屏,
# V( M# \! z" [/ x' e$ X- D% T) j, i
  并未显示其清屏规律.而有时为了达到清屏的艺术美观,往往对清屏有一些具体要求,如:开幕清屏;闭幕清屏;上清屏;下清屏;中清屏.为此,这里) N, g& {9 S0 s0 A

/ w* M% M7 v$ d5 T, x  用C语言编制了几个子函数,用于程序中时,既可达到清屏的目的,有能增加屏幕的艺术美观. , D9 d- {" H$ i; S( E
  子函数及演示程序:" f- N. F" X( J+ I  B# z

6 m* e9 A8 j* f# T# f6 I  #include<stdio.h>
2 R8 c* y& j: Y0 L  #include<dos.h>% L, z, O% }( B2 w) t5 r: ~  X
  #include<conio.h>& ^+ n4 E) t7 M2 J1 I$ W

" a# ~" D2 }. |0 {1 V  void goto_xy(int x,int y);" J! w6 b/ v/ ?% w5 |: M$ P6 @
  void dcls(int x1,int x2,int y1,int y2);" E6 u9 Y6 ]5 z" d$ W9 z4 B
  void bcls(int x1,int x2,int y1,int y2);7 g1 I& g* |8 ^. u, z
  void kcls(int x1,int x2,int y1,int y2);# ]. S7 x' t( S$ j
  void recls(int x1,int x2,int y1,int y2);/ c; `; a; g& D3 ?5 H) Z8 M# Z
  void zcls(int x1,int x2,int y1,int y2);
( |5 x6 E" E- b: r  void puta(void);) j2 z' ~: w# ?. m8 G

3 B5 F5 E5 v8 J" y' E9 D* ^
7 }' ?8 I* u7 |  /*--------------演示程序---------------------*/5 ~3 E8 l8 O2 q) g, T
  main()/ c! \, g' B& a( U; w
  {
" o5 R5 Z) [/ l9 K# N( h7 e  puta();: i& H; L9 B; M" v+ D1 `' x# r
  getch();
. ?3 @! `8 E& _; c" g! i6 @& T  dcls(0,4,0,79);
; K. f6 `9 W4 e  getch();
6 O7 n9 K4 m0 e. y- L1 A8 _" A) ~9 Z  puta();( e" p5 ?* w  w0 G% O4 p8 i
  getch();! i* D9 M1 J* J! e, ^% Y* L6 o; f
  bcls(0,25,0,79);6 r  K$ \- Q' g& k1 {
  getch();
3 M* T$ l/ g' u+ `$ V  puta();! C2 B+ y' I& q- y) ]
  getch();: X0 q3 ^7 Z% u( e; ?
  zcls(0,25,0,79);
5 i+ t# c0 c. V9 N8 S! C7 x  getch();
! P9 ~; l  \1 l  U4 A/ r  }; `. h8 ~8 \$ f
  /*********center clear screen(中心清屏)***********/
* E8 p8 u" f6 r+ j! }* Q& r. E  void zcls(int x1,int x2,int y1,int y2)8 E0 f0 |* H0 T- w# C) u( d
  {
: I7 o+ W/ u7 d4 ?* \  int x00,y00,x0,y0,i,d;
8 X( m$ z4 \6 y& u4 p1 m  if((y2-y1)>(x2-x1)){6 Q6 w  Z, I1 `. b
  d=(x2-x1)/2;
4 D/ S6 R+ e* b  x0=(x1+x2)/2;
" B  l/ b  O" U' `+ C! ~  y0=y1+d;
8 T2 Q" c7 u# l( I2 c7 t1 v- M7 C3 C  y00=y2-d;
" ?: }9 {  ^/ y9 d: z* }" r  for(i=0;i<(d+1);i++); ~* ~8 E& ^5 W+ U/ I* P
  recls((x0-i),(x00+i),(y0-i),(y00+i));, U$ u; i, ?, r
  delay(10);
; j( P0 J* ]/ y3 I5 @  }
, J; q! r) A2 ?  else{3 @6 ~& f) z6 b% d" L; j* A% Z
  d=(y2-y1)/2;
2 H$ ~+ q$ j0 ~* }' o  y0=(y1+y2)/2;
+ K: H/ P/ H5 V9 B  x0=x1+d;* K% k- ~# G* j& O! \% Q0 {6 L+ I( a
  x00=x2-d;
. D) x8 d3 |) q2 b2 A  for(i=0;i<d+1;i++)8 c  D' x4 S+ V3 {: }6 G) H
  recls(x0-i,x00+i,y0-i,y00+i);, C, I$ o  v3 N- g0 e9 [
  delay(10);
9 I$ w" n4 I; S2 d* e) r# w/ Z4 |  }
+ l# `& k( r6 E) _7 G  }
, l# x) {" x' X! W2 b' z2 S# E
+ s2 C& M5 e0 V' @  /************* clear rectangle side(矩形边清屏)***********************/! H/ C! a8 N2 }0 L
" K4 T1 b+ ]% _/ x
  void recls(int x1,int x2,int y1,int y2)6 R2 k' X) Y" o& }/ m
  {: L% ?) p, T7 }2 Q( d: i7 A7 r
  int i,j;3 D! S1 Y. Y. S' G3 a
  for(i=y1;i<y2;i++){
# p( G1 ^' z1 J' \2 q    goto_xy(x1,i);
8 m8 F1 p9 n9 P. n! H  putchar(' ');* s  ^# X, c, q) m5 y& Y' m
  goto_xy(x2,i);! ], X: T8 X" u
  putchar(' ');
- t) @: u3 C6 K5 q! D0 E6 S  delay(10);
1 V- W% M2 w- E7 Z* J! w: p5 p+ q  }
% f6 C. ]- A* ?( h9 c2 q0 l3 j  for(j=x1;j<x2;j++){
% J% c5 }  c. O% B3 s) x  goto_xy(i,y1);1 f3 v! S5 }& _9 ?7 r
  putchar(' ');
; Z2 J! I+ S& Z; n$ t5 V1 Q  goto_xy(j,y2);' d8 @4 r6 g* U# S
  putchar(' ');+ q9 M$ V% M; c/ V- ^4 I  P5 v+ {4 s
  delay(10);% C5 {3 O( C2 o0 ~
  }
6 b, h0 |- y5 t7 A% E# Y  }
1 J8 x* J+ s) w' }1 s  /******************open screen clear(开屏式清屏)*********************/9 Q+ I2 x, l! H  f% ^
$ J& j4 F5 b& Y" h
  void kcls(int x1,int x2,int y1,int y2)
. |5 ]5 f1 H9 A' v0 G; \1 E% U  {
  u+ @, f$ `3 F+ G  int t,s,i,j;. C( z- d8 Y' i% C( R
  t=s=(y1+y2)/2;
2 S+ X1 w- a5 k9 M6 `0 c+ X  for(;t<=y2;t++,s--)
  v2 [7 Q/ N( f' T1 ?6 l  for(j=x1;j<x2;j++){
. w- L2 b" p8 b1 b  goto_xy(j,t);) i$ j8 h- M) e3 Z8 Y
  putchar(' ');+ {7 ~9 j% B& C& x3 y2 a: V6 U
  goto_xy(j,s);
) D  W( }& V, Z$ Q) X3 s8 m  putchar(' ');" n  L# X% Q6 L+ c+ m. l2 q
  delay(10);: A* _5 ]3 y7 O& O0 c: h& a# t5 Z! B
  }* e$ `9 P( ?2 m4 U5 f' J' N
  }
$ P' ?& e, K: A  /*****************close screen clear*****闭幕式清屏*******************/$ c, `1 B1 c* G6 i. r! n) \4 _
" S6 |. x2 O8 |4 {3 b8 e
  void bcls(int x1,int x2,int y1,int y2)! h6 ^8 S( n. Y% |* G
  {
  I' s, R3 B0 B. I/ q2 ~4 _7 ]0 J& f  int t,s,j;6 y/ v/ S7 |3 B, x- N% d  l# k: D
  t=y1;) i% M* b2 h* J& U* _
  s=y2;7 i( s* C  A5 @
  for(t=y1;t<(y1+y2)/2;t++,s--)
9 f; Z4 W9 E( ?( j; M* A/ x6 I; K  for(j=x1;j<x2;j++){, K' r. k6 y9 N" r4 E+ X  w+ ~
  goto_xy(j,t);
; Q* a0 ^# r( z1 c1 r  putchar(' ');
. g8 W, q  q2 o1 y; f* s5 D  goto_xy(j,s);- X# C& l# s: f* c& r6 y3 D
  putchar(' ');- \3 o% a8 ~) h& A. {; {
  delay(10);
* i. l: ]+ C+ G" O, q+ A) M  }
* U7 O9 C3 T5 _4 W- X+ D  }
' w4 L( l; H; e* y& Y# k4 J* d  /******************bottom screen clear(自下清屏)********************/1 {( s& i# |9 I" G4 P9 p
+ ]* Y8 ~" B9 R) U2 @) f5 g
  void dcls(int x1,int x2,int y1,int y2)2 z' w9 ~  Y; l, g
  {6 J- c0 H2 Z( ^  u
  int t,s,j,i;
! Z: g7 n3 n; Y6 U  t=s=(y1+y2)/2;" @1 h' Z! z5 A
  for(j=x2;j>x1;j--)
) e9 _& n, c& p& h  for(i=y1;i<y2;i++){- j6 H# r; T; D
  goto_xy(j,i);/ T& T, H# p+ ~
  putchar(' ');
( J4 l; }5 E8 W$ R7 o) ]/ V4 ]  delay(10);
9 p0 g, k# i$ H4 v  K  }- O0 M* [# o6 ~4 ~1 S
  }% w; @  G, k; y( L
  /******************设置光标子函数******************/1 q0 U5 t  ]; o9 w  k

$ F6 E9 g  H; b# F) B- c! N+ {  void goto_xy(int x,int y)
3 ^9 E) t/ A$ ^6 y% y  {2 w6 R' h# H! J
  union REGS r;
; \3 z7 O; X( ], h  r.h.ah=2;3 m  A9 V) z/ n: M  A2 {
  r.h.dl=y;% ~: t3 ^8 {1 m- ~
  r.h.dh=x;5 z4 A" V: H/ c- k
  r.h.bh=0;: l# G- e9 C: p+ s* e& M. F
  int86(0x10,&r,&r);
( q. }6 Q9 e+ k1 e" }  }
  ]( L, q. ~' u* _
* e* @! c+ B: z# h1 p8 E# a  /**********************在屏幕上打出一连串的a字母用于演示程序******************/
: \! d6 D3 x4 M9 I" X6 m- \7 H0 V9 T9 N' |# z
  void puta(void)# q/ E& t2 U; n5 o
  {
( R1 m2 p4 o# ^( ]  u  int i,j;
4 @8 x9 s" A4 H% s5 x$ h' o  for(i=0;i<24;i++){
" _2 x6 f8 j  K$ V. I7 `1 S  for(j=0;j<79;j++){4 h, i& @4 I) c( \6 K2 c
  goto_xy(i,j);$ M8 F# B: ]- H
  printf("a");! T+ F5 ?; B- n. a  b
  }( f: l+ M0 M7 d+ H0 R( }! [
  }
' ]9 @, _8 w- m5 Q# c  }

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