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

|
C语言艺术清屏
问题的提出:我们在编制程序时,经常要用到清屏处理,如dos下的cls,Turbo C下的clrscr()等都具有清屏功能,但这些均为一般意义的清屏,
3 s: [3 J S4 x7 v
4 T) y+ `( d9 W0 K& a( y" L 并未显示其清屏规律.而有时为了达到清屏的艺术美观,往往对清屏有一些具体要求,如:开幕清屏;闭幕清屏;上清屏;下清屏;中清屏.为此,这里; P+ D* S; p: `! H0 a' t; o2 m
6 T* H5 A% E* S1 Z 用C语言编制了几个子函数,用于程序中时,既可达到清屏的目的,有能增加屏幕的艺术美观. $ a: T" w! |) ?( s8 K6 j3 Z2 e
子函数及演示程序:
$ p3 J5 ?! F7 r: U( Y
: O( V" n# }5 r2 U. I" w5 y c$ X #include<stdio.h>* G! t* R; g$ x4 E
#include<dos.h>* b8 F: k- x" P
#include<conio.h>2 B2 A2 Y/ C! o2 W Z3 ~0 K/ V9 r$ s
( u5 I# g# Z. N/ S9 e' D5 y void goto_xy(int x,int y);
7 t/ J5 n" t+ k I void dcls(int x1,int x2,int y1,int y2);
' u: p' I" o9 R' E" ?* P7 e void bcls(int x1,int x2,int y1,int y2);
: Q# W& b" H& K5 Z& `( l void kcls(int x1,int x2,int y1,int y2);
& g3 u1 L% O/ D) Z void recls(int x1,int x2,int y1,int y2);
. S% k- ~0 ]! v void zcls(int x1,int x2,int y1,int y2);* l9 B2 {' ]; q" E
void puta(void);
! X- J0 Y8 D+ j3 m" O, M* d: c# _3 |* Y' x" x
; `- H; o$ _ x. N8 [, d0 P) j /*--------------演示程序---------------------*/
6 j9 k7 J8 f4 z$ Z1 r) {9 f( x) O main()' P& s4 p8 t- p7 j; i! G+ P
{0 F! }0 g' h! \
puta();
2 d; d, j8 H0 x; R! M getch();3 A0 X; r, L5 _- V
dcls(0,4,0,79);. a7 b7 W4 { c3 x9 i( L1 A
getch();
3 u7 _+ X1 ?# Y, k4 n7 O1 _# Y3 M- X puta();
" w( G3 p; c: k, y3 H getch();. D6 o- M1 p, T% ]
bcls(0,25,0,79);
" j4 G; l( Q6 o+ u* [/ o9 R getch();
5 v: S5 d9 S7 n puta();9 W# k' ~, _$ g, G% ^
getch();! [! I; n7 R( H( i
zcls(0,25,0,79);
. @# M$ u9 y. Z6 I: `+ q" v8 E getch();
0 e8 s$ X$ O8 ], E8 d6 V/ _ }3 T6 `) _3 @3 Y) w! P- b% l
/*********center clear screen(中心清屏)***********/
% t2 Q. \& A9 w9 c" t void zcls(int x1,int x2,int y1,int y2)
! f& f6 V7 F. R" { {
7 J$ P" \/ l3 Z% K8 z int x00,y00,x0,y0,i,d;
) }0 c) A* |1 Q v" a+ F if((y2-y1)>(x2-x1)){% Q1 a1 y: f6 j4 S9 k
d=(x2-x1)/2;# E3 y, f7 G. U) \
x0=(x1+x2)/2;
7 G; B! j2 L0 _$ f, m, V5 X y0=y1+d;& {1 _5 ^# F( c4 n+ r6 L9 n
y00=y2-d;, e3 c' n7 R+ o. I m4 O
for(i=0;i<(d+1);i++)
6 \2 P" d/ m* W' B C( D1 @3 ^ recls((x0-i),(x00+i),(y0-i),(y00+i));% x) G1 U/ x& i/ K' q0 J- z
delay(10);4 m" R! O! `! E2 c
}
6 ^, t4 y4 B* J ~8 r8 i/ Z else{6 q7 m( ?5 v9 B
d=(y2-y1)/2;
3 h# d& s4 ]$ g1 E2 A7 X1 u4 j y0=(y1+y2)/2;; X. `' d; K5 M3 w+ i$ F. C1 y9 F
x0=x1+d;
; {6 o4 g$ G' W' K) A x00=x2-d;
; A. U. m7 U' _" q for(i=0;i<d+1;i++)
2 i! \8 _$ g3 R* Y! n" y recls(x0-i,x00+i,y0-i,y00+i);( ]$ _8 O1 w6 M
delay(10);" o1 q: A1 z7 G0 q F1 M
}
w% X: V$ z3 G! g1 \ }2 w) M) q3 U! |& O6 E3 m, K
( } C- e5 i4 i) `5 r6 g /************* clear rectangle side(矩形边清屏)***********************/
2 ?/ x" h( y* S+ q. O8 b/ U
$ J6 F# G! s! n2 ?) M& o void recls(int x1,int x2,int y1,int y2)0 ~( c- o1 V7 J! \
{
) m# K% x9 h" O int i,j;& J S! q9 K, ]% i, S- m
for(i=y1;i<y2;i++){
) U: k1 g& y9 A. W/ n1 @ goto_xy(x1,i);' p( [: [6 B6 w$ Q: ~8 V! L& r7 O
putchar(' ');8 D' ?* Y/ C9 Q8 |: E u
goto_xy(x2,i); z0 f2 a0 L! C* r, \- H" A
putchar(' ');
- N' P: G9 G5 L$ ] delay(10);( Y+ b( W, c) L
}, ]- O& P$ a2 B Z7 c
for(j=x1;j<x2;j++){# N4 ^, X z5 t2 Z
goto_xy(i,y1);
3 V2 }5 V* B/ G' R1 i% E- D, B putchar(' ');: p! b0 `) e$ W& x. |1 E
goto_xy(j,y2);* D$ u8 ]; s; P$ }" C
putchar(' ');
% h' ^" J# t& ], T delay(10);/ o' p- k7 o" N% A K; J
}; \$ _7 ?- S& ~( _$ G5 ]+ b0 M
}' n6 z& B( |8 t0 i* h
/******************open screen clear(开屏式清屏)*********************/
; g5 Y$ U# Q8 q7 J( k/ @% ? i/ @: t, [+ W# S
void kcls(int x1,int x2,int y1,int y2)
0 _9 S( z4 v7 X$ J: [8 |, e" X {/ D2 T5 X! b; ~- m Y' C
int t,s,i,j;
; ?. u, C1 H) F: D2 q t=s=(y1+y2)/2;
& e* p# D( a/ E, g( j for(;t<=y2;t++,s--)$ t3 w( \' d6 ?- t
for(j=x1;j<x2;j++){- Q$ z8 T/ ]% C5 D
goto_xy(j,t);
! T. k0 Y& t8 b putchar(' ');
2 X) r0 W4 \- d% w/ j: ~+ q goto_xy(j,s);) Q& H9 U0 P: K
putchar(' ');
$ ^0 J7 v. M% f delay(10);7 ?0 O& _. B$ }7 u
}7 |1 f7 E8 e/ t
}8 Y" O3 g4 T2 i, s5 A+ n
/*****************close screen clear*****闭幕式清屏*******************/
2 S# V4 q3 w- a8 N* E7 o
" n# s, Y8 i/ u- m* G, A8 V void bcls(int x1,int x2,int y1,int y2)+ e' P8 c9 E' z; Z e
{% V, L" T4 L! K
int t,s,j;
1 q# f! v8 h& Z t=y1;8 S- v- D3 ^% b L" R1 ]( A
s=y2;! e* [2 d! G7 y" b n2 d
for(t=y1;t<(y1+y2)/2;t++,s--)/ d, ~) n& h2 Q7 N1 z
for(j=x1;j<x2;j++){
, x! G) ^' I4 g) I3 t; t goto_xy(j,t);
8 z/ [: O3 h& G# A" t putchar(' ');7 q3 I! G2 N0 W; g3 s
goto_xy(j,s);) ?9 S, A4 _) E+ h
putchar(' ');
) j! Z9 N8 V3 M" r2 C% @: ^ Y delay(10);
9 ?; ^% T& u) Y/ \, l& @$ K }
& H; s5 P. o% e4 _$ ]2 H V' b }
- T( O" R f( w: r5 W /******************bottom screen clear(自下清屏)********************/1 F( |# ] C% }0 @$ Z1 A5 d
3 [; [* o- W; M+ q9 W1 y2 Z
void dcls(int x1,int x2,int y1,int y2)
) ^) B8 j' J) u. n. n2 e {
1 x0 b! C, q. O2 B+ r" \; D int t,s,j,i;
6 E" d4 Q2 p( E$ ? t=s=(y1+y2)/2;
6 ~1 G9 H9 ]. a3 B for(j=x2;j>x1;j--), v6 S$ t5 }1 q. c8 G$ P
for(i=y1;i<y2;i++){' N' x0 S% |6 q* [3 i8 B( X. l
goto_xy(j,i);
3 `5 u4 e o0 J- s: j: j5 p putchar(' ');1 P( Y, m6 f4 U6 j
delay(10);
' u0 w8 Y: v$ \ }
( j4 S% V; A M. r7 ] }9 @# u4 I$ l, e, c( Q2 {
/******************设置光标子函数******************/, T3 _) \/ P% H, i. J2 g z
{1 n' e) ^; U
void goto_xy(int x,int y)
' j* I9 s y8 w5 K" D {' z9 l5 {+ v. ~1 F3 t4 @8 y- U1 v
union REGS r;; I5 P, u+ V& }) Y! y# a; t- ~
r.h.ah=2;2 f ^' C6 |* z# b/ t. M' c
r.h.dl=y;; p+ p( P0 [0 B+ s% J
r.h.dh=x;
1 ~% ?# f4 A: G+ [0 i r.h.bh=0;6 k- a: t6 q. g' [" b9 B: \
int86(0x10,&r,&r);7 h* E. r0 c* |1 M5 I+ K
} h+ I) @& F& \! V
/ ~# ~4 u8 X& H7 P /**********************在屏幕上打出一连串的a字母用于演示程序******************/% r1 \* h) Y& f, Y" B% K: A2 u
) y; ~% Y% E4 C2 t5 D. k void puta(void)6 H, {$ f) g5 O0 ?5 i) j% D
{
3 h0 g8 {. b0 f int i,j;& E& b5 w7 r9 m1 C0 f+ Y
for(i=0;i<24;i++){* @# b# K, u8 W4 d$ ?
for(j=0;j<79;j++){
& [% o+ S5 m& m0 I H* D+ \0 |8 M goto_xy(i,j);) h5 `( f$ s! C/ f
printf("a");
5 @ m7 A# o1 [ }
8 V' |1 u2 t: I }/ f8 a, P& ?( l8 j* Y0 l! K
} |
|