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

|
C语言艺术清屏
问题的提出:我们在编制程序时,经常要用到清屏处理,如dos下的cls,Turbo C下的clrscr()等都具有清屏功能,但这些均为一般意义的清屏,9 k% a' {8 G3 |& ?
( Q+ o0 k5 O' M& y( s8 v 并未显示其清屏规律.而有时为了达到清屏的艺术美观,往往对清屏有一些具体要求,如:开幕清屏;闭幕清屏;上清屏;下清屏;中清屏.为此,这里3 r2 e8 P, H4 m
U* J- u0 m f+ ]$ z2 O2 k
用C语言编制了几个子函数,用于程序中时,既可达到清屏的目的,有能增加屏幕的艺术美观. ; C) j. ^ @) N' F
子函数及演示程序:; y; U% U9 q: B3 U+ O* i I" e
4 P k, Q" e: c: y( s6 K #include<stdio.h>
5 E) G2 L" i% t$ t #include<dos.h>
/ f* Q$ a% D6 g. B _" h! P( c #include<conio.h>
1 X! }' ^" ?# I5 L
4 E4 V# B' D5 { void goto_xy(int x,int y);5 c* X! r. w0 M" B# G$ `9 M' c& N
void dcls(int x1,int x2,int y1,int y2);
5 ?4 z2 ]6 o8 I- [/ j& Z. s/ a void bcls(int x1,int x2,int y1,int y2);
0 ~" C- g4 k1 n8 A4 M% @. j G% I void kcls(int x1,int x2,int y1,int y2);
8 q* ^, M0 Z- M( Q! l void recls(int x1,int x2,int y1,int y2);
5 v: U) R7 G O void zcls(int x1,int x2,int y1,int y2);- R. x- k m% \( ` F2 o& q; M: S. O
void puta(void);
2 t, K+ i3 s- r* v$ ]
4 n2 L; N; m1 H+ z" w A8 X, A7 J4 q2 L+ C6 B* ?. G
/*--------------演示程序---------------------*// K5 ~% m( a3 y6 K# _/ }) o' r- [3 r
main()
5 H. n* {: Q" F$ l* Y {
$ }! M! x3 c! o" E) t puta();) B( z4 F) ` h3 b2 I) G' r- {* Q
getch();
2 k5 l* g/ D L dcls(0,4,0,79);
) h& @4 p0 S/ x& O getch();
5 `- N! P. p( w puta();7 k/ n7 V2 S4 f# O8 d
getch();: Q5 A; D! y4 b. c- W2 N
bcls(0,25,0,79);
( x% l+ ]& X4 Z! U' {) Q getch();
& o# g% @8 G4 t9 H$ Z puta();
1 [1 L4 n$ p% U/ N" J; A getch();
5 F# {. U+ E: m6 W zcls(0,25,0,79);
+ p' W0 t% b9 W' T- [+ |' Y! [7 D getch();
( l, X. r8 t+ P }
# g- H3 z1 H# b$ B: ~ /*********center clear screen(中心清屏)***********/; {" o0 k+ o5 |: G4 Z
void zcls(int x1,int x2,int y1,int y2)
; k( O0 x' w+ c: s3 w {
8 K \5 e2 c1 s" Q4 L int x00,y00,x0,y0,i,d;
, S+ h# V( L3 G- \8 a if((y2-y1)>(x2-x1)){
! u" E, J8 t2 p d=(x2-x1)/2;; G, {& }. B1 K4 w! K9 E. }8 s( N5 W
x0=(x1+x2)/2;8 l0 ~/ Y0 D# c$ d1 \1 t
y0=y1+d;
?+ B8 M4 @% i' C" ^1 S/ e y00=y2-d;
: a' K. b. ~ Q5 d for(i=0;i<(d+1);i++)# R( J& y# e7 X7 \) e1 e" @
recls((x0-i),(x00+i),(y0-i),(y00+i));
, } Q. V1 i1 Z5 y$ N- q9 z delay(10);, ^" V1 V; A) A, H5 \
}! m5 N1 S& c' X( D1 e, c+ n& [2 _
else{! e& o a5 x1 ~) T$ ^8 B
d=(y2-y1)/2;' q% B8 T. ~# G" M
y0=(y1+y2)/2;6 w) E' D, H5 U% P8 M) n8 p& V
x0=x1+d;
5 P' Y$ [. Q; v7 q' m C x00=x2-d;
( v4 x+ S( V6 m2 b. L for(i=0;i<d+1;i++)2 D3 T4 J2 U8 J3 e
recls(x0-i,x00+i,y0-i,y00+i);
( X5 c9 B" u1 n$ ?5 ^ delay(10);2 k% H K" `; B+ o
}
/ ^+ b, c' k6 p% r# v }
: `) V* m0 L' }% V8 a) k7 m8 u9 T
/************* clear rectangle side(矩形边清屏)***********************/1 t% u' ?) P4 l0 b- g n
2 X5 c( E; `8 x: G void recls(int x1,int x2,int y1,int y2)1 Z8 R: |# N" G" J0 Z+ S" N0 l; m
{
5 W& l% t% e+ s% r. F+ T0 F, O) U int i,j;! D. ?* N6 I" e9 o( G( \
for(i=y1;i<y2;i++){
# E# f, J2 I6 V* y. I- j! G goto_xy(x1,i);
8 C9 \ C" U8 Z# [5 n putchar(' ');2 E) U0 o# @! U" S. q; H
goto_xy(x2,i);
- g. j2 O: K3 |& h6 e: v0 t7 ^ putchar(' ');
1 c6 q4 K/ b" ~; Q5 s delay(10);
' S( A* z6 N4 R; S }
) V' F! J. a0 G+ i, S+ G for(j=x1;j<x2;j++){7 {. d7 G2 S- ? m- ^* N
goto_xy(i,y1);
# ~: e8 t4 j P0 X putchar(' ');
3 j s: z3 h* [# q3 L2 C goto_xy(j,y2);
1 j: |, v9 t+ i9 P O" l, U putchar(' ');; H1 |" ~. n' Y; c9 k1 b- ^; h8 p+ T
delay(10);: }2 p8 L1 }$ q" m4 O% @
}0 I. F$ U4 B4 [' ^7 S' e* S3 O
}
( ?, H2 \3 h* V( v /******************open screen clear(开屏式清屏)*********************/
' k2 }9 G M# j6 }8 k- M0 C3 ^
5 ^3 y# C d9 t* _! _ void kcls(int x1,int x2,int y1,int y2)
6 q* o% t8 [- D0 z0 F/ h0 [ {% h/ e4 e; b. d2 F
int t,s,i,j;
+ u2 h% k) I8 j( U, a" I: @ t=s=(y1+y2)/2;
9 t- F/ H4 M7 V' E1 ] for(;t<=y2;t++,s--)
6 ?! O: Y& b' K9 a# g# s for(j=x1;j<x2;j++){4 N+ X6 m' H* @6 R. H( O
goto_xy(j,t);7 y t+ j4 S$ _# \3 ^
putchar(' ');
( \5 |( o/ ?7 O% _ y4 G, | goto_xy(j,s);
; k. `6 m! S: ~9 ?5 | putchar(' ');8 D9 |+ t4 @1 {+ d+ D% B V B
delay(10);" B8 b4 ^" n, @0 c/ I& x
}
5 M% a' Q; Q3 Y& J1 ` }. l: c8 ?( Z' u. R
/*****************close screen clear*****闭幕式清屏*******************/' X( [ a, K3 x8 A5 @1 O9 ]1 Y
( t7 W$ |# P* H- q3 @0 R void bcls(int x1,int x2,int y1,int y2)
5 E. o# n' T' x5 M" L' w {9 b$ p, N8 ~# y: `
int t,s,j;1 {+ u& x4 P! Y( O7 I2 W
t=y1;
3 t. m* ]2 P- C1 w2 k4 `/ m s=y2;: g0 N1 ^) I4 M) V c% u
for(t=y1;t<(y1+y2)/2;t++,s--)9 e/ M! F. r& U6 o. B
for(j=x1;j<x2;j++){
- r6 k" @ Z" j. | e! z8 `( Q j goto_xy(j,t);" e- C4 `0 N% Q
putchar(' ');
' j$ f5 W c! Z8 T( i2 d. o goto_xy(j,s);$ r# @# x0 g1 R' \! B$ W5 G
putchar(' ');
/ d+ q7 r4 o5 x8 W4 U delay(10);" V) ~2 e% @! N% ?7 z+ R- y) K
}
- E5 U3 D& z9 c( P }
5 V7 i/ m2 z8 ] /******************bottom screen clear(自下清屏)********************/" h+ N: j% [" f
/ _' Q$ `8 @# A- ^4 G% r7 A void dcls(int x1,int x2,int y1,int y2)
4 f7 d. t, V: G! i, o% m {. R5 S. w% N7 b% D& \
int t,s,j,i;! I# l5 W9 J% A. `
t=s=(y1+y2)/2;9 @" C0 Y2 p) [5 f
for(j=x2;j>x1;j--)- E9 X+ @* M9 A" b G1 z2 h: v
for(i=y1;i<y2;i++){; ?/ U" ~' J2 ^% o, T* @/ p
goto_xy(j,i);
, H9 z0 [: g) y$ c2 n putchar(' ');
& j0 G2 ]# i% `! j: G delay(10);( B" m, [/ J" [1 @ j8 c0 N# u
}
8 N& T% u5 X8 Z. [* @ } I; n+ N% o. V2 }0 P( C7 u6 X7 E
/******************设置光标子函数******************/( P- K2 d; U( c: E7 a! R
3 m Y5 H& A1 \7 B7 V+ c$ s- R5 X
void goto_xy(int x,int y)6 _- G' ^ P1 Q/ _0 k; Q7 ^
{% h4 x- C6 V$ m) Y2 L: ?( r! y" N
union REGS r;
- ]6 Z! ]& k: m! F4 M r.h.ah=2;- x: W2 ?: F0 J G
r.h.dl=y;) h$ p$ ], s# S; M4 V
r.h.dh=x;4 D) O) a$ T) O |* I6 c
r.h.bh=0;1 F' f! U- N; J1 r1 `) m
int86(0x10,&r,&r);
, T+ r# O2 Z( E5 d6 V" n }
5 m8 \" @% ?: E
. n: s9 U3 B- u9 X: a# Y /**********************在屏幕上打出一连串的a字母用于演示程序******************/1 j, f2 f! J4 T# O( q) P9 @
, t9 N. y+ T# w" ^$ l& j9 v9 F0 E void puta(void)5 i2 A; D$ B7 O
{
8 Q0 }) a1 C0 k0 k int i,j;5 Z- i8 W: t: v% \
for(i=0;i<24;i++){
5 a2 }9 r- y6 e8 T for(j=0;j<79;j++){3 E& k4 p; v2 t% l
goto_xy(i,j);
L. G; X7 |' }3 y printf("a");
, g* @( p& c1 h) X6 A }9 s/ L7 I& S4 R2 U. I5 B
}5 g9 Z; r- b" m6 F
} |
|