返回列表 发帖

C语言艺术清屏

问题的提出:我们在编制程序时,经常要用到清屏处理,如dos下的cls,Turbo C下的clrscr()等都具有清屏功能,但这些均为一般意义的清屏,3 ^7 y5 \- j# g5 r

( x, l1 U* l0 K4 W  并未显示其清屏规律.而有时为了达到清屏的艺术美观,往往对清屏有一些具体要求,如:开幕清屏;闭幕清屏;上清屏;下清屏;中清屏.为此,这里" K& S8 h* R: O3 U/ D
9 k6 t7 E- v2 v' r% O5 R7 `
  用C语言编制了几个子函数,用于程序中时,既可达到清屏的目的,有能增加屏幕的艺术美观. 5 V5 B1 d7 C6 `2 }2 |
  子函数及演示程序:1 H9 F8 h& S* S! E" ]

3 m% `# w5 E1 B  T$ U% \  #include<stdio.h>
5 l" z* M: ?, v, D1 M  #include<dos.h>0 j1 J5 n- h% ~( C5 S2 @  o
  #include<conio.h>& L2 Z6 y2 f2 b$ T9 F9 }
! F/ }( t) X1 }: L- l  v! G3 T
  void goto_xy(int x,int y);
3 t% T. L! T: d) A% V& N5 u  void dcls(int x1,int x2,int y1,int y2);
9 c2 E0 z2 U2 m  void bcls(int x1,int x2,int y1,int y2);
4 x; e: d! i0 ~' R) y  void kcls(int x1,int x2,int y1,int y2);3 `% {' k3 a& u) X+ T
  void recls(int x1,int x2,int y1,int y2);
