返回列表 发帖

C语言艺术清屏

问题的提出:我们在编制程序时,经常要用到清屏处理,如dos下的cls,Turbo C下的clrscr()等都具有清屏功能,但这些均为一般意义的清屏,4 Q9 e8 Q. u# `! u8 r* w9 j) B$ S8 h- _

5 l- W5 U* W, P, @  并未显示其清屏规律.而有时为了达到清屏的艺术美观,往往对清屏有一些具体要求,如:开幕清屏;闭幕清屏;上清屏;下清屏;中清屏.为此,这里) h9 x; c  W5 C% F1 q( v
$ K, i- L- n& u# R* W  y4 Y; ?
  用C语言编制了几个子函数,用于程序中时,既可达到清屏的目的,有能增加屏幕的艺术美观. 9 m/ y( }  z9 ^& F
  子函数及演示程序:
/ Y1 b  ]+ k- d8 P7 h7 u' t3 |2 Y2 i* d+ h  m
  #include<stdio.h>
$ g% p' \+ i% q8 s9 W/ \4 o  #include<dos.h>* J8 O4 |( M* c" I. L% ?
  #include<conio.h>3 d& j1 `1 O- _, B

9 P8 X) }- f! C( Y, ~) E# K  void goto_xy(int x,int y);5 a5 G8 N1 A6 u9 I$ {5 N9 y7 O
  void dcls(int x1,int x2,int y1,int y2);
8 ?, r7 g( g8 M2 i" C$ D: e2 X  void bcls(int x1,int x2,int y1,int y2);/ s7 \, Z& h% E, T2 j( T
  void kcls(int x1,int x2,int y1,int y2);
1 Z9 Q) u+ [4 [# q% G- A  void recls(int x1,int x2,int y1,int y2);
5 R) P) c4 S9 s5 Z7 J  void zcls(int x1,int x2,int y1,int y2);
! e+ ^9 w# F+ \- v  j' x/ K  void puta(void);
* R' P& N6 ^- H7 ^; [- Y; ^* G; [5 k& g* I" ]

