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

|
C语言艺术清屏
问题的提出:我们在编制程序时,经常要用到清屏处理,如dos下的cls,Turbo C下的clrscr()等都具有清屏功能,但这些均为一般意义的清屏,$ p }' q) s; c
( p& V- _3 K% Z 并未显示其清屏规律.而有时为了达到清屏的艺术美观,往往对清屏有一些具体要求,如:开幕清屏;闭幕清屏;上清屏;下清屏;中清屏.为此,这里/ @/ h6 `; M3 }8 B* N
! }3 k: f! x1 `/ a
用C语言编制了几个子函数,用于程序中时,既可达到清屏的目的,有能增加屏幕的艺术美观. + s( A5 o1 S3 u9 c5 e6 T! j
子函数及演示程序:
- W9 D! u% J/ }
7 l2 {3 @, o( Q o1 h7 D #include<stdio.h>
w6 w7 [7 K3 d$ k$ R3 q6 j #include<dos.h>
8 x. g; c+ U& a) }! A0 n #include<conio.h>$ e2 ^! {5 ]# j2 D" @* m' I; r
6 K, _! ~5 Q3 [! ^# v) B- g6 | void goto_xy(int x,int y);% K! L. o2 r- @( s
void dcls(int x1,int x2,int y1,int y2);
2 h9 |" ^' w- ^; { void bcls(int x1,int x2,int y1,int y2);
! f1 w$ @1 _. ~" R9 ?4 r+ [! ? void kcls(int x1,int x2,int y1,int y2);
& }: t3 P9 l/ J void recls(int x1,int x2,int y1,int y2);" Q# s: j2 W* U4 Y* S$ S0 L& P) I! Y
void zcls(int x1,int x2,int y1,int y2);5 T1 \ L6 J* \8 ?7 S
void puta(void);
1 X" [ O0 ?& u; ?2 t$ Z, p
* Y- R5 |; l* t( D$ \: r/ C) Y. {+ L2 U7 o. D% o* J$ m, j0 [) L( }! j
/*--------------演示程序---------------------*/$ n) h! L1 b o% |
main()' m1 ~. `& N- M
{! M( l" g, z, v9 W$ f
puta();% ?3 I4 Q* G6 z! u
getch();
/ v* f Q- v# `/ U6 V3 r dcls(0,4,0,79);
& E/ E& M+ U( k( ? getch();
( o7 N) _0 n" { puta();
! n9 m$ s, X9 @3 ^& z getch();( o5 ~: x0 c" E6 \
bcls(0,25,0,79);
5 u* \7 T7 B* R4 F' ~ getch();" H( _9 C2 y; Q g0 _
puta();, o( y; T, l! H
getch();5 P' N1 r1 Z0 p( c! n" z' j; k C
zcls(0,25,0,79);9 `& E0 g6 u0 x! s
getch();$ P6 X3 W" e& u! |/ T
}
. S: C. }9 L# n8 }& ~ /*********center clear screen(中心清屏)***********/
% n7 F+ k* G4 I( h void zcls(int x1,int x2,int y1,int y2)
7 ]2 l7 e& U$ @4 l w$ S8 j% Q {8 W$ c+ Z! X9 s, f' o l
int x00,y00,x0,y0,i,d; w5 z X2 l1 m- j' }$ r* S
if((y2-y1)>(x2-x1)){
( n9 X. A2 ]- ]$ D, @4 H% t m d=(x2-x1)/2;# h$ |: w6 I5 w! r
x0=(x1+x2)/2;
9 Q6 J; Q) \1 ^, V y0=y1+d;
* ]/ U1 l5 j6 V' K( Z5 p y00=y2-d; r% S/ p( |1 x& [) {7 g8 j0 G
for(i=0;i<(d+1);i++)
3 u+ b0 L F I" D recls((x0-i),(x00+i),(y0-i),(y00+i));
, x$ e. A( K$ |% u delay(10);+ M o8 ]5 Q( a" ^% g8 ^0 M
}3 v% e$ O/ X3 \/ V8 f2 Z& H& t
else{
$ B, Q4 n. j, b! M& Z! X d=(y2-y1)/2;
4 g% g; w8 V; j8 X* O y0=(y1+y2)/2;
# g; U* `8 r) S D b% {3 v x0=x1+d; d7 U j V3 R) G/ D4 }( I
x00=x2-d;$ b- s/ r" b- [7 Q, K/ L/ z
for(i=0;i<d+1;i++)
1 H, w; F8 t; Z recls(x0-i,x00+i,y0-i,y00+i);0 x( A7 R( S3 U' c% I
delay(10);
! m9 e: [6 r& I }
1 ~( [( i1 N# ^+ l) N, w: H6 h* ^ }2 K( s: |8 H# n. ~: C% `, @* h! H8 s
8 d' J5 F& E7 o ^* d /************* clear rectangle side(矩形边清屏)***********************/0 D$ t& x: B! N8 z* X5 h
+ [* s8 S/ }( \9 v; q" {
void recls(int x1,int x2,int y1,int y2)) p5 i. t1 E8 k/ Z! f }
{
; z- ^# X+ x, z2 x+ b% G. l int i,j;7 K7 x& R5 O0 B9 d( P
for(i=y1;i<y2;i++){
- M4 r6 Q7 v6 T7 h goto_xy(x1,i);& B- c& {( n% ?% q7 Y8 s3 P
putchar(' ');
7 Y% X% _7 \4 M7 H9 Z+ G3 C9 ? goto_xy(x2,i);
2 h( K" O5 D0 g% T# i& H putchar(' ');. I" j. |4 F7 I
delay(10);0 G! |5 q \* |7 w- o" {. _
}
7 x3 H+ b- B' H7 P# N/ { for(j=x1;j<x2;j++){& t/ s' c0 N+ t
goto_xy(i,y1);! p8 l& J) |5 W* s, {$ e3 f
putchar(' ');
% }) ^% K M+ V) I$ A. M- `( n goto_xy(j,y2);
H0 o: b( O3 V- j2 i. a+ b putchar(' ');+ J3 u$ x, R/ u7 U
delay(10);
8 a" i% d& ]- e- s' V; q8 i: v D0 [ }/ m3 A3 Y+ g& \( [, F
}
0 O0 N/ T: c; `1 e3 u. @$ K9 G /******************open screen clear(开屏式清屏)*********************/
# S3 p4 `0 h+ Z4 |, B* A3 h4 T8 ^/ N/ `3 G$ _% ]
void kcls(int x1,int x2,int y1,int y2)
F# b/ A" |( O* E; a {
) m2 e% R) K7 C/ E0 ]# j6 K int t,s,i,j;
' f" V# d1 p& g, D) T t=s=(y1+y2)/2;2 Z s- t2 H* E
for(;t<=y2;t++,s--)& p, ]* j4 x' A5 Y3 ^3 R" [
for(j=x1;j<x2;j++){
4 e3 [ w: s: g/ Y( P6 [ goto_xy(j,t);% T8 P5 J( Y$ z9 H2 p( S6 ~2 G
putchar(' ');: u. \/ b/ |' W% [
goto_xy(j,s);
; \( q& `2 V# G- o putchar(' ');5 F$ @7 u1 \+ s7 u/ {
delay(10); U, v! D5 g3 y- K, t: q; `
}
8 M- f2 s* l/ D1 o' f }
3 m$ y' n$ @( E8 O) c, J$ U" P* @ /*****************close screen clear*****闭幕式清屏*******************/: Q2 ?* Q5 _$ c; s
6 r4 O8 T; ^, \. o7 j
void bcls(int x1,int x2,int y1,int y2)2 o$ O8 l" B# h! |
{
9 o- a7 F7 \( q/ Z, l5 [' a int t,s,j;9 O/ d# C+ c i; s; b3 r
t=y1;9 l: N3 `2 ?* ^
s=y2;
1 @1 E8 O6 v7 g# r: O, d for(t=y1;t<(y1+y2)/2;t++,s--)4 @% z! o6 S! M5 w& k& N+ Q. S
for(j=x1;j<x2;j++){
9 `, f7 M y8 W" f6 c' l- S/ x goto_xy(j,t);4 @9 A, \& v8 w2 H3 N% @: j6 p4 F
putchar(' ');
: F3 L/ ]4 x, o5 R) \; W goto_xy(j,s);# @5 ~. u) m. D! H
putchar(' ');
3 N; n2 u: ]0 |6 j" r delay(10);6 K: L- x/ v K6 {
}: p) f/ O8 i& N6 l& }; | }
}; k% I$ B3 y4 K! `# c" W
/******************bottom screen clear(自下清屏)********************/
3 o: H( ?: ^! X; g7 q0 E, j7 ^
6 k. R7 k5 B, x Z# i; o; T void dcls(int x1,int x2,int y1,int y2)
0 @. h& b& `" e6 K {$ L4 U" j' {4 R/ [
int t,s,j,i;
! h$ ^ x N0 H7 B! H5 w/ O t=s=(y1+y2)/2;+ ?% v3 |( @4 O* F: o
for(j=x2;j>x1;j--)( V7 n; T: s% T; N; Q3 i( g
for(i=y1;i<y2;i++){
" _ A' T0 ]9 l# B: r9 n5 i goto_xy(j,i);
: `. f( s. N& y; |9 q5 `' b9 g putchar(' ');% u' M5 R* c, T' g# o2 K
delay(10);
8 G9 N% y6 M5 D" _, J$ S! }. n }2 N2 o( d/ L/ v" Q( ^
}" f5 h# e& U) u; `! X2 `
/******************设置光标子函数******************// I# `% a8 l+ ~/ s( E0 \
% J# z# I( @. e void goto_xy(int x,int y)+ p, t9 O& k2 \9 \& I7 T
{% q. q& ~, T2 t- s! U% \
union REGS r;
5 \$ B; C, K: x5 e7 @; D r.h.ah=2;* n; u* N) R0 t4 w
r.h.dl=y;
4 z* w, \6 m* l5 z7 T& w. D r.h.dh=x;& U! R( _: s# P5 d2 m
r.h.bh=0;
' L; H5 ~5 F% f1 o& x2 i- U int86(0x10,&r,&r);& X) f, Y1 V! Y( m9 x
}
4 e; I' ~( @1 d3 @( ~; }9 W) M
/**********************在屏幕上打出一连串的a字母用于演示程序******************/! Z5 `! r8 s9 N5 Z9 G5 Z% g
; P8 c5 P, a" D' x, F% D/ d* G' M void puta(void)
( T" e c, G" x. ] {- q: M8 e% O( T7 H
int i,j;) Q* ^" t" M: [ |+ v" u o
for(i=0;i<24;i++){
9 M# D- g. y% j& D2 D for(j=0;j<79;j++){
q2 m8 _! ~5 R0 m goto_xy(i,j);
$ h3 e" m: k8 \* z- L printf("a");
" t3 w! A* r7 j0 Z }, A( }+ Y0 W! u" d" u+ r9 ^
}9 l3 K/ x8 |7 U2 ^ i1 U! @
} |
|