|
  
- UID
- 133
- 帖子
- 51
- 精华
- 1
- 积分
- 186
- 金币
- 55
- 威望
- 2
- 贡献
- 0

|
C语言艺术清屏
问题的提出:我们在编制程序时,经常要用到清屏处理,如dos下的cls,Turbo C下的clrscr()等都具有清屏功能,但这些均为一般意义的清屏,
5 K- I! C- ^/ H) u) y
9 A+ S! Y7 A$ g6 x 并未显示其清屏规律.而有时为了达到清屏的艺术美观,往往对清屏有一些具体要求,如:开幕清屏;闭幕清屏;上清屏;下清屏;中清屏.为此,这里& \/ s& ?& U6 v! O( q) B3 A
5 x9 v( `5 a! S 用C语言编制了几个子函数,用于程序中时,既可达到清屏的目的,有能增加屏幕的艺术美观.
" }' `8 A- g7 N1 p 子函数及演示程序:: {3 |+ u; @. n+ d# k7 w: e& E
1 a4 A1 t' T4 @
#include<stdio.h>1 ?4 M( M% o7 f& i0 G$ ?0 R
#include<dos.h>5 `# m/ O. N5 g/ `4 W& V9 F+ p* n
#include<conio.h>
# R1 V$ f! j0 {) d+ T( a
+ H* \, W' Q4 n7 k, W8 d7 D void goto_xy(int x,int y);
& a' X; v( r- r- t; X void dcls(int x1,int x2,int y1,int y2);3 y6 F7 {' t- @ i
void bcls(int x1,int x2,int y1,int y2);7 R4 i+ q4 ^( L! e- m0 Z
void kcls(int x1,int x2,int y1,int y2);# I$ _6 }8 [+ p) c/ j% j1 @
void recls(int x1,int x2,int y1,int y2);8 G3 H( h* C1 m2 l
void zcls(int x1,int x2,int y1,int y2);8 }8 H/ q0 E7 g8 \
void puta(void);0 ]* i1 Q: g0 @; Z+ e _3 `
) x0 X7 |7 m, y. C
, f/ f, v: M3 n4 R5 T! C+ G- q /*--------------演示程序---------------------*/
9 V# W* ^- R* H: D, p( W: k( { main()
5 j% `0 U" U1 G& F. E {
$ B4 Z, K+ [; M' V" J( \6 t puta();
3 I h6 a: }: c$ S* b# ^ @9 t getch();
# g! ` u& H* j9 N& w% I dcls(0,4,0,79); y6 M5 w' |" j
getch();4 _- [ C; @ [- L! u) `$ A
puta();, ^8 y3 E4 d9 v, D- H8 f$ }
getch();$ X5 Q4 c' {) y n R% W: M
bcls(0,25,0,79);4 z0 m3 U, W: n& Q% F f
getch();
& r2 e b- t2 Y' n puta();% }+ @( Z) n0 M2 r( @
getch();1 A3 o( o8 P0 s% x& `$ p
zcls(0,25,0,79);- o1 H9 m9 D( ^
getch();7 e$ _4 u: u5 {7 x" ?
}
2 D7 m7 r& o4 p /*********center clear screen(中心清屏)***********/
, U3 X: `9 v$ \4 e void zcls(int x1,int x2,int y1,int y2)
& `4 b, c0 ^! @( X {: _% x$ q- f( ?+ d
int x00,y00,x0,y0,i,d;3 L0 f, `; C7 v8 r/ ~$ J& p. v
if((y2-y1)>(x2-x1)){ v6 O' X* a9 T! _+ G) V
d=(x2-x1)/2;6 i" I6 j& E, @; `5 x$ u5 m
x0=(x1+x2)/2;
. X9 f. N5 h9 z7 q# u$ Q \ y0=y1+d;& Q6 b) j4 G2 X+ L- b7 ?& i
y00=y2-d;
% X4 t P+ l9 u$ ^8 A* X for(i=0;i<(d+1);i++)+ L, t0 S/ l. m2 f6 M
recls((x0-i),(x00+i),(y0-i),(y00+i));
3 ?% v6 }' O! j, x+ S/ i delay(10);
' ^. G5 f# v6 b) e }
+ }2 J% h. M! o$ [# ^ a5 k else{
: Y( Q* f" d. T d=(y2-y1)/2;& O) N' N* ]4 y
y0=(y1+y2)/2;
|! z2 K0 k9 P8 t x0=x1+d;
% B3 X3 G# w- c$ ]& O& w x00=x2-d;& z$ c3 }: J/ F, V0 e
for(i=0;i<d+1;i++)
% A$ R; L8 j1 t; M: Z recls(x0-i,x00+i,y0-i,y00+i);
& ~4 M; d& k a5 L delay(10);
5 \% c# o" H" C' I! T6 a! P8 [4 i }6 W; q: Q( E- X3 W& a: h
}' O7 _5 F/ o* ]) `7 ]6 [8 Q: i
5 d3 H: G/ R# C0 a E1 y
/************* clear rectangle side(矩形边清屏)***********************/
2 V5 @. s# q/ L* Q" c' }
, U8 a% m. o5 L6 W+ ^! t8 d void recls(int x1,int x2,int y1,int y2)7 l4 ]* O8 ^; n/ y7 k! {
{
; m+ `6 K# u ~. Y9 C. b9 c/ a int i,j;4 c5 Y6 S/ l5 S8 J/ ?
for(i=y1;i<y2;i++){+ q+ Y* s8 N% H( P5 }" M
goto_xy(x1,i);
" f+ {1 S# O) J/ N9 A. Z% z5 H+ N1 z putchar(' ');
5 U5 z& c# F: f/ ? goto_xy(x2,i);- Y9 F8 e/ e; s5 V$ V. R! Y
putchar(' ');' x) Q2 v8 h9 l+ ?, \4 I% k2 T
delay(10);- Y' q: H" ?$ @% \5 V3 k5 H
}5 X) E3 {2 K6 ]5 K- I/ z* j q
for(j=x1;j<x2;j++){7 {4 Q0 j7 j# \6 G3 f
goto_xy(i,y1);
: [5 R$ ]! A$ {7 |7 [ L0 W putchar(' ');
# v. X# \2 p2 ^; `1 p* C$ P goto_xy(j,y2);
& a; F0 ]& E8 O& u) F' x putchar(' ');
2 s8 L) X. X3 U. |# F# i7 I delay(10);
" e) o& K3 H; i: _% F8 C }
1 z8 u1 i3 t: Y: j' W9 a }3 f4 F; }3 H- N6 x0 W
/******************open screen clear(开屏式清屏)*********************/
% g+ \0 A4 L- ?# O9 w X- b: k. a9 p8 j/ h
void kcls(int x1,int x2,int y1,int y2)6 L& P* u( v+ x# v: a: ]% O3 X
{& ^9 v7 C3 Z' R0 p s
int t,s,i,j;! R3 l9 V7 Q; Y8 s$ t i( ?& X
t=s=(y1+y2)/2;
: n9 O8 G8 {) [4 S for(;t<=y2;t++,s--)/ c. H9 p2 h2 u D
for(j=x1;j<x2;j++){
! J( H1 |. b; I: B! w# x1 ] goto_xy(j,t);' h# t/ j8 S+ k3 z* z
putchar(' ');# T+ O; `. r/ n* t
goto_xy(j,s);# R2 M9 t+ E1 b( j; v
putchar(' ');
! N- ?3 |/ o6 u2 x" W7 ]- } delay(10);6 C' S$ `" T& P8 S( R
}
. z! T6 ?6 L: K' j }
7 f* J3 I o% O' {# w0 e3 q /*****************close screen clear*****闭幕式清屏*******************/
& a( T8 f) ^5 c% ?) |4 |5 i* Z, D9 M7 N
void bcls(int x1,int x2,int y1,int y2)
: g& Z7 ^4 Z( _# C6 `$ Q; \3 \ {' |7 l3 t/ m% B0 {; _- D" ~' M
int t,s,j;
0 X( x) O6 Z1 j; t) y t=y1;
. C+ A# e2 B; S) d0 I1 d s=y2;- t8 a4 f6 a! G' H% K' ~
for(t=y1;t<(y1+y2)/2;t++,s--)
* l4 G) q7 B& r% e/ ~. @/ d for(j=x1;j<x2;j++){ o3 E/ ~. Y# t5 ?/ d' p
goto_xy(j,t);
% E. l$ q, X( N/ j" j% K! q, W putchar(' ');
; G* ~( @1 x/ r+ G3 o8 A goto_xy(j,s);
( o# u1 N+ g3 G- s/ r! U) Q/ B putchar(' ');6 `1 ?) Q& O- z; b {1 `- C* K6 O
delay(10);
' S1 a6 |+ k5 [( ~" j }& F9 p9 |* r" ]3 J4 t# U/ W0 k1 O
}
" M4 o5 p' ~3 D6 y7 U, B /******************bottom screen clear(自下清屏)********************// X5 [ {- o9 I0 s; X. k2 x
& [0 n3 G7 Q" x7 ?5 P
void dcls(int x1,int x2,int y1,int y2)! i7 q7 w; u" L( x5 B
{
& L3 c) r: P/ |8 c1 Y- r k int t,s,j,i;
6 {/ ~8 u1 b( H" u: N t=s=(y1+y2)/2;
0 x F/ m- G" C# \4 c for(j=x2;j>x1;j--). e3 B- j3 @) A. D$ U3 D: X
for(i=y1;i<y2;i++){
( z9 c5 X- w. i$ |& Y& F# r goto_xy(j,i);; D8 h. D) Z- g/ g
putchar(' ');
0 o, @7 N- e8 @; N delay(10);5 J; ^" s, ^7 n7 p- s, ~
}4 N0 p$ B" |4 J3 |' L
}
! O5 ^2 S( V! ?& @ /******************设置光标子函数******************/$ q3 Z9 a( q$ q+ F2 }' G# P/ o
; c: Y3 v; }+ {# D, b/ k6 ^ void goto_xy(int x,int y)
& j. h# }- B4 z- J {& _7 N1 g# i& n" D: r4 h
union REGS r;
; `& _' L6 @: X4 p, v1 f r.h.ah=2;
$ W8 X& v; R C C; w r.h.dl=y;
6 [$ Q# Y3 P0 E7 G" ^3 A r.h.dh=x;
9 Y: E. |; O9 o+ {/ E- P0 T r.h.bh=0;
) G* F5 g( G A$ u& W int86(0x10,&r,&r);; O) K2 {; y2 T7 c0 z; O0 \! b: k
}
; ?6 n# f8 a) x X1 `- ^
8 N. X/ ^6 E& `. A /**********************在屏幕上打出一连串的a字母用于演示程序******************/
2 _; d. ~* q+ C, B' I( h4 ?; s, @2 Q
8 d1 A; {; l' O- ^. z" `: d6 v void puta(void)
# X& o4 r2 y. U( T0 V {
: V V; t- \& }; F0 Z6 A. W int i,j;/ Z$ l4 G, u6 X f
for(i=0;i<24;i++){5 a5 D- V" w4 W- H6 R' _
for(j=0;j<79;j++){
/ E9 d5 D. \" J goto_xy(i,j);4 M; X& u; O& s- X/ A4 G% `
printf("a");8 `) | E' Q) \4 e* x [* g# R
}$ t) j7 Z( m, C+ _! @1 c
}
" `4 e/ T6 O: \ K& C" t& ~. z0 _ } |
|