返回列表 发帖

C语言艺术清屏

问题的提出:我们在编制程序时,经常要用到清屏处理,如dos下的cls,Turbo C下的clrscr()等都具有清屏功能,但这些均为一般意义的清屏,
  ^; b( x' V5 Z1 y8 z
) T( }" X6 ^/ x4 q; f* c  并未显示其清屏规律.而有时为了达到清屏的艺术美观,往往对清屏有一些具体要求,如:开幕清屏;闭幕清屏;上清屏;下清屏;中清屏.为此,这里
9 N, F0 D- D3 |& e- ?2 _
8 I$ r( A1 V: O3 \# n: T2 O  用C语言编制了几个子函数,用于程序中时,既可达到清屏的目的,有能增加屏幕的艺术美观.
5 N* B2 M& [7 j% G% m  子函数及演示程序:
  J' \/ A8 `' ~8 l5 l9 D  Q% R4 C' \- y! Y
  #include<stdio.h>
& F5 `+ r/ |: [7 L7 m& |( X- ^$ u  #include<dos.h>2 L5 o) }. E/ C( f; P
  #include<conio.h>+ c* M9 M* B# T2 |6 G( |

" S/ c( L& u3 y9 [  void goto_xy(int x,int y);/ Y2 u$ {- F$ g! j/ o: i5 X9 n% X
  void dcls(int x1,int x2,int y1,int y2);. p# |" {. }2 `1 W
  void bcls(int x1,int x2,int y1,int y2);0 k7 x9 E) L9 d" i& U8 w7 _" e4 h- [
  void kcls(int x1,int x2,int y1,int y2);4 y) A/ i- W0 F
  void recls(int x1,int x2,int y1,int y2);
6 G4 X" x9 W* L$ `& G% i: F  void zcls(int x1,int x2,int y1,int y2);
. w7 n/ b2 I. J  void puta(void);: X- i+ @! f- \4 d

0 J& F4 \3 j  ~- V/ c& L2 c6 A- i2 |2 w
  /*--------------演示程序---------------------*/+ a+ W% N% @) u3 N7 o4 d+ f; l
  main()
; G: F& t* s5 m3 Z  Z- T  D+ L# H  {1 @# ~1 O; x9 e3 ?8 ^. m
  puta();
2 p2 P0 q$ P! `7 R; @) v9 |+ @  getch();
$ ]# y4 _& }. K7 c: I9 Q  dcls(0,4,0,79);
' j# p9 h0 n& D. ~( V  getch();
2 ^+ w* f0 l& m+ w) I0 }/ k  puta();( j. M0 P: c9 `* H
  getch();
" h: z$ |1 d+ Z$ P  bcls(0,25,0,79);8 m$ A0 `: E2 i) q
  getch();" p5 B) O9 t! m# i/ U, }
  puta();, S7 c4 D! G" I& w+ K
  getch();/ \- y. P- V* z/ q% B8 i0 P# R
  zcls(0,25,0,79);. M% K4 z6 K- f& {& N' l
  getch();$ A! T2 j6 ]) R8 [; B- r
  }4 G& N; T% p# g# x* e1 C) L: M7 q
  /*********center clear screen(中心清屏)***********/