. R; f# K( d- z- j& D  `6 C  void zcls(int x1,int x2,int y1,int y2);
5 j. E% G4 H9 k: n( p9 C# F3 D  void puta(void);
5 s, b0 n1 B+ N# K+ `$ E/ B3 F

3 f  i2 }3 |% f% j2 _  /*--------------演示程序---------------------*/
4 Y( M& e* N' L; F( z: y6 M6 q. j7 R  main()3 ]5 ?" ^' Z5 `; v3 N
  {
! \* y* T0 }6 o7 y1 T$ R  puta();0 P3 Y* ~6 u3 o$ r- T; X: L% d/ _
  getch();
: ]5 Q6 p; m* `' I8 Z* A  dcls(0,4,0,79);" M$ Y' |: R/ R0 t( _# n
  getch();
/ T4 M. i  h3 ^2 |  puta();
' X0 p5 G6 ?% d; h. z  getch();4 _0 D- ]2 X; I( `( @  G
  bcls(0,25,0,79);
  t" K& x$ @' A0 D  getch();
% n& @' f/ k" e* j  p' v5 h4 k  puta();5 Z( z. ~: o+ s: b9 `5 y
  getch();$ k+ `1 J- Z# C. d
  zcls(0,25,0,79);) ^' ~8 i0 n% C1 E8 z7 j
  getch();* Q+ W4 J5 |. c/ q4 o0 q
  }
8 a+ ]# A0 g' R* @$ T5 L% ?) x  /*********center clear screen(中心清屏)***********/
' M! V7 m% z' k( p: V  void zcls(int x1,int x2,int y1,int y2)
  _' v+ R+ }. B$ o" K  {
. o0 B$ ~+ K8 d+ H  int x00,y00,x0,y0,i,d;: l  Y/ S, a! E8 r; w% W" B
  if((y2-y1)>(x2-x1)){0 ~# u+ B& \2 W) I& `, |* `+ b
  d=(x2-x1)/2;
# I3 w/ Y9 h5 C6 b* A4 u  x0=(x1+x2)/2;
5 n4 E: R$ o* }! K+ i2 i' w7 O( o  y0=y1+d;1 p# b7 c2 Y% B& ~7 |& F  V( S& Y
  y00=y2-d;1 o* n1 @4 Z1 T1 V/ E: U
  for(i=0;i<(d+1);i++)
2 X% ?3 V& |4 e: M1 i' C  recls((x0-i),(x00+i),(y0-i),(y00+i));
0 t' C) k3 k$ U  delay(10);" x& e: h3 d+ \6 l4 w, K
  }4 o' n6 Y2 y8 K5 r
  else{6 ?: m' G: j3 r, m' w* k5 m- n
  d=(y2-y1)/2;0 y8 Z4 o1 g, b& ?% P5 i, @% h7 h
  y0=(y1+y2)/2;( @6 \- c1 V$ U7 x0 R
  x0=x1+d;# ]  ^' B1 N8 g0 V. Z  `  V
  x00=x2-d;
, O, W! g7 }8 _% V! E  for(i=0;i<d+1;i++)# w9 T5 q9 q, y- o
  recls(x0-i,x00+i,y0-i,y00+i);3 |1 Z- \+ R$ N! O& D, m/ ~2 ^5 v* o4 p
  delay(10);
, r( C; |' p; S1 q5 q# L2 b1 R, b  }
+ J4 I4 f, S( h  }4 G+ L" T7 ?+ X+ B0 k
+ q) X: z: R- Z% U/ @4 }+ n; R4 G
  /************* clear rectangle side(矩形边清屏)***********************/0 [0 Z* y, S% W' f
4 l( S! W) ?* d9 c
  void recls(int x1,int x2,int y1,int y2)
4 u# L* W7 _3 G/ I  {" W. \: v' t4 O9 A
  int i,j;: P/ C  o( R  |+ u
  for(i=y1;i<y2;i++){7 r( y6 ?" T# z  _  v
    goto_xy(x1,i);
& ^2 @5 y4 [9 K( i9 `4 R  putchar(' ');
5 }/ i5 d2 |$ p3 G1 s# J  goto_xy(x2,i);
' Z( H* R. Z/ |# j3 z+ B  putchar(' ');
' Z7 W% e+ `+ }5 M) q4 K0 q  delay(10);* ~) a: ]. Q% q/ c6 x$ S$ n
  }
  c& A5 Y% U6 m; V8 W( h  for(j=x1;j<x2;j++){
% l6 o+ t: ?! _+ D8 V, l# m  goto_xy(i,y1);
, j" O9 i7 y% `6 }7 o& R9 O  putchar(' ');
3 J) l9 Y; ]+ o+ H( Y+ T  goto_xy(j,y2);  S# }0 T9 o7 U: P, H( S5 P
  putchar(' ');
" z- Z6 T3 |, N, ^5 B7 v- V7 n3 m( Y  delay(10);1 d( v- d; w  c" P
  }( D5 ]7 G# b( E4 @
  }
! {: k# G# Z  h2 j' I  /******************open screen clear(开屏式清屏)*********************/% X; t% x4 G2 k! c8 [

! m  u7 v1 M1 C9 Z/ w/ d7 w  void kcls(int x1,int x2,int y1,int y2)6 Y& E8 j% u$ }' O+ f
  {
8 {5 S/ r# K2 M- T9 L) T  int t,s,i,j;
6 ?3 E% m* n$ j+ T  t=s=(y1+y2)/2;
7 r1 {# e1 T% a9 u: s& p2 Z  for(;t<=y2;t++,s--)
0 |! p" C5 g- G  for(j=x1;j<x2;j++){9 N+ @& w: K$ g
  goto_xy(j,t);
6 D) ~4 n& M' w: g7 y% S$ x  putchar(' ');" c) V$ c3 q8 z5 x2 k/ G
  goto_xy(j,s);, v) I" ^/ C: Y+ a, P# H
  putchar(' ');
% s, q' m) v& P& S# w: m  delay(10);3 k: E1 q+ U3 F$ {, s) P( f
  }
