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

|
C语言艺术清屏
问题的提出:我们在编制程序时,经常要用到清屏处理,如dos下的cls,Turbo C下的clrscr()等都具有清屏功能,但这些均为一般意义的清屏,+ H0 n8 t4 L) H. V$ I
/ F6 m8 q, y0 {' S( D% E 并未显示其清屏规律.而有时为了达到清屏的艺术美观,往往对清屏有一些具体要求,如:开幕清屏;闭幕清屏;上清屏;下清屏;中清屏.为此,这里6 V# c: P/ r& l1 B) M' z$ O
2 J/ F* p! i$ n$ r- @
用C语言编制了几个子函数,用于程序中时,既可达到清屏的目的,有能增加屏幕的艺术美观.
! u0 p8 g" B9 r1 q/ _ 子函数及演示程序:
( L# ?6 x, [& }1 |6 @. Y, ^- O# M; m3 _, ]4 G$ s
#include<stdio.h>) ]1 ]/ n* H9 L8 D& j' j" L
#include<dos.h>/ @" K9 f) F/ L( ^0 J
#include<conio.h>
9 m2 L+ ~" e# [- S2 v
" z8 }4 F! L1 T1 d7 J3 o0 ~6 F void goto_xy(int x,int y);
4 w8 X9 G% B3 B6 o) s# r3 q void dcls(int x1,int x2,int y1,int y2);
! b: J2 h! O3 ~1 p/ W$ o- p& a void bcls(int x1,int x2,int y1,int y2);% |. p" B! ]* X, c
void kcls(int x1,int x2,int y1,int y2);
3 o5 o% n7 v8 ^) r0 Q' U" d void recls(int x1,int x2,int y1,int y2);5 l1 N8 p9 I- x$ p8 c% Y
void zcls(int x1,int x2,int y1,int y2);
3 ]7 H5 f8 G% M9 \! ~ void puta(void);' h" r1 R0 }0 }5 `" H
. U- H M7 F5 M& @* A: k# \
# x: [& b; o% W' p G) Q /*--------------演示程序---------------------*/
t8 S6 V% L% K+ s main()- L0 |5 ]3 w5 `0 Y% [) L
{* j5 B: Y% a& s. @$ }" a, D
puta();
; s5 B, n9 k* [- A; z' w2 H getch();
1 Q& T( G/ S2 b% [) x dcls(0,4,0,79);
( w! j3 @- w3 t# X: n2 {9 @' c getch();
, M7 o. \7 \1 p puta();
! X+ }# ], D- \7 {. |+ C getch();+ a% U" z6 {' }
bcls(0,25,0,79);
# p0 I( l4 R& i' ` getch();
9 I9 [; J% ]) G. s puta();
; F0 \% \3 b& P4 ]6 i getch(); T4 r1 \7 d) h7 E) l& O6 I
zcls(0,25,0,79);
3 i7 P+ O: B" Q/ v* l, d getch();
! _& ?+ E1 d& q# | }
0 k* l* S& E- g( ?0 j /*********center clear screen(中心清屏)***********/
" G7 ~# P( }8 c# {+ ]; ?: ~ void zcls(int x1,int x2,int y1,int y2)
: |1 X+ r% V9 M- y. E3 W& h. ^* c {; F0 J; x# {5 F2 A
int x00,y00,x0,y0,i,d;
$ k% H4 n% x0 ~2 S' p if((y2-y1)>(x2-x1)){
/ i0 {2 K$ }' B! } d=(x2-x1)/2;
k$ V% f. C# X6 c' n; [# Q) ~ x0=(x1+x2)/2;
( m( h0 g' ^& C. B$ U. x) z y0=y1+d;: Y$ H' m; I% e I. E7 K
y00=y2-d;# M, M$ y; d+ Z
for(i=0;i<(d+1);i++)
5 A2 ?$ U: K" \. \+ M recls((x0-i),(x00+i),(y0-i),(y00+i));* C' t6 |. U) z4 Q; n! u, d! G. |
delay(10);
/ c5 T% o& k* q- v( I& p }, e0 l0 M+ k9 d8 q. h
else{
; N7 j$ i' Y* U% ` d=(y2-y1)/2;
/ G2 {2 ]! o" G# r$ T y0=(y1+y2)/2;, u3 s& @! Y g7 U7 G" [. J
x0=x1+d;+ l6 u& c0 C2 d# y6 Z) _$ m
x00=x2-d;
, j4 s& ?* R, Q3 L for(i=0;i<d+1;i++)
I8 C/ i8 w N1 S+ h recls(x0-i,x00+i,y0-i,y00+i);6 |; g2 E: ~# Z- G9 u% @) v
delay(10);7 f+ S# Y# Y/ d2 o
}
( S4 E8 p& O" Q5 n4 Q5 X }
; g' |! E/ x4 p3 K: \& }5 a |; V- Y: \, \/ N" F' X# l
/************* clear rectangle side(矩形边清屏)***********************/% w' T7 M$ C# K H4 N; O% |
/ ` I$ e0 G/ V
void recls(int x1,int x2,int y1,int y2)7 w8 I' S+ H$ ^7 u, v
{
& s {& S: K" B- k+ s int i,j;) b3 ]1 L5 c" ~ x4 M! a4 _
for(i=y1;i<y2;i++){
' ?, i- [9 f: d# q& i! ^ goto_xy(x1,i);
3 p+ H! C9 R7 C9 R putchar(' ');
; Z. X' [8 v( ~3 n. f& ] goto_xy(x2,i);- q% T; b% n! Y7 e6 k9 J/ h
putchar(' ');
. o2 z, C5 q( z delay(10);8 \" }9 ~- c! z5 C+ p
}9 B! r% R4 A6 P; F& q* k, k
for(j=x1;j<x2;j++){3 O7 ]. I4 T' F" A6 ~, z7 G
goto_xy(i,y1);
5 h$ y" ]- a U$ [3 h5 [ putchar(' ');
5 y$ M8 I& j( [2 P5 U goto_xy(j,y2);- s% y: r# u: H" M) Q
putchar(' ');
/ M! y/ ~" ~, q! A7 D1 i$ z% ? delay(10);" P. O$ m; `! t' b
}% z* e* F* L( g8 X7 Q5 e% D4 W
}
7 F+ P) I+ p& [1 {- ` /******************open screen clear(开屏式清屏)*********************/. B/ u7 z2 i8 x" x" p" {& s' t
: [2 B. K1 n" |/ {9 d# q: G1 B5 a' p8 G
void kcls(int x1,int x2,int y1,int y2)
; n- ~) V5 E' Y4 N& q& U {0 ~( u0 W, K. [ L; \) R
int t,s,i,j;
0 l6 I2 O$ g& [/ @- p; z t=s=(y1+y2)/2;
" U9 h$ k0 q" t) |/ l for(;t<=y2;t++,s--)) _& i3 f: g. a Q* Z T
for(j=x1;j<x2;j++){! v! M+ \7 X4 s9 b' t
goto_xy(j,t);
4 P* |. E1 d3 D, n+ R( W# b putchar(' ');
* l1 q! C' p4 U$ `$ O0 o- `4 V goto_xy(j,s);! j3 I2 G9 B9 G) I, z; I( a
putchar(' ');
* Q/ v! v$ a% L( }2 B delay(10);9 @ A* v2 ^+ V/ J( }
}9 @" U9 ~( D n* ]! y4 p
}
/ l" U4 J, f# H; v! S& ` /*****************close screen clear*****闭幕式清屏*******************/
6 u ~5 r& S; Y9 u/ v% B2 b" A) b6 f3 `3 H i1 M7 X- }* i
void bcls(int x1,int x2,int y1,int y2)" I! H: Q; R: u1 s% ?% w
{( q; e8 L5 ~ y4 Z3 v# {
int t,s,j;
& Y% U4 w u$ q8 ^$ a* T t=y1;% x) F0 H6 m* j" a, a$ i
s=y2;
5 S8 _1 E- _# h6 S7 M- V# | for(t=y1;t<(y1+y2)/2;t++,s--) C$ m7 @5 C- Y- {4 H6 ]% A1 n
for(j=x1;j<x2;j++){! C- q! O' m+ n5 o: D6 Y# Z
goto_xy(j,t);
* |: v' E, @, T; K% L% g) e8 c putchar(' ');2 p) v, {: u% @
goto_xy(j,s);" L0 N' H( ?) A
putchar(' ');( z' `% }8 N( [' n. N
delay(10);/ a( i1 N; ^; l# H
}
5 U' h8 h1 |9 O1 d% N) i) N }# p- l/ X1 N0 V8 i* M4 X
/******************bottom screen clear(自下清屏)********************/
% Q$ B1 g% w" O6 n- l
* K* z. P+ B* L; }) C: N void dcls(int x1,int x2,int y1,int y2)3 R. M- h5 c; }' `' s% U' a
{
3 E& X; H( _7 F( P2 r- ^1 B int t,s,j,i;
* D5 j" s1 C+ v/ e/ X t=s=(y1+y2)/2;
' b2 E0 ^0 q+ L# K for(j=x2;j>x1;j--)% ^# X, c& l# x9 a
for(i=y1;i<y2;i++){0 t4 M7 u ?, n# F
goto_xy(j,i);
8 Q9 M% B* {4 \9 ?+ b5 E b# } putchar(' ');! d% P3 `( r {# a
delay(10);4 d0 ^3 [' U5 a9 r2 l; J
}& s( M( b( s( y, N9 v0 c% D2 o$ w
}! B: w8 ], l* ^5 W, s& A
/******************设置光标子函数******************/
0 z3 u- N$ m4 o' X2 l, ?) ?9 @- \9 |& M5 f
void goto_xy(int x,int y)
" r2 t1 B- y& R) @/ @+ N5 S5 t( W3 j& B! l {
5 u1 ?5 J* R$ x union REGS r;( u- I5 U+ @. G4 \1 u1 Z! U
r.h.ah=2;
5 S$ s& c2 R; s2 f r.h.dl=y;
7 Y3 X3 `' o8 K* U; y r.h.dh=x;
, {" w- j7 h- k5 t" x r.h.bh=0;
. M3 Z0 N, [2 m1 g% Z+ J int86(0x10,&r,&r);8 v4 H- ^. G# H X* j/ R' R9 J6 O
}
1 y: r5 {/ G, h7 E# G9 l) C. L9 v# b1 ~$ S) O1 v' b
/**********************在屏幕上打出一连串的a字母用于演示程序******************/
/ _8 z' j1 n( {) u$ v G
4 m. t9 {3 q$ f3 w/ W7 [ void puta(void)& z3 t3 ?/ s; z8 Z r7 i
{7 V5 v( W* ]6 t: D' _$ W
int i,j;$ M4 y+ @4 q. P4 p
for(i=0;i<24;i++){
. o, R9 H/ e$ U3 R for(j=0;j<79;j++){/ M/ u1 B* }2 X
goto_xy(i,j);
7 S% t; i9 R+ P' ]3 w( X printf("a");
/ L" |4 ]. N& P% e0 u4 @& a- b* J" m }2 ^8 F R' c1 D+ v9 H% o
}5 h* c7 z0 E) Y( _# T, m
} |
|