; W( N2 G. T4 e* Q  void zcls(int x1,int x2,int y1,int y2)
# [+ Z* j) [" Q  {
* i" X5 H* P/ d4 q  int x00,y00,x0,y0,i,d;; u, _; C! k9 u/ P9 \/ t
  if((y2-y1)>(x2-x1)){
9 _+ @: x% v: J1 s* w  d=(x2-x1)/2;
! D# [  i3 O0 U6 _9 U  x0=(x1+x2)/2;* Z( k5 v) F; A+ ~3 a* D" j0 W
  y0=y1+d;
6 ?& c& q$ `1 ]6 D" ]" p# J2 b  y00=y2-d;
' C7 q. k8 B, p. _  W5 T: O  for(i=0;i<(d+1);i++)
4 Y/ L, B4 d, p; F# Q% h) g  recls((x0-i),(x00+i),(y0-i),(y00+i));/ A" c2 a' i4 A) p+ z( v0 A8 f; g
  delay(10);' y3 F; q2 P4 u8 I/ f
  }
0 V1 G& l& Z, z* }2 K  else{1 b' q7 m6 ]+ W4 R) G
  d=(y2-y1)/2;& j9 W: m/ f/ z- t
  y0=(y1+y2)/2;; c/ k- K# ~2 x0 e3 \( k+ j, _/ N
  x0=x1+d;' B! r! _8 I2 q' g/ u
  x00=x2-d;
! T% z" K& H# {2 q  for(i=0;i<d+1;i++)) b' X) g9 n% T# G' z! X
  recls(x0-i,x00+i,y0-i,y00+i);- W  j/ ]0 o% D" x% y
  delay(10);& z, g& e  f) j  R2 z! W
  }
4 Q! t5 G% M3 R, _/ E  }
+ U0 _. |3 }1 r- K* s/ J2 e  P) i& P# q% v# V8 ], G
  /************* clear rectangle side(矩形边清屏)***********************/
3 z4 E) p# F+ j
; s4 j% J3 k& X( @2 x  void recls(int x1,int x2,int y1,int y2)( v, C6 {+ [2 Q; g& ?
  {
6 E1 h: y0 F' ^* E7 C8 p  int i,j;
/ }: _  ~# F8 \' J  for(i=y1;i<y2;i++){
0 I& J6 K' {- W  ]    goto_xy(x1,i);
2 ?  T. m% N/ Q, u; q  putchar(' ');
" h/ }* `( W$ W, c  goto_xy(x2,i);6 ~$ z7 q1 G- _! I6 o& r
  putchar(' ');/ R, h! p5 U- j+ S8 r
  delay(10);# Y9 Y6 C1 O0 n
  }0 k; M* j  J2 S5 r
  for(j=x1;j<x2;j++){
: ~+ Y/ t8 E1 P  goto_xy(i,y1);9 b# O3 @# M- [0 Q
  putchar(' ');
  u: Q, v( P- C. q; ^: O% p9 X  goto_xy(j,y2);$ O' S2 L) o9 o
  putchar(' ');
9 f% s; Y4 U- K' [- S% {  delay(10);/ h8 J7 ?( q$ b3 P! e/ z1 H9 x
  }7 D* {7 S7 p' d$ Z5 u: o- J
  }0 }7 Q" @- ~( y7 W
  /******************open screen clear(开屏式清屏)*********************/4 ^/ }& x$ V- R' w3 ?# D6 Z
7 e5 v$ ~, f; A8 K/ u
  void kcls(int x1,int x2,int y1,int y2)
& x* w' }, M0 Z; {  {' ^% Q" J+ V- U% h6 ]
  int t,s,i,j;3 a" |2 Z' A$ m
  t=s=(y1+y2)/2;
$ E& g+ h) R9 o$ U  for(;t<=y2;t++,s--)9 B5 X  k# {3 a0 E5 m
  for(j=x1;j<x2;j++){  M: w0 f7 s, L2 P% Z" t% `
  goto_xy(j,t);1 K1 ~% `. }. O- F$ T  w& r6 H6 b
  putchar(' ');
4 R4 V  E" U1 @  goto_xy(j,s);
/ i- V" r5 M8 H5 [  putchar(' ');7 h$ G! h% {* G6 n# N) ?
  delay(10);
  J. Q9 b5 R( B. K* l: h; E" c) a  }! J4 j+ o; Z8 d$ w9 R% O/ F0 }
  }# K; K7 P( q+ R
  /*****************close screen clear*****闭幕式清屏*******************/! E/ z1 D9 M) C2 q7 Y3 W
1 v8 G) C' W# O( r
  void bcls(int x1,int x2,int y1,int y2)/ y$ {0 o. t. H+ V) Z
  {
! s/ R$ y: C, {% y2 l9 ]3 s5 Y  int t,s,j;
" t) I/ b) n8 Q2 r! B  t=y1;
/ g  W& E  R" P0 m5 G  s=y2;5 g$ T' u/ t' C( t9 B
  for(t=y1;t<(y1+y2)/2;t++,s--)7 T$ V% |. }+ \) \
  for(j=x1;j<x2;j++){
, W+ g8 n  l" E+ |/ [$ [3 K  goto_xy(j,t);
+ D. ?4 _. ^: a; M  putchar(' ');
6 l6 M# i1 ^( C4 h  goto_xy(j,s);
2 L1 t8 L7 {" m9 X9 p( O. R" C  putchar(' ');% b+ [) Y# U  U; W7 m8 h
  delay(10);+ i. @, E% U1 C6 v" L6 P  b
  }
& D& B% L( ^2 d4 ~; T; }0 {  }) m) Y" g- @  m
  /******************bottom screen clear(自下清屏)********************/. |$ Z: H, K( F9 a
; B5 N9 \, y+ l
  void dcls(int x1,int x2,int y1,int y2)
0 `9 R; }# _! f5 c4 n) _* y  {7 k) p" D8 w( n/ Z2 l3 u
  int t,s,j,i;+ d9 R& y8 V- V! u
  t=s=(y1+y2)/2;* C" W8 Y) u0 z5 V
  for(j=x2;j>x1;j--)
, P1 ^4 E* F4 |1 W( W  for(i=y1;i<y2;i++){% j, C. j  ]" A! h0 Q$ Z
  goto_xy(j,i);
7 @* ]" |/ o* C- Y* A  putchar(' ');
5 k5 ]9 c0 ]1 D/ ^6 r( C$ T4 p  delay(10);; F( C) E' |  U, r0 H3 Z3 l% o
  }
8 j! h0 w8 `* ]9 d. ~3 N  }
2 r( E' O! g. o  /******************设置光标子函数******************/" I& |  R. {& a5 a) }
9 f. S2 k; V  Z% Q$ s4 ?
  void goto_xy(int x,int y)& c1 q8 l, _8 z5 I0 e
  {) e- n8 p* D5 O8 ~+ ]* V9 L
  union REGS r;, x0 x2 W' W' p5 s# w% v0 g& o
  r.h.ah=2;) h+ n% e& p8 O9 M  K
  r.h.dl=y;& z% H% }+ Q7 R7 H, F
  r.h.dh=x;
  g$ T; g1 Y7 e2 o7 [, |  r.h.bh=0;0 k" z+ `" g+ U# f& \: p
  int86(0x10,&r,&r);5 H; n5 S0 s$ P" p5 F$ I
  }
- }6 ~9 r5 n% s0 A
0 q% O  ?3 s9 H& J; `9 L  /**********************在屏幕上打出一连串的a字母用于演示程序******************/
3 z; F" ^* _. z: d4 G. m, [" \  Y
$ E  y: P. n" Y0 [  void puta(void)
) @, I7 q2 A  G4 G( v. M  {7 Y/ `. Q2 I, w0 g+ V( Y9 E9 E
  int i,j;
0 k# s% a+ z& P( E  n- s9 I  for(i=0;i<24;i++){
& o* ^' W4 B- n- l/ w1 N  for(j=0;j<79;j++){
% M$ h4 v8 K& d  goto_xy(i,j);# B3 s. O, z- [' I$ `8 d. I+ k
  printf("a");' w6 J+ a+ [* J8 Y9 F4 O
  }
/ W- |5 b+ P  Z( T1 F  }4 B1 \2 S5 ^, m
  }

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