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

|
C语言艺术清屏
问题的提出:我们在编制程序时,经常要用到清屏处理,如dos下的cls,Turbo C下的clrscr()等都具有清屏功能,但这些均为一般意义的清屏,
3 [8 H+ A; ~1 ?7 m/ ?( i, M; O5 S3 r' z, ` P4 i
并未显示其清屏规律.而有时为了达到清屏的艺术美观,往往对清屏有一些具体要求,如:开幕清屏;闭幕清屏;上清屏;下清屏;中清屏.为此,这里) a& g) P( O) L) J; G
, t' z/ q+ C( [ 用C语言编制了几个子函数,用于程序中时,既可达到清屏的目的,有能增加屏幕的艺术美观.
- G- N6 S6 K; J: @6 A 子函数及演示程序:
4 T( @8 P Q& R1 I0 q
% [% c) e0 [9 _2 b" K/ C #include<stdio.h>
" |4 r' ]0 i$ i #include<dos.h>
) D4 N: D- b' K4 Q1 \' q #include<conio.h>0 Z$ `8 D3 x8 e& `. E: ^5 v! @- H
d" ^; {2 ~& _
void goto_xy(int x,int y);
R1 ~9 r# k' _7 ]5 [6 H void dcls(int x1,int x2,int y1,int y2);- l' f, Q3 K# d8 }
void bcls(int x1,int x2,int y1,int y2);
) H" n/ x, o) y1 f: ]0 F2 b void kcls(int x1,int x2,int y1,int y2);1 g( q$ ~& e+ j. E! _
void recls(int x1,int x2,int y1,int y2);
: B: n5 k5 l/ J void zcls(int x1,int x2,int y1,int y2);
9 {+ V4 j; w0 c void puta(void);3 c0 W. a7 `: W5 @
5 q$ D* N# n* c- B4 u4 R( m) q! Z9 Z; g. n& ]4 d! {
/*--------------演示程序---------------------*/
% ]7 G3 z6 K/ w; p9 @3 x& s main()
' l! l) ^. [8 S5 e8 v7 |6 p- e! b5 G {
/ U X+ f6 e3 |8 x puta();. {1 @; ~) [0 I2 T
getch();6 Y& M, u7 ?- x/ K2 m0 X9 o5 \
dcls(0,4,0,79);
+ _" k2 O8 j, {, i2 l getch();) R" d4 Q/ L, Z1 e. L8 K$ {
puta();' L- A: s* X7 ]0 X6 P+ o* ]
getch();
; w5 u) ]# r1 x/ n bcls(0,25,0,79);
: l9 s$ d) ^: Q# d: l s getch();2 d @+ O! Y9 w! T1 ^: N3 \$ o! p
puta();7 L6 J) ?% t8 W$ b, k, x
getch();
~3 ~! m, I# C$ Z3 A zcls(0,25,0,79);
0 k( M4 Z9 J+ l5 N9 Q4 c' h getch();: b# k6 \& Z, z2 {6 s
}
! \: W) s# s# k6 h0 k /*********center clear screen(中心清屏)***********/
* o# P& n( f) B* {/ f, E( } void zcls(int x1,int x2,int y1,int y2)( l6 ]" w) x: |9 n+ ]0 L$ ]. R
{ X5 d C0 e, a( p3 a" d5 o' I3 y2 S
int x00,y00,x0,y0,i,d;! f2 J: a$ C4 A. c9 [4 _
if((y2-y1)>(x2-x1)){
1 C' L3 V) V) b% R: p& x( i, @ d=(x2-x1)/2;
9 C4 t+ {# B a* H x0=(x1+x2)/2;5 Z8 l9 o) K5 A9 T2 j, J7 \
y0=y1+d;
; ?4 O9 ?4 ?+ j8 S' Z y00=y2-d;
9 a5 G: n5 P2 H2 g9 g2 d5 M for(i=0;i<(d+1);i++)
0 U! q/ T# l3 h3 A! p6 J: g3 R( ~ recls((x0-i),(x00+i),(y0-i),(y00+i));/ }9 O) e f( U" y# U8 c7 \8 @
delay(10);( g7 q F/ Z# l$ Y! k$ }
}
( H4 P9 m! c2 j( P& I else{
: I# Z# q5 _1 [1 B- e7 I d=(y2-y1)/2;
2 Y% u% V( v" T' A3 z0 D4 P y0=(y1+y2)/2;
8 n- j2 I. f/ I8 f- D, \ j* v x0=x1+d;
2 _) x7 ?; N7 @! N% ? x00=x2-d;2 U; X, |1 h0 C' a3 N d
for(i=0;i<d+1;i++): H d! K. T& c( [8 V M3 e7 Z
recls(x0-i,x00+i,y0-i,y00+i);
2 n3 Z/ B$ a P" z/ f5 l6 c delay(10);
5 J* d E; R; O6 X, r) b }# w m7 \" {1 k
}
% F( _( |3 N; K6 O& M6 w$ q4 T# X5 U f* ~& b, A( `1 p; \% k* |
/************* clear rectangle side(矩形边清屏)***********************/
& \3 O8 I7 T% T4 p+ A/ N( d7 F
# d+ q8 w h9 g6 d void recls(int x1,int x2,int y1,int y2)
S L0 K0 ~- T4 X; [2 G" d0 s% B6 x {
1 m% e6 f5 H2 j* a, J int i,j;. E, f9 R! s+ L2 w3 b( H" Z1 H3 i% }
for(i=y1;i<y2;i++){
# ?% p8 f- N- Z f6 x; A goto_xy(x1,i);
6 E2 N. a" s$ z, E) E+ z5 J putchar(' ');0 H$ \& n+ t: q8 L
goto_xy(x2,i);& Y' c# T. A$ Y0 w
putchar(' ');- r! z0 s. k" ]# Q9 M) P
delay(10);4 `% q, {: h$ p
}
' ~4 K* H. A2 k. n for(j=x1;j<x2;j++){* ]' M0 J- r5 N/ _
goto_xy(i,y1);3 e8 a5 s7 W S$ \
putchar(' ');
/ n( C% v4 b- Q9 x# y' J1 m goto_xy(j,y2);/ |7 u2 f2 q, z( F" t9 O. t) X
putchar(' ');3 h- A3 {( ?: |8 l$ g9 W
delay(10);
- j" Z% _5 S, [, L7 z }' h' R3 d/ j. P4 n/ t
}
% M' n0 \% l$ s$ c1 `0 \4 @% Z /******************open screen clear(开屏式清屏)*********************/8 C t: H/ x7 X3 N: U9 ? J- q
# U# F1 Q9 Y6 ~ void kcls(int x1,int x2,int y1,int y2) H/ V& a9 O# b) V" |
{. K* f; I3 g$ Z0 [/ q
int t,s,i,j;
' @4 `0 C0 N. D t=s=(y1+y2)/2;1 E, @( B% h0 v: i5 m
for(;t<=y2;t++,s--)+ y! l2 o% C, v( B5 _5 i
for(j=x1;j<x2;j++){
+ R" ^7 H1 e/ D' ~8 h3 ` goto_xy(j,t);
5 w4 w# E' h8 D7 ]$ s6 N! h9 K putchar(' ');
5 N8 C* Z) v9 | goto_xy(j,s);
- p# t B" W7 u1 l4 [! k, Y putchar(' ');: S5 ]" h' W/ M# w6 n( j. `
delay(10);) k8 l9 m. \. }
}. X) `. h4 Z! B, M0 \+ h
}
( @ k3 x3 k) r, ]( u7 }5 F /*****************close screen clear*****闭幕式清屏*******************/0 v) o4 D; c' r0 E( N2 |1 P# q
0 }: O8 @, I1 m8 q$ v$ i void bcls(int x1,int x2,int y1,int y2)* w2 @# h$ b( |( u" ?0 L( _
{
# D+ h3 b4 K8 G! ` int t,s,j;
9 x, ^2 F2 S4 j- d; B) m0 L t=y1;
# H, ]6 U h1 m" b" R: j) { s=y2;; b9 t/ E3 [4 _: I e
for(t=y1;t<(y1+y2)/2;t++,s--)
2 a0 c3 g4 m( N$ e for(j=x1;j<x2;j++){# f; b) D' V$ Q6 R% N* v
goto_xy(j,t);
& ]) W' e/ k) H5 E7 o- Y1 Q putchar(' ');8 z$ w; K5 H4 N+ A) _& d( L4 r0 |
goto_xy(j,s);
. L Y- Y' ^6 d9 z0 D putchar(' ');. f$ Z% k& ~5 m5 [, m, `# A) X
delay(10);
% E9 S; _3 B; F U8 L$ E/ F }
9 k4 ^$ ]# U+ l! u }
6 J( n2 B5 q8 \4 V/ p /******************bottom screen clear(自下清屏)********************/ V4 W7 ^5 {% F6 B# o
5 y( D4 ~8 F% Z5 X: \' e* D1 z void dcls(int x1,int x2,int y1,int y2)
% X. q' f7 j4 o/ H- ~ {$ ?( a" g0 w2 n ^+ T
int t,s,j,i;1 j+ W3 u* E$ U z- @/ i8 I A
t=s=(y1+y2)/2;5 |$ W$ y& P# V
for(j=x2;j>x1;j--)
1 ~0 C0 r. Y0 _, e for(i=y1;i<y2;i++){. y' A- F4 ?7 \2 u q1 Z3 Y1 K
goto_xy(j,i);
" c; M( N1 V' N! C putchar(' ');8 \: M7 ]' B2 ^2 l" f2 e- C
delay(10);
) s7 T1 w4 r7 W/ { }; o1 d, y f$ R: Y
}) Z1 Z. S0 F( {; ?; _7 F _5 f: K
/******************设置光标子函数******************/ Z! M$ C- e \3 _* Z) F( {# l% |
0 G! a: p8 s6 T
void goto_xy(int x,int y)
T5 d' u* Y9 f4 e: R- N/ a1 p {
0 S3 g( `: I s: a7 I6 ` union REGS r;( Q& L# B8 h+ W1 r
r.h.ah=2;
9 s- B; r+ v. F7 w+ D- ^ r.h.dl=y;
8 f* y2 b7 \1 J* {# V W8 S r.h.dh=x;% e, H! E& j7 g9 g/ g
r.h.bh=0;
5 G2 T1 {2 E4 _* i3 g, C4 N: y int86(0x10,&r,&r); i3 v8 M) W# R4 w! R U# X+ r
}4 {$ o4 k; k2 @, P ~) s
, _1 J6 }6 y. Z9 b
/**********************在屏幕上打出一连串的a字母用于演示程序******************/+ _; h$ l2 l+ x7 o& e/ c' ^0 W
% K$ M) ~" ]& S0 d6 i4 H8 E( |
void puta(void)
/ k3 A9 }6 s9 v% I6 _1 { {1 V' q- U1 p6 O* h6 e6 M. t: O9 W' s
int i,j;! u/ h4 c5 {, [- w1 F$ p {! V# R
for(i=0;i<24;i++){9 ~, E% \& W3 M6 K- W; M
for(j=0;j<79;j++){1 H* O" v7 b7 F5 g. X# W$ M
goto_xy(i,j);
' }5 Y& H! J4 w) s3 b8 m8 s+ d% c printf("a");
5 X3 _( H% G2 i0 j; O% F }
" M1 G" ~& W3 x4 f }) Z" C, c& K6 U7 x6 J$ d7 E& {, C
} |
|