返回列表 发帖

C语言艺术清屏

问题的提出:我们在编制程序时,经常要用到清屏处理,如dos下的cls,Turbo C下的clrscr()等都具有清屏功能,但这些均为一般意义的清屏,
3 s: [3 J  S4 x7 v
4 T) y+ `( d9 W0 K& a( y" L  并未显示其清屏规律.而有时为了达到清屏的艺术美观,往往对清屏有一些具体要求,如:开幕清屏;闭幕清屏;上清屏;下清屏;中清屏.为此,这里; P+ D* S; p: `! H0 a' t; o2 m

6 T* H5 A% E* S1 Z  用C语言编制了几个子函数,用于程序中时,既可达到清屏的目的,有能增加屏幕的艺术美观. $ a: T" w! |) ?( s8 K6 j3 Z2 e
  子函数及演示程序:
$ p3 J5 ?! F7 r: U( Y
: O( V" n# }5 r2 U. I" w5 y  c$ X  #include<stdio.h>* G! t* R; g$ x4 E
  #include<dos.h>* b8 F: k- x" P
  #include<conio.h>2 B2 A2 Y/ C! o2 W  Z3 ~0 K/ V9 r$ s

( u5 I# g# Z. N/ S9 e' D5 y  void goto_xy(int x,int y);
7 t/ J5 n" t+ k  I  void dcls(int x1,int x2,int y1,int y2);
' u: p' I" o9 R' E" ?* P7 e  void bcls(int x1,int x2,int y1,int y2);
: Q# W& b" H& K5 Z& `( l  void kcls(int x1,int x2,int y1,int y2);
& g3 u1 L% O/ D) Z  void recls(int x1,int x2,int y1,int y2);
. S% k- ~0 ]! v  void zcls(int x1,int x2,int y1,int y2);* l9 B2 {' ]; q" E
  void puta(void);
! X- J0 Y8 D+ j3 m" O, M* d: c# _3 |* Y' x" x

; `- H; o$ _  x. N8 [, d0 P) j  /*--------------演示程序---------------------*/
6 j9 k7 J8 f4 z$ Z1 r) {9 f( x) O  main()' P& s4 p8 t- p7 j; i! G+ P
  {0 F! }0 g' h! \
  puta();
2 d; d, j8 H0 x; R! M  getch();3 A0 X; r, L5 _- V
  dcls(0,4,0,79);. a7 b7 W4 {  c3 x9 i( L1 A
  getch();
3 u7 _+ X1 ?# Y, k4 n7 O1 _# Y3 M- X  puta();
" w( G3 p; c: k, y3 H  getch();. D6 o- M1 p, T% ]
  bcls(0,25,0,79);
" j4 G; l( Q6 o+ u* [/ o9 R  getch();
5 v: S5 d9 S7 n  puta();9 W# k' ~, _$ g, G% ^
  getch();! [! I; n7 R( H( i
  zcls(0,25,0,79);
. @# M$ u9 y. Z6 I: `+ q" v8 E  getch();
0 e8 s$ X$ O8 ], E8 d6 V/ _  }3 T6 `) _3 @3 Y) w! P- b% l
  /*********center clear screen(中心清屏)***********/
% t2 Q. \& A9 w9 c" t  void zcls(int x1,int x2,int y1,int y2)
! f& f6 V7 F. R" {  {
7 J$ P" \/ l3 Z% K8 z  int x00,y00,x0,y0,i,d;
) }0 c) A* |1 Q  v" a+ F  if((y2-y1)>(x2-x1)){% Q1 a1 y: f6 j4 S9 k
  d=(x2-x1)/2;# E3 y, f7 G. U) \
  x0=(x1+x2)/2;
7 G; B! j2 L0 _$ f, m, V5 X  y0=y1+d;& {1 _5 ^# F( c4 n+ r6 L9 n
  y00=y2-d;, e3 c' n7 R+ o. I  m4 O
  for(i=0;i<(d+1);i++)
6 \2 P" d/ m* W' B  C( D1 @3 ^  recls((x0-i),(x00+i),(y0-i),(y00+i));% x) G1 U/ x& i/ K' q0 J- z
  delay(10);4 m" R! O! `! E2 c
  }
6 ^, t4 y4 B* J  ~8 r8 i/ Z  else{6 q7 m( ?5 v9 B
  d=(y2-y1)/2;
3 h# d& s4 ]$ g1 E2 A7 X1 u4 j  y0=(y1+y2)/2;; X. `' d; K5 M3 w+ i$ F. C1 y9 F
  x0=x1+d;
; {6 o4 g$ G' W' K) A  x00=x2-d;
; A. U. m7 U' _" q  for(i=0;i<d+1;i++)
2 i! \8 _$ g3 R* Y! n" y  recls(x0-i,x00+i,y0-i,y00+i);( ]$ _8 O1 w6 M
  delay(10);" o1 q: A1 z7 G0 q  F1 M
  }
  w% X: V$ z3 G! g1 \  }2 w) M) q3 U! |& O6 E3 m, K

( }  C- e5 i4 i) `5 r6 g  /************* clear rectangle side(矩形边清屏)***********************/
2 ?/ x" h( y* S+ q. O8 b/ U
$ J6 F# G! s! n2 ?) M& o  void recls(int x1,int x2,int y1,int y2)0 ~( c- o1 V7 J! \
  {
) m# K% x9 h" O  int i,j;& J  S! q9 K, ]% i, S- m
  for(i=y1;i<y2;i++){
) U: k1 g& y9 A. W/ n1 @    goto_xy(x1,i);' p( [: [6 B6 w$ Q: ~8 V! L& r7 O
  putchar(' ');8 D' ?* Y/ C9 Q8 |: E  u
  goto_xy(x2,i);  z0 f2 a0 L! C* r, \- H" A
  putchar(' ');
- N' P: G9 G5 L$ ]  delay(10);( Y+ b( W, c) L
  }, ]- O& P$ a2 B  Z7 c
  for(j=x1;j<x2;j++){# N4 ^, X  z5 t2 Z
  goto_xy(i,y1);
3 V2 }5 V* B/ G' R1 i% E- D, B  putchar(' ');: p! b0 `) e$ W& x. |1 E
  goto_xy(j,y2);* D$ u8 ]; s; P$ }" C
  putchar(' ');
