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

|
C语言艺术清屏
问题的提出:我们在编制程序时,经常要用到清屏处理,如dos下的cls,Turbo C下的clrscr()等都具有清屏功能,但这些均为一般意义的清屏,7 o. h. P3 |( c) ^. U! z# B# ^( a
0 ~& g2 k' n/ y- T. t" x/ w2 \
并未显示其清屏规律.而有时为了达到清屏的艺术美观,往往对清屏有一些具体要求,如:开幕清屏;闭幕清屏;上清屏;下清屏;中清屏.为此,这里0 R3 w, b% L3 h: H7 j9 S+ h+ H
7 k6 \; c. I9 U% P! U5 M
用C语言编制了几个子函数,用于程序中时,既可达到清屏的目的,有能增加屏幕的艺术美观. " z$ q# m5 s- G* I+ `' g. h- ^
子函数及演示程序:
: E6 C9 _5 ^$ y: P1 O
- b3 L( G" t+ D. R' |9 O #include<stdio.h>$ D. S; a$ q. I3 X
#include<dos.h>
1 y3 Z; H; ]8 l4 |! Q$ d* ~ #include<conio.h>- B8 ~8 Z$ L, q2 _, b. @, f
) }' k, K, {3 Q1 m void goto_xy(int x,int y);1 z& U! }+ M# ]1 @- S" L5 R2 I
void dcls(int x1,int x2,int y1,int y2);: g# c5 C: F* A
void bcls(int x1,int x2,int y1,int y2);7 \4 e, G# @! A1 L; z3 M: @; t
void kcls(int x1,int x2,int y1,int y2);
5 S9 Q/ l0 Z* S4 c. ^2 v void recls(int x1,int x2,int y1,int y2);# _6 v- J/ V! Z7 A' _
void zcls(int x1,int x2,int y1,int y2);
$ z: x$ ]( [: F, G# w c void puta(void);( V! O+ m. x: }
. G, ~* {" @* z! V( j$ G& Y/ B
0 p- P6 r |! l- y' M7 B, z
/*--------------演示程序---------------------*/
% i& p3 Q% g$ k- y main()
- ^, H4 T; n) |7 @, C( }1 M {7 e& K9 \5 g* r3 d0 f8 u
puta();
* B5 B6 m+ f, T9 D getch();6 y% P4 ]7 ?3 v
dcls(0,4,0,79);
! @, O# T( y$ |$ E getch();, E% `9 X( a0 ]5 m, ^6 l! R
puta();6 i% [" S/ f: N* Z5 c
getch();
3 ?+ o, G- Q | bcls(0,25,0,79);- ?$ ?+ d3 r5 N7 x# I3 R+ j
getch();
9 c1 ]4 p' K W5 F8 Z puta();3 R+ S# \9 H: @& N
getch();
& e' l3 D9 [' u" W: A zcls(0,25,0,79);# T: t8 t' t2 V* C+ U! O
getch();
) `; P% X% C+ e' I' V, J* b$ v* O0 m }
# H0 u- O8 X! u /*********center clear screen(中心清屏)***********/+ g/ o0 Y6 `) |8 t1 R
void zcls(int x1,int x2,int y1,int y2)
/ R* v/ \2 H0 [ {
2 g ~ x! I6 d" s( C, t* V+ `8 ~ int x00,y00,x0,y0,i,d;
; K1 i( m \+ Y/ n1 r6 Q if((y2-y1)>(x2-x1)){7 P F7 ^9 M3 o5 M$ L. n
d=(x2-x1)/2;
# L1 b3 G7 y5 T x0=(x1+x2)/2;1 i, |! z% a( ?7 \) `
y0=y1+d;
" C2 `" Q' Z# O; ^* H3 N \ y00=y2-d;
$ Q% Y5 I6 j( T n for(i=0;i<(d+1);i++)
$ x2 s" j) l- Z" E6 ~& s recls((x0-i),(x00+i),(y0-i),(y00+i));' I2 u3 j5 n6 N8 b8 {, y; d
delay(10);
$ x! [# C0 l: M% v! s }2 [3 C# S, `9 D
else{
( H4 V8 n, O" e: D/ {/ Z n d=(y2-y1)/2;
+ Q% ~$ ^- y% t+ ` y0=(y1+y2)/2;* p' h$ Y O* R7 [& K9 O
x0=x1+d;6 T) g$ J- V4 z6 K0 U. c/ t
x00=x2-d;8 u/ ] q3 m0 q
for(i=0;i<d+1;i++)) [& P; e) {* Q8 {' K
recls(x0-i,x00+i,y0-i,y00+i);' b7 x; `# e% P4 c, z
delay(10);0 i& W H. D+ f( j- n5 l" M0 b
}
/ @% j3 t9 a, E }
$ Y) V5 U: D5 p9 d8 y- _3 [
7 g# L7 c( v% s2 Q3 S8 E/ b /************* clear rectangle side(矩形边清屏)***********************/$ r6 t1 F; Z+ [' J
; d! y8 @6 g6 T) M8 ?
void recls(int x1,int x2,int y1,int y2)( T/ R: z9 c8 n- j; C
{: o" G- O; n6 L( Y+ [
int i,j;% \! D/ @/ h' A: Y- W( m0 s3 B4 Z6 }
for(i=y1;i<y2;i++){
3 Z4 d3 u+ B; U, e$ r( A goto_xy(x1,i);; o- Q9 _: g4 O; j6 {8 a$ {
putchar(' ');
! S; O, c, p" ~! o% y goto_xy(x2,i);
* @5 p0 B5 v9 Z- v putchar(' ');
; V/ M. D' q+ V5 T delay(10);2 t7 A# u2 H0 C+ B* M1 P+ T
}
; @3 w9 x: S- V2 J9 C4 h for(j=x1;j<x2;j++){
# F2 Q* s/ u0 p4 T goto_xy(i,y1);
5 q9 R8 O+ E- _% r6 B putchar(' ');
: Z7 r' n; b: G/ O5 b3 u1 c5 b goto_xy(j,y2);
! d8 r2 @( b7 F6 c2 N8 q putchar(' ');
1 v! W) U& V% A: F7 d1 c& B1 [ delay(10);
6 n. x; v* A) M- I! K) a }
T) D% K+ t( R }7 y' B" y9 t: Z* W/ X
/******************open screen clear(开屏式清屏)*********************/
( ]" T1 H2 o' v; R$ `% k) A' V& }& Q, ~
void kcls(int x1,int x2,int y1,int y2)0 C; q0 P' P9 Z+ s: h+ L) ~
{
& c) e, c9 |6 J# K8 G$ r) c int t,s,i,j;
& C5 @1 H" j: k6 u6 l0 q t=s=(y1+y2)/2;
! B( l1 o* y8 Y# m! ?, f; T for(;t<=y2;t++,s--)6 [3 K5 B9 I$ \4 L# o
for(j=x1;j<x2;j++){
* c" P" k3 r% Q1 G& W' A goto_xy(j,t);0 h$ Q1 ^: V4 ]4 g
putchar(' ');0 m- j8 D% E1 ?7 E" J8 n4 J
goto_xy(j,s);, M6 Q a) a. y# U$ u4 V& k
putchar(' ');
! t" ?% P* R8 X8 M delay(10);5 x! m5 }- t3 M2 W) B0 F; Q
}
3 r) R! Q8 k1 C# U' N$ z } I% [* T7 _/ _7 z; S) H
/*****************close screen clear*****闭幕式清屏*******************/, f6 e+ W: s u
6 V7 b$ k0 N: D3 M void bcls(int x1,int x2,int y1,int y2)7 }( ^) S$ C3 h% |
{# r; Z0 i5 Z1 m* J
int t,s,j;& y+ p% C2 N& x
t=y1;! B% D. Y! c& o' ?# U8 t5 A( o
s=y2;
5 p3 I" N( Y8 M) g( x" l6 [+ o for(t=y1;t<(y1+y2)/2;t++,s--)
% N; g1 r; U4 M" D for(j=x1;j<x2;j++){& Z' |" ]4 e; G, t' G2 m) z( T
goto_xy(j,t);4 }6 B% _# J9 _$ _4 |- `/ B
putchar(' ');& t" u& \9 b. k
goto_xy(j,s);: x. g6 ]# ~) p5 A/ T) a# u) h6 j
putchar(' ');* Q9 J8 @. r/ i7 J7 o& y
delay(10);
8 ]% J- g; k; r# Z7 Y+ u }2 z1 P9 S. S) J$ H8 I
}% W; N# V6 V' c! w. C) ~
/******************bottom screen clear(自下清屏)********************/
6 a( `% U* n+ B8 V; ?4 ]
1 ~9 x3 v8 f& O& N2 y; q+ U! F void dcls(int x1,int x2,int y1,int y2)- z* S6 M C& Y- ^$ O# X) X; I
{
" s0 T+ _: x& }( T7 O w% P int t,s,j,i;( V, I j4 V# G" @ H
t=s=(y1+y2)/2;( B8 f* C6 w! E6 [& {+ n
for(j=x2;j>x1;j--) S/ S7 o& T D. o; B' A/ A
for(i=y1;i<y2;i++){
. Z& C. R" K5 v" b/ i goto_xy(j,i);
; F9 S0 v! f- \8 [6 q7 r. B putchar(' ');# j( K' r) H. Y- ?
delay(10);. ]& N% V* C9 a0 D+ G
}
5 G# [9 ]/ r2 _9 w6 D# w }; h) }4 }8 q/ u% |' G! `# T L
/******************设置光标子函数******************/3 k1 c# z; T: f- @& x$ X8 E" q
* h' l; ~( I% H void goto_xy(int x,int y)& `' q+ W6 s: u% i) L& B$ {4 X) P
{6 [- X5 o% \% C* a8 D
union REGS r;
/ H5 C; p6 W. k7 v; e/ W+ A r.h.ah=2;) y" U% e3 H6 v" n T% Y' k
r.h.dl=y;
7 T, P9 x/ ]$ Q+ N r.h.dh=x;, U2 ?: y, V4 G1 h
r.h.bh=0;
5 J" T& O! E: H+ z6 W' l2 p int86(0x10,&r,&r);# u! Z* g# a3 R
}5 M& S8 Z, |2 U j- w6 X- c4 }
7 |: u; R- H* D /**********************在屏幕上打出一连串的a字母用于演示程序******************/
' M9 S8 g" [/ T$ I2 j
& F: o. f7 O2 r void puta(void)6 B4 g$ K2 F# P) }
{
! H5 T: |8 P6 B5 p0 O int i,j;
; O, l- l! x, g6 X% u p, R( F for(i=0;i<24;i++){
% }4 e3 }+ L$ ^- @0 V# ?% T for(j=0;j<79;j++){3 y2 u( T* f! Q0 n% I
goto_xy(i,j);$ h& \4 M' V3 A
printf("a");
C4 E/ S: K, ?/ c! a) j }
6 [( L& n H0 @4 g! ] } s7 z0 j! \/ O3 e# i% F; A
} |
|