返回列表 发帖

C语言艺术清屏

问题的提出:我们在编制程序时,经常要用到清屏处理,如dos下的cls,Turbo C下的clrscr()等都具有清屏功能,但这些均为一般意义的清屏,6 Q% v: r( W1 l" u
& Y/ u% |$ v+ f/ }* @" a4 K
  并未显示其清屏规律.而有时为了达到清屏的艺术美观,往往对清屏有一些具体要求,如:开幕清屏;闭幕清屏;上清屏;下清屏;中清屏.为此,这里
3 h. K! R; T: J' U
2 w$ k% t' F0 j, j0 |+ W  用C语言编制了几个子函数,用于程序中时,既可达到清屏的目的,有能增加屏幕的艺术美观.
: X2 w9 P8 H/ D  F2 p  子函数及演示程序:
# p. ]0 P# M3 \  t- `2 L5 ]9 q$ B/ H# p1 g3 V
  #include<stdio.h>) H; g8 a: A6 M$ c) y, m3 |% L: {7 U7 _
  #include<dos.h>
, G  R$ ~6 o3 ~; ^3 r, I, ?  #include<conio.h>
) i5 s7 g4 L8 K% W2 E- k
( y" K: J& X5 v4 {, S, ?& q  void goto_xy(int x,int y);
4 Q/ V$ C& A/ T" u: E; |* _  void dcls(int x1,int x2,int y1,int y2);
: N8 [/ @2 P3 J9 w+ e- X  void bcls(int x1,int x2,int y1,int y2);8 c( z; Q7 v  [( |- H5 Y1 _
  void kcls(int x1,int x2,int y1,int y2);: n# {1 h1 G# Z5 h+ d; J5 C: ~8 }( X
  void recls(int x1,int x2,int y1,int y2);6 L4 p& p' A# a3 @' [+ V+ k" d( [
  void zcls(int x1,int x2,int y1,int y2);! z# r8 ]6 l3 t0 U; P
  void puta(void);6 L0 u  I9 e) o, B8 D. I
# U% }# q4 m9 H1 F

) A8 }) U8 h& c3 K7 Y  /*--------------演示程序---------------------*/0 m( X% F! K& z* w- q1 _
  main()# i0 _% x3 v+ m0 W' Z+ e. N- L
  {; b1 ~. m4 A6 `2 e% w5 }( ~) n
  puta();
6 C; s* z' ]$ a( S- Y# C; d2 Y* N" W: L  getch();, f2 F6 ]. G; L; j
  dcls(0,4,0,79);% t$ S6 E& F) _! T3 i8 l
  getch();
% L5 C7 Y. ~+ ^( B  puta();
6 D8 \# D6 p; ^$ n0 @: h  getch();. c* a( x+ u; s- ?9 w( J
  bcls(0,25,0,79);
$ b0 _4 m! K) P- ~* r  P  getch();# u8 X3 n) \; S9 \2 e
  puta();
* y; V7 \* x( x/ d/ q. |  getch();5 z; s- H: [2 L* K. j
  zcls(0,25,0,79);2 q- K' [, e  s4 X! I* J: b
  getch();' G. t2 D$ t, x) W3 Y
  }
' ]/ A2 e+ i+ K5 J$ B  /*********center clear screen(中心清屏)***********/0 T9 @9 w! V2 p/ y
  void zcls(int x1,int x2,int y1,int y2)* m+ S+ L) O- g  o
  {0 x& I8 t5 K- E6 X" d9 z$ y; u% {
  int x00,y00,x0,y0,i,d;
6 l( H3 E. `9 y  if((y2-y1)>(x2-x1)){
% [* N5 }: ?; s/ [/ C  d=(x2-x1)/2;
6 Q6 d+ N% H5 B' _% V8 M  x0=(x1+x2)/2;/ R. x7 m- t: t5 @5 y& L
  y0=y1+d;$ k7 K) r( q, @+ R6 Q( C5 W  B5 f4 V
  y00=y2-d;( m# M' d, {8 \2 o- \
  for(i=0;i<(d+1);i++)
; ?& b% ^! Y5 L) {3 H+ C: ?1 H& f  recls((x0-i),(x00+i),(y0-i),(y00+i));
- P! ~: S8 ]9 n6 g1 F  delay(10);
: ?! O+ q; `* H7 K; a  }
5 F5 g3 z5 m) i. j' v  else{
1 g; W5 z% @% @% }. v  d=(y2-y1)/2;
4 T# `' K" [' G$ F9 z2 H  y0=(y1+y2)/2;# S- L% e+ @2 L0 z0 i4 k# B& X
  x0=x1+d;9 w( [: F/ I. N; u
  x00=x2-d;
! `# ^1 ?  k. a* t+ a- X  for(i=0;i<d+1;i++)
- A  X) d! H) O* b+ M# G  recls(x0-i,x00+i,y0-i,y00+i);: U9 Z$ k; R5 b. G5 M( q& ]! c6 @" T
  delay(10);. y/ r/ I: a" P% ~; w% m
  }6 {' q* z3 a/ u
  }- a4 r. k- l% t* K+ Q
- V- M9 j, Z/ \
  /************* clear rectangle side(矩形边清屏)***********************/
( w9 Q: S. \& `. e
' i6 ]0 ^0 p! q. w! Z  void recls(int x1,int x2,int y1,int y2), K; s# j  V3 V
  {7 v! q2 n- }) t
  int i,j;" h. L$ {, j8 N, N
  for(i=y1;i<y2;i++){
& i+ N, v' v1 T' f1 f    goto_xy(x1,i);7 y/ J" I- W6 W, f6 |
  putchar(' ');9 J' `) g; D* ?* l  L
  goto_xy(x2,i);* E% M  ?4 ?$ X: C) B
  putchar(' ');8 Q. D" N0 f( q7 w; k9 v1 C( J
  delay(10);4 m' _; V+ Y4 Z& B* t1 n% `$ ?! ^
  }
$ z) s' T5 t( q" |$ ^  for(j=x1;j<x2;j++){
2 z& m" d. s  J+ ]: H  goto_xy(i,y1);
8 F1 p7 v3 h+ S- C& ]  putchar(' ');5 y- f3 C/ R0 U  R# \
  goto_xy(j,y2);
5 \' D& X& H" B) C" Y) q  putchar(' ');
, ?9 n) w) a! S$ ?3 E3 b  delay(10);6 }* Q- ~9 X. _' ?) K
  }/ O( _$ c( Z3 g0 j8 {
  }
. d# t5 W- s# s  /******************open screen clear(开屏式清屏)*********************/. {8 K7 z2 x9 A# ^9 f

' A5 X! t! d; M6 Q! D$ C  void kcls(int x1,int x2,int y1,int y2), v* U. B0 s5 t, O
  {) T# C. j' @+ ~  ]0 a" x
  int t,s,i,j;% p, O6 O4 R( B7 C7 u
  t=s=(y1+y2)/2;
7 i" p: B% B; N- d- h* k$ B1 F  for(;t<=y2;t++,s--)
4 [  C& [: K6 @) A; C  for(j=x1;j<x2;j++){. E1 c  P& k( W9 k
  goto_xy(j,t);
+ v5 C- K4 V  V# @$ _% a  putchar(' ');/ W7 f, T# `' a" Q/ e/ k
  goto_xy(j,s);
6 {3 ~- R& d$ f  putchar(' ');. K( y6 ~- B1 S
  delay(10);: j. I/ C* T. y! k1 R* U" u! }( S3 C
  }
/ d! b# e3 m& ~9 I3 j* M1 B  }
" K9 g; Q- G4 f2 D% ]5 p! W  /*****************close screen clear*****闭幕式清屏*******************/" Q+ J  A; O7 q- |( \
! {: a1 ]3 h1 [
  void bcls(int x1,int x2,int y1,int y2)
! t+ l+ p3 \. K. ^( o  {
) Y8 ?7 ^0 `. Z5 G8 V8 s$ o  int t,s,j;( M* m  |# E- n3 H" [
  t=y1;' l4 W0 n  ]4 s( ~7 K# z5 v
  s=y2;
. Z  O( I( w/ E) ]2 n  for(t=y1;t<(y1+y2)/2;t++,s--)$ E3 M; Q6 F9 G4 G0 g& _- r
  for(j=x1;j<x2;j++){: S. [! s# w6 w6 {: ]* O4 ]6 G6 z6 k
  goto_xy(j,t);
% h- F3 T  u4 x0 O- ^/ `  putchar(' ');
- Q# h9 U) N% M) u7 ~4 V& d+ h  goto_xy(j,s);
1 ]2 j7 M/ ~* [/ k8 N8 @( x8 X  putchar(' ');
  j8 f; N# g5 e5 A  delay(10);% d, A! ~5 F6 |* _( P% Z9 U
  }
% E" S* f( F' D" a) q  }
+ L# D" V. O8 C% \  /******************bottom screen clear(自下清屏)********************/2 b, p/ ]9 d+ h4 K( O8 R
$ H9 p! P4 l" t) m  L2 e0 O9 N
  void dcls(int x1,int x2,int y1,int y2)+ G- U2 S1 ~1 S. H: W$ [' Q
  {
# k  h7 l0 m1 W" p  int t,s,j,i;1 \$ W9 c. T5 f- V: [
  t=s=(y1+y2)/2;
+ U" `9 f8 b6 j: ]. r4 A8 M. j! s  for(j=x2;j>x1;j--)9 t! P! X/ G7 R7 ]7 d  s: h
  for(i=y1;i<y2;i++){
1 S# t* O  ?* o5 x3 T* R9 d  goto_xy(j,i);
- |8 @) H3 D  l6 `+ X  putchar(' ');
5 v$ {# U" ]0 l; L* c  delay(10);4 _9 l8 t$ W/ Z7 w& j
  }
# d8 a# Q+ T" C# c3 }  A- n  }
/ c: _* |3 K- _' t, A  /******************设置光标子函数******************/& w, v2 I* C' C+ g5 I

7 E/ u7 t0 [! r' @! c) o$ E; {, K  void goto_xy(int x,int y)
9 l& T5 h2 v1 b) q+ R* Y" L  {
2 `. j' Y5 m, c% g8 @  union REGS r;
, x' T; e# ~! b, L  r.h.ah=2;
( k  v1 M8 h. Q9 I  r.h.dl=y;
6 ]) W! D) }% G% p  s  r.h.dh=x;. ~0 C' V/ H4 O
  r.h.bh=0;1 D1 n; @4 T1 \, @5 S" i
  int86(0x10,&r,&r);& Q) [: y, X+ ], o
  }4 ~7 ?# M# x3 e6 h8 V4 {
  [( x6 O! ]# f0 c( I+ B
  /**********************在屏幕上打出一连串的a字母用于演示程序******************/
( P+ @6 m. B. A' L" q5 Z4 A. H' n; m& v* Q: Y3 Q* H$ R
  void puta(void)
5 E- \" ^& f, [! x% a2 D3 u  {
, N8 ^# [4 v7 G' ^4 t) Z; n! O7 R  int i,j;, G; O; a+ Q! R9 {1 J7 x
  for(i=0;i<24;i++){
' N7 {; z% P9 J# J4 X+ M  for(j=0;j<79;j++){& _- V4 b) G  n' J, O
  goto_xy(i,j);
5 Y9 b# p/ t% ]  printf("a");* f3 J* `$ ?2 s! L
  }4 O: J; n* A  i) n; n' E
  }, G7 F6 E- h9 z0 U7 D5 Z% p' @
  }

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