% h' ^" J# t& ], T  delay(10);/ o' p- k7 o" N% A  K; J
  }; \$ _7 ?- S& ~( _$ G5 ]+ b0 M
  }' n6 z& B( |8 t0 i* h
  /******************open screen clear(开屏式清屏)*********************/
; g5 Y$ U# Q8 q7 J( k/ @% ?  i/ @: t, [+ W# S
  void kcls(int x1,int x2,int y1,int y2)
0 _9 S( z4 v7 X$ J: [8 |, e" X  {/ D2 T5 X! b; ~- m  Y' C
  int t,s,i,j;
; ?. u, C1 H) F: D2 q  t=s=(y1+y2)/2;
& e* p# D( a/ E, g( j  for(;t<=y2;t++,s--)$ t3 w( \' d6 ?- t
  for(j=x1;j<x2;j++){- Q$ z8 T/ ]% C5 D
  goto_xy(j,t);
! T. k0 Y& t8 b  putchar(' ');
2 X) r0 W4 \- d% w/ j: ~+ q  goto_xy(j,s);) Q& H9 U0 P: K
  putchar(' ');
$ ^0 J7 v. M% f  delay(10);7 ?0 O& _. B$ }7 u
  }7 |1 f7 E8 e/ t
  }8 Y" O3 g4 T2 i, s5 A+ n
  /*****************close screen clear*****闭幕式清屏*******************/
2 S# V4 q3 w- a8 N* E7 o
" n# s, Y8 i/ u- m* G, A8 V  void bcls(int x1,int x2,int y1,int y2)+ e' P8 c9 E' z; Z  e
  {% V, L" T4 L! K
  int t,s,j;
1 q# f! v8 h& Z  t=y1;8 S- v- D3 ^% b  L" R1 ]( A
  s=y2;! e* [2 d! G7 y" b  n2 d
  for(t=y1;t<(y1+y2)/2;t++,s--)/ d, ~) n& h2 Q7 N1 z
  for(j=x1;j<x2;j++){
, x! G) ^' I4 g) I3 t; t  goto_xy(j,t);
8 z/ [: O3 h& G# A" t  putchar(' ');7 q3 I! G2 N0 W; g3 s
  goto_xy(j,s);) ?9 S, A4 _) E+ h
  putchar(' ');
) j! Z9 N8 V3 M" r2 C% @: ^  Y  delay(10);
9 ?; ^% T& u) Y/ \, l& @$ K  }
& H; s5 P. o% e4 _$ ]2 H  V' b  }
- T( O" R  f( w: r5 W  /******************bottom screen clear(自下清屏)********************/1 F( |# ]  C% }0 @$ Z1 A5 d
3 [; [* o- W; M+ q9 W1 y2 Z
  void dcls(int x1,int x2,int y1,int y2)
) ^) B8 j' J) u. n. n2 e  {
1 x0 b! C, q. O2 B+ r" \; D  int t,s,j,i;
6 E" d4 Q2 p( E$ ?  t=s=(y1+y2)/2;
6 ~1 G9 H9 ]. a3 B  for(j=x2;j>x1;j--), v6 S$ t5 }1 q. c8 G$ P
  for(i=y1;i<y2;i++){' N' x0 S% |6 q* [3 i8 B( X. l
  goto_xy(j,i);
3 `5 u4 e  o0 J- s: j: j5 p  putchar(' ');1 P( Y, m6 f4 U6 j
  delay(10);
' u0 w8 Y: v$ \  }
( j4 S% V; A  M. r7 ]  }9 @# u4 I$ l, e, c( Q2 {
  /******************设置光标子函数******************/, T3 _) \/ P% H, i. J2 g  z
  {1 n' e) ^; U
  void goto_xy(int x,int y)
' j* I9 s  y8 w5 K" D  {' z9 l5 {+ v. ~1 F3 t4 @8 y- U1 v
  union REGS r;; I5 P, u+ V& }) Y! y# a; t- ~
  r.h.ah=2;2 f  ^' C6 |* z# b/ t. M' c
  r.h.dl=y;; p+ p( P0 [0 B+ s% J
  r.h.dh=x;
1 ~% ?# f4 A: G+ [0 i  r.h.bh=0;6 k- a: t6 q. g' [" b9 B: \
  int86(0x10,&r,&r);7 h* E. r0 c* |1 M5 I+ K
  }  h+ I) @& F& \! V

/ ~# ~4 u8 X& H7 P  /**********************在屏幕上打出一连串的a字母用于演示程序******************/% r1 \* h) Y& f, Y" B% K: A2 u

) y; ~% Y% E4 C2 t5 D. k  void puta(void)6 H, {$ f) g5 O0 ?5 i) j% D
  {
3 h0 g8 {. b0 f  int i,j;& E& b5 w7 r9 m1 C0 f+ Y
  for(i=0;i<24;i++){* @# b# K, u8 W4 d$ ?
  for(j=0;j<79;j++){
& [% o+ S5 m& m0 I  H* D+ \0 |8 M  goto_xy(i,j);) h5 `( f$ s! C/ f
  printf("a");
5 @  m7 A# o1 [  }
8 V' |1 u2 t: I  }/ f8 a, P& ?( l8 j* Y0 l! K
  }

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