5 I) d& f! ?  s& F7 ~  }9 n4 O4 I2 Q. ~: t" n
  /*****************close screen clear*****闭幕式清屏*******************/$ G) N: c+ ]# r: [1 s0 F
% `3 R# I6 G, d# D8 x0 l
  void bcls(int x1,int x2,int y1,int y2)1 ?' ^. f4 K5 P% U: @+ o
  {7 @0 e+ n( `2 ^0 L& r9 L" h
  int t,s,j;2 V' }" E: A- b! s. b& Y
  t=y1;
7 e6 P6 Q' _9 B  s=y2;9 L3 x3 r' Z3 q/ f
  for(t=y1;t<(y1+y2)/2;t++,s--)
5 x+ @$ C" @- c- q6 f; L. e  for(j=x1;j<x2;j++){# ]' c# Y. U7 }6 }
  goto_xy(j,t);% p1 [% _; m5 Y1 R+ d
  putchar(' ');
5 K. e+ A5 {, A! U- K. _  goto_xy(j,s);; v5 P$ V% b1 J
  putchar(' ');0 H  g* a$ F  ~- P, ~2 q
  delay(10);
% S* |9 g4 W" M' V# i* Q  }
2 U- h& e* K, q& \) Z6 Y  }
; @& R! z' f( o# K( V+ K  /******************bottom screen clear(自下清屏)********************/% S2 K$ _: G1 ]

- P$ M8 @. H9 [& F" @  void dcls(int x1,int x2,int y1,int y2)! W) ^5 Z/ f# p  t7 M
  {
2 u8 y; ^3 `, b4 H& ]  int t,s,j,i;* S1 j8 q. B$ f6 _5 l# I
  t=s=(y1+y2)/2;
% v' `& p) U- T  u; J4 p  for(j=x2;j>x1;j--)' @& @7 {  S  }$ I/ d: o! ?9 B" m
  for(i=y1;i<y2;i++){
; w7 z  `# r" U0 y$ |; [  goto_xy(j,i);  F' t' Q" Y0 E6 g
  putchar(' ');
4 P4 `/ T( ?* u  delay(10);
- n. B4 g: N/ p  v7 m, V* ^  }
" M% j+ I2 X, f  }
+ N* {' t& P& N& t  /******************设置光标子函数******************/
8 j- z; \! g  I* \  k0 J8 O5 X1 ~! t' j( b
  void goto_xy(int x,int y)
' G9 p5 ^1 U( A5 Q9 Y  {
3 I. m8 W9 T* j% X6 r0 B2 f  union REGS r;* X+ U9 w/ H2 j" o. O# T3 z
  r.h.ah=2;7 ~' J3 n& G+ v9 P  _
  r.h.dl=y;5 n" w* \7 W9 }
  r.h.dh=x;
" \! V9 i0 i% \3 i) P8 s; k  r.h.bh=0;0 y. C/ e7 M) L$ ~" h+ N$ w
  int86(0x10,&r,&r);
- U9 a  @' Y! v. x2 q+ @1 I  }
1 l) g/ J3 ?3 q+ |2 Q$ F$ ~, q2 G1 ]! p) P0 ^* P
  /**********************在屏幕上打出一连串的a字母用于演示程序******************/
* |% `. d, a4 s% a+ T4 q" w0 Y/ p+ Y
  void puta(void)8 b0 o: G0 Q* w: j
  {/ E9 u. g$ `. l  C& e
  int i,j;
5 S$ q+ C# s; R/ ]  for(i=0;i<24;i++){
$ S6 V+ [  X. z' @; s- d" ]5 U  for(j=0;j<79;j++){- n8 M6 s' B+ s4 b% E
  goto_xy(i,j);
1 J; b4 A: u. e3 g( O- p; b; ]  printf("a");( N' d2 s8 J8 Y
  }
3 N6 ]8 M' X/ w1 m3 O% e2 F: h# h  }) @% f8 X8 m- w* s' o
  }

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