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

|
C语言艺术清屏
问题的提出:我们在编制程序时,经常要用到清屏处理,如dos下的cls,Turbo C下的clrscr()等都具有清屏功能,但这些均为一般意义的清屏,5 R6 T) m7 f z: H/ ^2 i' v* v
; n$ f# ^( q/ m8 g7 H, y' D+ ^: |
并未显示其清屏规律.而有时为了达到清屏的艺术美观,往往对清屏有一些具体要求,如:开幕清屏;闭幕清屏;上清屏;下清屏;中清屏.为此,这里
' s5 m+ `$ ~) w3 l
5 }6 W/ ]/ [% v" k- u 用C语言编制了几个子函数,用于程序中时,既可达到清屏的目的,有能增加屏幕的艺术美观.
7 R/ [# K0 ] Y6 ~+ t! h, G: z9 r 子函数及演示程序: s- L, @$ V+ ?# t$ l b; `
1 H G4 B2 Q7 \/ E/ |
#include<stdio.h>1 \0 V+ [) f; b T1 J( c# V
#include<dos.h>
P& a! ]& ?, T: u; e- ^ #include<conio.h>& c1 D8 ]0 s# o- r ]
& \, g# N1 W2 T: R! ?+ U3 t$ P9 |. H
void goto_xy(int x,int y);- ]- b0 ?; K- G, D) e
void dcls(int x1,int x2,int y1,int y2);8 p2 [6 G. p# Z1 E
void bcls(int x1,int x2,int y1,int y2);
( \3 h& [" Z( G8 [8 R) {( x: w void kcls(int x1,int x2,int y1,int y2);
0 F$ O, A' k7 X void recls(int x1,int x2,int y1,int y2);
7 ~+ k3 Y' U- z& H4 R' h void zcls(int x1,int x2,int y1,int y2);' D* u) `3 d) x# U/ m' ~% y
void puta(void);
5 P& z J/ o4 a! r- K m
! B3 S# i6 t$ q+ ]8 h5 j1 Y7 |6 X+ q' l$ D U1 @
/*--------------演示程序---------------------*/
h$ _2 o L# V main()
3 L' x: [0 `7 H: M3 X: [# X0 E {
V7 v7 ]1 d$ p7 E5 |. Z7 u puta();
2 v0 \+ ^$ d; `% e+ D, P) Q, o getch();2 L9 V Q! x) j, A
dcls(0,4,0,79); V4 A" ?. ]( y. U" z2 |' q6 V
getch();( V4 B- c. @6 L3 D+ b8 F
puta();6 [% n6 T( C6 ?) @& L2 h0 l
getch();) Z8 H+ B* a x% x- V& x/ D
bcls(0,25,0,79);
6 d. J! R1 ]' S. P9 o6 B. ^ getch();
4 N& r) C& ?% l2 u6 X puta();! G" {( C; Z- O5 G1 w5 V( W
getch();& o, Q2 b& v1 o' y8 }, h7 P9 u
zcls(0,25,0,79);7 s, m# B* B- ]: T( r E _0 b
getch();% w9 ~4 |3 i1 u2 ]( i! W1 ?
}
2 l# `/ @7 R' Z* {: r. g: X /*********center clear screen(中心清屏)***********/$ j$ z: p; p0 Q; K5 t
void zcls(int x1,int x2,int y1,int y2)
# f3 J$ R* o- [( ]5 ?+ Z- c {
# e! C+ F4 L; T- u7 e int x00,y00,x0,y0,i,d;
4 ^) c$ Z0 H, U9 J4 V% }4 P9 e0 i if((y2-y1)>(x2-x1)){
2 M1 D6 ~* P6 v& F d=(x2-x1)/2;
* H, G/ T+ \3 ^' G# |7 G x0=(x1+x2)/2;/ K7 p& O% t- r1 [( `* J! e2 p
y0=y1+d;
9 _: V' u" i2 p* j" A! y' _ y00=y2-d;
% a# a( C I- } for(i=0;i<(d+1);i++)# q$ a8 ]3 ]6 p x6 N; }
recls((x0-i),(x00+i),(y0-i),(y00+i));
" A2 C$ d" [" d9 Y delay(10);
5 ]8 w- N4 z8 V* y }
/ n4 Q! N3 D% o: m+ m else{8 r0 n3 T1 N; v* G) ^9 v$ E9 ~0 u
d=(y2-y1)/2;7 V/ d4 F& A4 ~+ q4 n) f
y0=(y1+y2)/2;
3 A3 Y% k9 ^8 B b0 n x0=x1+d;. j/ t: i% W: V k9 c/ V) _
x00=x2-d;
$ j- H6 s4 x; b ?! m5 |+ ~) z for(i=0;i<d+1;i++) U: S8 t) y. u
recls(x0-i,x00+i,y0-i,y00+i);
4 ^2 ~5 u, |0 B6 V5 a4 z delay(10);/ Z9 p- Z) \# c* ~7 M& e
}/ p& j( [1 E2 n n
}7 ?7 z v6 u o1 P% t
2 c7 }0 k/ ?* o. U5 y5 Z
/************* clear rectangle side(矩形边清屏)***********************/
1 ^5 B" \4 x" ~
# I' }$ \$ a8 b! a% ]( z void recls(int x1,int x2,int y1,int y2)1 ?6 ~# i4 ^) k% [1 ~( F
{1 q$ Y( a' d( y- t- [
int i,j;
# T8 _" h# R! L1 P- m. B for(i=y1;i<y2;i++){
9 [. _( i( i5 r' W goto_xy(x1,i);
5 W! h5 ? n. N$ S3 i2 g! M putchar(' ');. _* M0 R3 ~% _; B
goto_xy(x2,i);
" `* X- d% P+ `2 c9 m9 Y2 q, t putchar(' ');% @( I/ C; p# Q, F& L' s: ]
delay(10);* B" M; P* G: M# K* D6 z2 N5 O
}
6 d- c$ X1 W q% \ J9 X for(j=x1;j<x2;j++){% I6 l5 g* O+ R0 p, D
goto_xy(i,y1);0 m2 f7 B, |3 P& {1 q( k
putchar(' ');5 x/ h1 h& P, _# ]
goto_xy(j,y2);
3 Z/ u7 G8 }( t z+ N+ Y) j' M putchar(' ');8 [6 U( S" z3 r! S8 P
delay(10);- [4 x3 i' m5 N e J& q
}- q6 @3 G5 u: W: |% v/ p q
}
! `( u$ @! S5 E0 M /******************open screen clear(开屏式清屏)*********************/
( e0 Z( }6 I! W7 ]% P! a, ^7 m5 d! H& z8 u0 d+ M2 i
void kcls(int x1,int x2,int y1,int y2); x4 }% I2 w2 O' Q: ~& H
{
! ?4 @ T& Y0 }( i; T int t,s,i,j;
( v0 I! t, q/ k& b ~5 ~ t=s=(y1+y2)/2;, j; w W# L- R( d
for(;t<=y2;t++,s--)
; r3 m1 y0 h5 @ for(j=x1;j<x2;j++){
+ H4 Z, r/ t8 X- J goto_xy(j,t);! y' b0 {' [, q% W
putchar(' ');
1 p, I/ A9 ]2 l( X goto_xy(j,s);
# u5 _2 S1 W- S$ X5 V4 h putchar(' ');, i9 S& s0 q2 }- w }
delay(10);
) S) ]& K# S. @* e }
1 v* Y/ K9 h! j Y! U }
, c) p% O( G& m/ n2 {4 H /*****************close screen clear*****闭幕式清屏*******************/
, o2 t: t; M/ \. H7 K1 P1 ]' g3 E7 N2 n/ F/ c |
void bcls(int x1,int x2,int y1,int y2)
6 G3 ?+ X* b/ v: D0 F% ]# D {
/ I! i( b$ R& X7 V: \, Q" y int t,s,j;2 O# W6 F+ x2 U: X. X1 x8 M1 D
t=y1;' w* p" D+ e% D1 M
s=y2;
, E' ^9 c" N E2 t; A$ c for(t=y1;t<(y1+y2)/2;t++,s--)
) H' ]( l2 k0 u! v for(j=x1;j<x2;j++){
; t# ?7 i9 s* W- @- q, I goto_xy(j,t);# J6 I F q" C3 Z, }3 h% \
putchar(' ');
$ @! d1 ]3 `# P; D3 m goto_xy(j,s);& J! C2 W- v' h# \/ T& z
putchar(' ');
6 v9 g" ~5 I W0 b- x Q9 F delay(10);
2 F" O5 I' t. y! G( | }
# U( n' y9 J# o2 r4 B, Q }
, \: i& O/ F' H" n /******************bottom screen clear(自下清屏)********************/; r" \4 n5 G& K' e" ] y
6 T- G; p+ `/ A% K- U, _# m
void dcls(int x1,int x2,int y1,int y2)% }2 @3 _, k0 A8 v4 e9 y+ v
{
1 u5 Q7 J$ d+ f5 }5 X8 B y- Q% C8 E int t,s,j,i;
9 |8 Y6 Y' P; ^+ e t=s=(y1+y2)/2;. F! N: Z3 w B
for(j=x2;j>x1;j--)
: w* K& @6 R; n# m% F( L& _ for(i=y1;i<y2;i++){
) D- Q# V( Q0 y; Y5 U goto_xy(j,i);- L$ j) z- ]8 V5 u5 a
putchar(' ');
1 ?& @9 ^+ ^9 I. R0 u6 Y9 g! B0 d delay(10);6 K# z1 q: K9 N
}
5 i" x; g7 E! T5 U: y t+ N }
$ a% g- x: @, T6 v+ Z: i5 G /******************设置光标子函数******************/
* `7 P# _; ^+ ]/ S3 q' e& E6 l8 R; ` c$ m+ h
void goto_xy(int x,int y)
9 n! m: @) L! |$ Y1 x# N* S# F {
* S% e, R: h9 |3 X) a3 f. ?$ g' k union REGS r;) K0 }, v' D; U$ v- A
r.h.ah=2;
: L& a; m& T' o o r.h.dl=y;
) c5 x, d7 G& u \6 o# I( K4 U r.h.dh=x;; p- j3 k7 A) o: l8 s( i
r.h.bh=0;+ k/ {" H" V8 {
int86(0x10,&r,&r);5 |9 \$ J- G' Y4 Z0 M4 H/ v
}
& G& ] L2 Q3 I6 d3 I- [5 K* H9 B% D, x
/**********************在屏幕上打出一连串的a字母用于演示程序******************/& A; z5 t6 ^/ r% L" r) n
" I# ^/ n- w! _8 s# `6 b$ b3 w( \$ d void puta(void)- p7 ~8 w S1 X& R
{* b. M y' ^3 ?- s/ M' Z
int i,j;
1 F) f) w4 J& \0 f; f% p for(i=0;i<24;i++){
) f P; K! G: a! L. m4 Z6 e for(j=0;j<79;j++){: L# J- W2 _+ Z
goto_xy(i,j);
4 ?' U$ e6 Y# B printf("a");. E2 i3 Y. U' h
}
* o- e0 i+ M1 n' c+ D3 q5 d2 V }5 @; }8 T; v7 t$ N/ y5 k1 ?
} |
|