- ^4 _4 o" m* c: h+ C2 Z" Z* \  /*--------------演示程序---------------------*/
5 ~5 F  `" Y: Q1 j( z; h  main()' x& [+ x, e3 Z+ q- k7 g
  {
2 \, I% y- Y9 b: ]  puta();
" J6 [5 K( ~0 ~) t  getch();
$ E1 d, c% H- B" h  dcls(0,4,0,79);
  R( H  X, P& T$ K  getch();" R( ?; b9 i; w. H
  puta();
5 a6 o, R; }0 L5 B# @7 m+ z  getch();
1 Y; d8 Y4 M3 i3 [' |) |9 b  bcls(0,25,0,79);+ k- E1 o7 d. n8 b
  getch();
( P$ J( F* p! d4 ]  puta();+ D# ?! l% J, u+ }1 A# H0 b* a* X
  getch();
" w2 M% g0 _, A  zcls(0,25,0,79);
: ^- c8 S% c9 _  |  getch();& ?  @; S+ d1 _) F' R- R5 p
  }
6 V& T$ m. D6 {2 W- f- V  /*********center clear screen(中心清屏)***********/- \; V5 o& N$ X$ k7 f- d( K6 F8 u
  void zcls(int x1,int x2,int y1,int y2)8 S. x9 C% S# ^4 T2 k- I: c- Y) Q
  {
1 y4 s6 _# U& O$ s& M  int x00,y00,x0,y0,i,d;
( w' ~3 L3 d, a4 ~/ `  if((y2-y1)>(x2-x1)){7 A, P, B1 G0 |- e5 V
  d=(x2-x1)/2;$ Z3 w- M# A6 Q- s  @8 }3 z
  x0=(x1+x2)/2;
( S0 [( _2 f" ?9 P  y0=y1+d;
$ Q; @, _1 c' T) c' M  y00=y2-d;
$ n5 ~; |0 c3 P. P( \2 E3 X, |6 f  for(i=0;i<(d+1);i++)
% E6 D. A* J0 V5 q  s+ H  recls((x0-i),(x00+i),(y0-i),(y00+i));4 i2 W1 }) T- F5 p( m: y  [
  delay(10);4 }7 o3 a3 Z7 I9 R4 R
  }
! @7 i7 ?# e6 w+ R  else{5 D, @2 A; \4 a! k$ S) h% |6 ]3 D
  d=(y2-y1)/2;9 ]( }8 ]1 q- m3 ^+ i" A: o' M
  y0=(y1+y2)/2;' r! }) n3 e/ [& L
  x0=x1+d;' B/ h$ q1 a; a  c( ~
  x00=x2-d;
: u: y" O2 h$ z7 c/ u5 K& U8 o  for(i=0;i<d+1;i++)
1 U/ e6 i4 G2 n) ]+ x( F7 a$ i  r  recls(x0-i,x00+i,y0-i,y00+i);3 y9 ~- H: E: a% m. s
  delay(10);
3 P' `- @- v' z/ S" o  }  f3 u" y! J$ Y4 C' r! ^
  }
  x) {' ?9 m1 r9 ]1 [8 h
8 Y' i  K* ^6 `4 Z' l  /************* clear rectangle side(矩形边清屏)***********************// H( P1 r9 j9 q# D$ e8 K
& T  o+ d1 V: W% B
  void recls(int x1,int x2,int y1,int y2)( m; s9 k2 \5 B$ y
  {
/ f* {7 h9 q* A# |6 b/ m  int i,j;
: j  F6 o3 L; f/ V8 i  for(i=y1;i<y2;i++){
; D8 H$ A: ?/ G' H+ \+ w' N    goto_xy(x1,i);
) Q. B& d) U3 C% [; p3 b* w  putchar(' ');" ]- r9 a3 l( B2 b8 t
  goto_xy(x2,i);4 |! V* g( Y9 B: w; ?% W4 [7 u5 @
  putchar(' ');
: O: i  k! k9 A" l! L2 \8 u/ O  delay(10);0 |+ Z8 r1 S+ t+ f7 {/ z5 g' W7 ~
  }, O3 p% r- g' Q4 B2 R
  for(j=x1;j<x2;j++){
0 I& P) \! H1 o  goto_xy(i,y1);
9 _8 O8 J& L0 g# Y9 {  putchar(' ');
& Y0 T) H3 A$ }& c/ x  goto_xy(j,y2);
4 M' O! l& a4 _; ]( L  putchar(' ');
+ H" l9 @8 i+ r9 M6 [3 X4 ]3 r+ o1 ]& F4 [  delay(10);$ @. N1 l" }" X/ R: ^: H( v
  }
- n2 |% j9 f1 |9 p  }
, ^* V: l4 p$ G1 r" c  /******************open screen clear(开屏式清屏)*********************/, m- X; N2 q5 A/ p
6 K4 R0 q; b% o, S* a$ z* B% E
  void kcls(int x1,int x2,int y1,int y2)7 |7 a( E. ^% e) Q4 ?1 }) K8 f
  {
  Q! [3 Q# X" B7 F  int t,s,i,j;
: F/ b+ \3 I. r/ |; F. _  t=s=(y1+y2)/2;
- Z/ \% E# e$ p: E  for(;t<=y2;t++,s--)
# u( W; J: r% U# L, R  for(j=x1;j<x2;j++){
/ T1 O. l% a2 i1 C  goto_xy(j,t);" M- v0 v. `& s7 y2 o( X
  putchar(' ');
; B: @4 ?8 g7 Z9 J  goto_xy(j,s);
% h: p1 A2 {7 _; w5 c1 d  putchar(' ');
$ H1 R, ?1 Z+ x$ W4 w1 {  delay(10);/ i) W# Q5 _. G9 J% f; p
  }
  h: k4 X% \: T4 l2 l  }% X( B" j2 r$ _+ R! o
  /*****************close screen clear*****闭幕式清屏*******************/2 l: W0 j' i" o: D- {( f

$ t; G5 X3 M4 i- q  void bcls(int x1,int x2,int y1,int y2)! Z! _: x) I! ^( _2 X
  {+ x, G, k; r" }) V& }3 k; Y/ ~
  int t,s,j;6 V6 B8 ?: u6 ]2 K. m9 t5 F  t
  t=y1;
; L, S: {9 M1 E7 P; K  s=y2;, V( D+ s3 H! h5 t6 |
  for(t=y1;t<(y1+y2)/2;t++,s--)# h, Z) a0 u% K& U$ [# f
  for(j=x1;j<x2;j++){/ X6 G: Q: {* B4 q+ O4 r# I! x
  goto_xy(j,t);+ F0 P" d" b! P6 h
  putchar(' ');
: P9 n9 R! L. N* w" p  goto_xy(j,s);
9 D: n4 j' Q2 p! m' P6 N6 m  putchar(' ');" M: v: i$ T8 ?7 T( f9 F
  delay(10);
7 ?% T. v4 f9 ]  W: t9 }  }
- x2 J0 F5 D. z% B" V  }9 F2 @# c5 e& D" A( V
  /******************bottom screen clear(自下清屏)********************/- f/ h4 ^* [3 I. k; t5 |; J- v

/ A/ W4 Y0 B' L1 R& U  void dcls(int x1,int x2,int y1,int y2)
1 h* Z  p! B* B4 I2 `  {6 |  X, E3 g, k& \
  int t,s,j,i;% ~. m0 `+ n% q
  t=s=(y1+y2)/2;
6 o& z/ d9 W( w& [; S  for(j=x2;j>x1;j--)
  E( K5 y0 s/ ]. H4 x! g% a  for(i=y1;i<y2;i++){
3 }' x8 ~: `3 L) R8 T0 @  goto_xy(j,i);1 d, |+ h% X3 z/ z2 k
  putchar(' ');
& p$ }! C. q% L! D; p1 l6 ^  delay(10);
! G6 y0 E8 A  v* i( `3 N  }
3 n: l9 w1 i/ I6 Q  }
- b6 ?. L7 e; u- l$ X1 U( ?8 V  /******************设置光标子函数******************/" ?* [: |3 j  K3 ~7 e

1 _2 u0 g; S$ l0 @. E9 R" i, ~5 ?  void goto_xy(int x,int y)
4 Y9 N7 X/ d: i  {7 V/ z! R- Z: F, o( ]& ~+ n
  union REGS r;8 \7 r! p# e1 q, ?
  r.h.ah=2;6 M* M' W, f) }7 s4 d
  r.h.dl=y;
0 [7 q: [0 _3 {  r.h.dh=x;, i& r& @' v5 u2 k' b% ~$ T
  r.h.bh=0;3 n1 h% ~- k2 E% O- A! H# n& @  W% C
  int86(0x10,&r,&r);0 o3 x: H2 c! l5 c2 }& s
  }
5 A% g, {9 ]9 i* ?" I4 w( l
- Z$ n2 }5 u6 |& j  /**********************在屏幕上打出一连串的a字母用于演示程序******************/
) N- \) n& \( C& A2 F5 R- z' F1 K1 y
+ \! \7 H- Y+ u' ^  void puta(void)
/ h, h9 A  M  L% k$ x3 y  {: F* `6 X# ]$ O) Z, `- y; f5 Q
  int i,j;" r6 E- c3 y$ O  ~
  for(i=0;i<24;i++){) J  g( _, W) @
  for(j=0;j<79;j++){
" t' b1 _2 U# [  goto_xy(i,j);
% w' w3 ?* r% R2 L5 N  printf("a");6 A" ?& W" X* D- b" t
  }- [7 `# x2 w1 f' x, t
  }% u; W! U( o8 v$ `
  }

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