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

|
C语言艺术清屏
问题的提出:我们在编制程序时,经常要用到清屏处理,如dos下的cls,Turbo C下的clrscr()等都具有清屏功能,但这些均为一般意义的清屏,
+ W5 w+ t" I5 E' v! ?6 B- ^. G
9 c$ e& o8 J3 q, R 并未显示其清屏规律.而有时为了达到清屏的艺术美观,往往对清屏有一些具体要求,如:开幕清屏;闭幕清屏;上清屏;下清屏;中清屏.为此,这里
) x6 U; S" K7 z
( s3 i- _* H3 M, P0 m" o/ R 用C语言编制了几个子函数,用于程序中时,既可达到清屏的目的,有能增加屏幕的艺术美观. 5 _6 M6 h4 ~7 L0 l' I
子函数及演示程序:) B& ^6 m6 A; G8 T2 Q6 A/ |
! }# i! k2 q, j2 X# |" G# P- `! L
#include<stdio.h>
& y! }% V/ M0 u* \" X& l# d" M #include<dos.h>
0 E: V8 J1 j6 H0 v9 L" |' y* G- Q4 { #include<conio.h>
- o5 ?2 a5 p7 v8 l4 d2 T! }# N
' E2 l% m/ P" `1 K! G& d void goto_xy(int x,int y);
5 W- f6 b: f6 K) s3 \# H void dcls(int x1,int x2,int y1,int y2);
- _6 P% h3 e- y" {: f$ j void bcls(int x1,int x2,int y1,int y2);4 n9 W# |& e$ l3 N. a
void kcls(int x1,int x2,int y1,int y2);
( u9 |' i i2 k1 s0 d+ _. j, k void recls(int x1,int x2,int y1,int y2);9 } n5 j5 x! J* W% x7 t
void zcls(int x1,int x2,int y1,int y2);
, Y$ u/ a! V* J8 ] J h void puta(void);# K2 E% X9 J% ]# e
% ], i" @3 H& I7 |
7 p, i W1 o! c* s) g- K( j /*--------------演示程序---------------------*/
+ G' \- l. z8 V1 S* U main()1 P) o7 O' [2 u
{( j) W9 n$ C V- W. q, w' v9 x
puta();- Z- y7 l$ B, Y/ L( w1 ~/ O1 F
getch();
: Y5 T% l( @% c* a" j dcls(0,4,0,79);+ U" ?$ o' o8 O$ p- j3 e) V& u( y
getch();
8 A; e6 Z; Y$ P$ T2 B! ?; Z puta();' \6 E1 g b* Q, V
getch();
' H2 |. J" h6 |2 _5 K bcls(0,25,0,79);) m! J. \ E( r% F
getch();* d6 v( z6 r; e
puta();
3 A5 L: z5 q8 \; T4 Z* ] getch();
3 {9 m7 w' w; F/ S; [! C2 M6 G zcls(0,25,0,79);6 _; k) O2 J. t: E; w
getch();1 Q- e" y& m& r( E% r
}
7 \. c; x) q0 |- D( R& ] /*********center clear screen(中心清屏)***********/3 {% ~# Z6 h, ?, I/ V
void zcls(int x1,int x2,int y1,int y2)3 W# q) N# N0 f% A4 {! m2 D4 W
{
/ H; |% H: t3 o2 x* q3 W" o int x00,y00,x0,y0,i,d;4 _% b9 }- _" e
if((y2-y1)>(x2-x1)){
3 }( Q/ A2 J) [, ~2 W# x" J, }4 n$ S d=(x2-x1)/2;% s1 W3 r% H( D. V; _$ ^: ~$ G8 X
x0=(x1+x2)/2;# U9 x+ e4 @2 y# J* k
y0=y1+d;( m7 n- i0 j w( a) e% ~7 k- s
y00=y2-d;( K" ~3 ?/ b+ d# O: F! U/ U
for(i=0;i<(d+1);i++)' H5 ]6 `3 U5 U2 B
recls((x0-i),(x00+i),(y0-i),(y00+i));. f( S' b2 D$ n* B3 x8 K
delay(10);
% j; [; P. d3 ^ } }9 a( ?, J. m: D. J
else{
i: D) s' s( O9 ~( j( q( s/ @ d=(y2-y1)/2;- \* c. X% g w4 e
y0=(y1+y2)/2;) q7 \5 u' O5 L; J0 l8 I: ]+ R: O* Q* p
x0=x1+d;
7 H& N) I8 P! k3 Y" o$ S. ~6 @! b x00=x2-d;
) B" ~: f" Z! t. w3 O/ j! U: H$ G for(i=0;i<d+1;i++)" K$ h4 u3 o0 v
recls(x0-i,x00+i,y0-i,y00+i);0 ]3 t% ]+ ~) R. J8 v! J2 x
delay(10);6 ]9 [0 b6 V2 R# q# P
}
6 m% h7 ~- P$ I }
( I( c0 f$ D. e/ d- ], H
+ Z X% o o& {' j /************* clear rectangle side(矩形边清屏)***********************/
`7 _- G0 j: J- c9 I* _8 w+ u" r a0 I/ T
void recls(int x1,int x2,int y1,int y2)8 x! `3 d3 e3 s) w' H5 S: p
{/ A9 N9 r. R6 }) ]1 G1 |6 F
int i,j;" F% x0 P9 M# H2 o7 ^: ~" z
for(i=y1;i<y2;i++){
9 f0 V, q% Y' L* U goto_xy(x1,i);2 A8 n' p2 k S
putchar(' ');& j8 X8 Z4 ?9 E% n% g
goto_xy(x2,i);
% M6 V% Z# Z. T+ q5 l2 r% o- Z putchar(' '); r, _; s& N+ V8 o( _5 @9 O
delay(10);6 G: `1 h: L9 M4 S% L3 D. k' ^
}
+ B G$ r* Y5 o* m. C for(j=x1;j<x2;j++){( o6 W. [9 H9 z4 \! L! v
goto_xy(i,y1);" N' }* t- W2 y( J
putchar(' ');
$ d" P9 ]9 `% B goto_xy(j,y2);
5 d# P2 O2 O* s, n6 O- A, i. r4 q putchar(' ');
8 A* G3 ], \4 h: n2 j0 U delay(10);
! b! l( z( b3 M, \ ~ X: X }/ k% }5 U0 j# g, `- S
}2 ?4 m+ Y+ p g+ k% x( m; O
/******************open screen clear(开屏式清屏)*********************/
$ j9 X7 F+ k2 N" F3 A' O
, q" H5 d, b* X. M void kcls(int x1,int x2,int y1,int y2)
, T: E& X, u1 j/ A. D% ?# ~+ J {: V; ]0 [& S3 |# P% {$ f6 ?3 Q
int t,s,i,j;2 y; v9 O( C2 J5 B, ?8 W, I( G
t=s=(y1+y2)/2;
% J7 y( p- T+ Z Y6 z for(;t<=y2;t++,s--)" [7 {! l; L9 s% z u! J; @
for(j=x1;j<x2;j++){; V, }3 R& d1 P' o# E! B$ ^
goto_xy(j,t);; h* P; x' v# a# d" R' u+ R
putchar(' ');
5 e, `0 F& {3 p7 m goto_xy(j,s);8 r% p8 B% p3 l* o. N2 \
putchar(' '); k1 d: }6 N- c! f. ^( e+ U
delay(10);
( K9 K* C$ M6 o8 a% a/ M# b+ c. [ }
; ~4 G7 I/ y5 R$ x& Q }
- r+ s% @0 r, { /*****************close screen clear*****闭幕式清屏*******************/
4 \9 b0 z6 |( D( W
3 H( [7 J6 r$ Y! _1 C$ j$ G void bcls(int x1,int x2,int y1,int y2)/ U; J9 Z; s6 U; \! ^
{1 L/ H4 S( m: Q4 c2 j. e
int t,s,j;
1 V: m5 U" t! w' E& a8 a5 u t=y1;. k" u5 i8 b4 T0 g" |! ?0 u, J
s=y2;
1 C, _0 R W( z7 ^7 A/ G% r for(t=y1;t<(y1+y2)/2;t++,s--)# i) D1 Z* F$ |
for(j=x1;j<x2;j++){
' T5 [; f, ]0 [% d( }' Q( I goto_xy(j,t);
) E h8 U8 g" v( r" Z1 a4 } putchar(' ');
3 \& f! Y' M$ Y3 _/ X goto_xy(j,s);
0 w6 S( c3 S: N1 y! V+ M putchar(' ');9 U1 w9 x) s1 _2 Y4 S, _7 {! I
delay(10);( e8 j; Y) K# M! ]) r. F3 l8 U
}1 w; m9 R- J7 P% w6 V1 j
}
8 m5 \# O/ u" W7 Q' d2 _8 K' c' } /******************bottom screen clear(自下清屏)********************/
5 N0 t1 ?; X8 X8 z" q: p& k
$ F* n7 ^0 I5 O; A ~$ }# d2 G void dcls(int x1,int x2,int y1,int y2)
. t' R$ c/ w" ? {8 C7 y/ P) N3 Z" i
int t,s,j,i;" l: R' O3 H; F# t
t=s=(y1+y2)/2;
" K2 v5 E" d5 r for(j=x2;j>x1;j--)
1 J, g9 J0 O& a) _! S0 n6 x for(i=y1;i<y2;i++){/ x+ U* w, t ~7 e. l
goto_xy(j,i);' }: X5 p% r* S2 D# F
putchar(' ');
: d( I4 l; n7 l4 S8 d delay(10);, Z4 C4 O* h; W# \
}
( H3 w) D8 u6 c; s }
+ q' r$ P5 n& C& n' H0 f% u3 P% t /******************设置光标子函数******************/# _$ k4 E0 G$ a$ B
: ~& L% t$ C/ m
void goto_xy(int x,int y): v" X9 ^ T7 Z; z/ n' s: [- ~
{: n$ L5 l' t/ O$ v- t
union REGS r;( b0 B' q* z/ s% @
r.h.ah=2;
7 s/ }" U9 T' T3 p9 k r.h.dl=y;* A8 Q. w' p4 e" N/ d8 W4 s
r.h.dh=x;' x0 U9 Q# ~! R
r.h.bh=0;
. ]9 o3 D2 M9 I( d- W. R3 J% l5 u int86(0x10,&r,&r);: I. x& ^9 h. X. i: m7 z4 R* w
}
8 T3 x+ [5 L$ N4 \& i& [ T w/ @0 m1 Y. g7 i
/**********************在屏幕上打出一连串的a字母用于演示程序******************/ N6 D5 R3 l6 q: ?, S: u/ [
5 d# y l8 J# Y8 r3 b void puta(void) H& g0 R+ _9 \& Y
{4 r8 A/ r9 b( O
int i,j;) }* g" u8 Y0 g
for(i=0;i<24;i++){5 D; [0 O v4 I% D
for(j=0;j<79;j++){$ S4 P/ F4 i H k
goto_xy(i,j);
# i* f9 c* m( n7 ^# [. i printf("a");
; L) W, y2 k: C6 }/ V2 V$ p$ o/ }$ e }
2 w8 ]4 B) ?, z/ Z% h; @ }
: h' c+ c+ Q3 D6 Q7 P8 r" O' o } |
|