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

|
C语言艺术清屏
问题的提出:我们在编制程序时,经常要用到清屏处理,如dos下的cls,Turbo C下的clrscr()等都具有清屏功能,但这些均为一般意义的清屏,9 P/ m, k2 b7 w1 Z! X
: ]5 D. g. V: q+ ^& L 并未显示其清屏规律.而有时为了达到清屏的艺术美观,往往对清屏有一些具体要求,如:开幕清屏;闭幕清屏;上清屏;下清屏;中清屏.为此,这里+ _" e0 y, A- {8 J' a9 q# \. ~) r
* F; j" n# i: ]- u5 F4 M$ _ 用C语言编制了几个子函数,用于程序中时,既可达到清屏的目的,有能增加屏幕的艺术美观.
+ O. h% \% U& c" s/ w 子函数及演示程序:
/ W& E) Q9 B1 x5 l. L% ]. J# h9 {: t r# i
#include<stdio.h>
4 x' y& {$ n+ W #include<dos.h>
D$ x8 i% e" j' U; ^/ }% _6 C #include<conio.h>" M1 I9 }7 x# Y$ E; c2 c9 H' a
& l" O n' g3 s8 _' y
void goto_xy(int x,int y);
' ]3 | ~9 r9 a$ D" m& b void dcls(int x1,int x2,int y1,int y2);, X; _" E( J* m
void bcls(int x1,int x2,int y1,int y2);
2 |6 U1 }4 u" O9 U" ]! y* \4 R void kcls(int x1,int x2,int y1,int y2);% R/ [4 w( k0 _& b. g' k9 Y9 f+ M- o
void recls(int x1,int x2,int y1,int y2);
1 S9 p+ x- d2 a B void zcls(int x1,int x2,int y1,int y2);
2 m% C/ A7 K# g, U6 h; k/ r8 }7 b void puta(void);+ a1 F2 S2 F# X
* N$ ], x/ f0 P/ P5 {# v
2 _4 ~ x T- b# Q
/*--------------演示程序---------------------*/! y2 [5 b3 }1 [' F) |! S
main()6 m- \ w9 v9 d+ C' A. m* S
{
; @2 |/ s! E5 i) D0 X puta();' Y# L+ E0 n* x1 Q) p- S0 F, S
getch();! M, V% b+ |9 v
dcls(0,4,0,79);
5 [( J' j6 Y' {' d @* J; Z getch();
4 v" ^; f$ u P) [7 I5 y puta();1 a7 _* K. x7 v/ D! v2 }
getch();6 s) m1 }: d' ^: t
bcls(0,25,0,79);& W7 i& B9 M3 U. p; W( H: m, o
getch();
O. F) ~( w# V4 Q, W! O8 Y puta();
$ i/ @" z# s" u' F getch();7 H- V9 ^- n# G+ j) u4 s/ `; W0 {% m
zcls(0,25,0,79);: J' \- u2 ]( h; f1 a
getch();
9 Q7 ], {4 u; [4 H* D& [) e }. k, T9 P8 H5 ~+ o4 q9 J- E
/*********center clear screen(中心清屏)***********/
6 a8 {$ \; u' o- X void zcls(int x1,int x2,int y1,int y2)! G% C8 I" l# B* k0 o& G
{
8 j- ?9 C4 [- B2 J* U4 r7 ^! a int x00,y00,x0,y0,i,d;
2 S2 e7 M7 H2 p( Q# U if((y2-y1)>(x2-x1)){
! h( r1 p/ K2 @* Q d=(x2-x1)/2;
$ U; A% H! @0 B" I O! h x0=(x1+x2)/2;
8 D" J$ r B' N- [; w y0=y1+d;0 H( x- R8 K) [
y00=y2-d;
, b' w# \* Z$ S* p8 U" { for(i=0;i<(d+1);i++)
$ E. g1 i0 g% k8 t3 ? recls((x0-i),(x00+i),(y0-i),(y00+i));- ^9 R0 @) R9 _* \
delay(10);, f7 { m1 j3 ~! Z
}
$ h# F; X+ g( I3 D( J6 ^ else{
. o2 X, o/ q2 m$ ~. u. o( L/ z d=(y2-y1)/2;2 l G' m6 c6 ^, l
y0=(y1+y2)/2;
! L( G7 Z/ P9 \ r4 c& { x0=x1+d; ]* z6 l3 V, g* ~
x00=x2-d;
, O m6 q }8 j4 { for(i=0;i<d+1;i++)
( s! D/ u8 K/ W: h" n0 E recls(x0-i,x00+i,y0-i,y00+i);9 v3 a) y; r6 Z" B# w% B* R% s$ t
delay(10);
1 M- P9 l: @( N: ]# o }
+ A" R5 w& k* x }
- Q- Y/ I* r: z9 E+ ?% e; k M b" {" ^0 p/ X4 I9 t) V
/************* clear rectangle side(矩形边清屏)***********************/. |* u; x; r: b
7 Z4 p: D; w* b" W v
void recls(int x1,int x2,int y1,int y2)3 w8 q2 S2 q. u+ t6 `1 f! F
{: T, L; I6 v# i
int i,j;# _' W1 i. U8 C" W/ q
for(i=y1;i<y2;i++){
+ l2 _ B7 A; L ^ goto_xy(x1,i);
0 e8 [/ x6 B: @' @/ z6 Q9 K putchar(' ');
# z$ k3 w" E |* s1 V0 i goto_xy(x2,i);; z. @5 q# X3 q1 P0 c9 Y
putchar(' ');
8 y0 _% o# ~8 h, L3 t+ S delay(10);. ]% N# m7 I1 Y4 U
}8 K# m \# {1 k. G3 @0 _
for(j=x1;j<x2;j++){9 I7 k' m$ X/ P" U @2 |
goto_xy(i,y1);8 _( H7 p4 l; E$ B2 [' r
putchar(' ');
2 u. D8 \8 L; x& O# {, u$ U+ c# O goto_xy(j,y2);
! W+ F2 l+ l3 e putchar(' ');
6 t& h& |. {* ]( e- @ delay(10);, y. E1 i# j0 ~4 }% }- I
}7 f0 C6 Z2 g4 |. e. _/ g: `
}: g% N* G' t0 h1 z( G
/******************open screen clear(开屏式清屏)*********************/4 E( l8 d- v4 ?6 d- [$ C7 z$ ^
% @5 y& e4 ^! @! Z( m void kcls(int x1,int x2,int y1,int y2). X* Z4 j U1 o: J3 e7 n
{# |" C6 J( D& p3 r/ V& d! u& Y$ l
int t,s,i,j;
/ g, ~- h/ p& {' i( r( p. L1 w; o4 Z z t=s=(y1+y2)/2;
+ ~; [4 r4 [5 i8 h1 ] a" x for(;t<=y2;t++,s--)/ j; p! [+ k' i+ G
for(j=x1;j<x2;j++){) m1 h/ b& D# t8 ?+ m
goto_xy(j,t);1 k* g* G4 x9 F' x" f" Q
putchar(' ');; h* ~, \) ~ L9 k% U4 V
goto_xy(j,s);
n1 O! V7 C# K0 E3 f putchar(' ');
( g7 E# K/ U- m delay(10);
6 i5 ?2 @# a: w. | w }
) q) Y: m, }. Y8 D2 V6 [ }1 l) |2 o( C, h6 N- ^9 C! w T5 [
/*****************close screen clear*****闭幕式清屏*******************/
6 K" h) K, q- G! [! p* m+ S( M) u3 @& X" E; O$ ~
void bcls(int x1,int x2,int y1,int y2)
1 P, k2 m6 ?4 ^% c. K9 y/ s' E( X {- \6 J. J/ }, F. {/ B9 i g3 n( X
int t,s,j;
0 R, n, R2 B8 p+ j: U$ X g: R/ Q6 S t=y1;
6 B7 B) S( V4 a: l4 I s=y2;
/ T% U8 [+ g) p3 S9 v# R5 G for(t=y1;t<(y1+y2)/2;t++,s--)
+ f) p9 q# U; Z for(j=x1;j<x2;j++){
: l4 V9 O, f" r0 ?1 t T goto_xy(j,t);. v, o( Z* k. J8 s/ S9 A
putchar(' ');6 T k8 \' p9 }& x
goto_xy(j,s);# _) v Q4 L) A8 ?' ?. L
putchar(' ');. T9 t7 C# b4 h* |% _& r
delay(10);
) E. J3 u9 `- |5 f# _ }
- F0 o. x- l9 t }4 A0 X: E5 z' I! @, S, z* q. E4 }
/******************bottom screen clear(自下清屏)********************/5 ]1 f8 {: a+ c5 N
: [& w6 L/ |1 f' C* }& e
void dcls(int x1,int x2,int y1,int y2)' S# d3 A8 \# L! e
{
; O- B9 y0 R+ `% s int t,s,j,i;
4 u; L2 A* _" m0 @* ~8 g' e) p* N t=s=(y1+y2)/2;4 i+ ^. G6 }# _5 e- _. m
for(j=x2;j>x1;j--)' k0 H4 W5 r7 M
for(i=y1;i<y2;i++){
: i5 K/ E; s w8 j5 Z* A1 P goto_xy(j,i);& v1 \# `$ D2 @6 L
putchar(' ');7 X3 c W; q6 n+ l1 I3 P# P" m
delay(10);4 ]( K9 p- Y" H: z
}
, e7 O3 }$ b3 Z5 n' u( r" f% C9 d6 z }* v8 b) G6 d3 X
/******************设置光标子函数******************/
9 k/ Y' R* H3 w; ~+ @: {. a9 d) h" E
void goto_xy(int x,int y): b. V, f2 X. d3 f, ^
{% J: R8 W* c0 Y1 r9 [( Y; j
union REGS r;" p* l5 N; v9 c) @
r.h.ah=2;5 Y6 W0 u+ G6 v
r.h.dl=y;* W# K7 [( u Y% Y
r.h.dh=x;3 `( t( { N3 s+ a8 s
r.h.bh=0;
+ @% Q$ Z" \+ @0 \& V4 O int86(0x10,&r,&r);* g1 Y. c8 O. u5 ~* z& c1 U. s
}
! W) f+ W/ n% E0 k2 o% r* W }+ l6 A
/**********************在屏幕上打出一连串的a字母用于演示程序******************/
% d+ d: e+ Z3 ^/ _ @% Y" J5 K5 _. q/ ^/ Z
void puta(void)5 P* Z# s1 @/ r* {) I/ k' u: R
{- ~- ], {. X: x( b9 L) m9 v2 d4 Z
int i,j;( G# Q" |1 N% X
for(i=0;i<24;i++){/ ]5 k1 G) B) Q6 e
for(j=0;j<79;j++){
6 q% ~5 `# X% d6 T! J! u6 [ goto_xy(i,j);
# K6 y' X, \( |# n7 F printf("a");# o6 j- y$ a) l: V% t2 F9 ?. N. M: W
}
, G/ {1 h$ Z4 K3 N$ o5 q }
, j( x+ C# r/ D! ]4 { } |
|