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

|
C语言艺术清屏
问题的提出:我们在编制程序时,经常要用到清屏处理,如dos下的cls,Turbo C下的clrscr()等都具有清屏功能,但这些均为一般意义的清屏,
; p& q' c5 o* E+ X% ]: o: N. h$ K2 g: f/ p* \
并未显示其清屏规律.而有时为了达到清屏的艺术美观,往往对清屏有一些具体要求,如:开幕清屏;闭幕清屏;上清屏;下清屏;中清屏.为此,这里' e, B( e; a9 e; ?, _2 l
$ I' r7 I& B6 @1 V+ z) n
用C语言编制了几个子函数,用于程序中时,既可达到清屏的目的,有能增加屏幕的艺术美观.
# z$ C: C9 e7 S5 A 子函数及演示程序:: e2 d% b2 o9 G4 V
. W3 Q: t) i+ Z- k
#include<stdio.h># O! B2 I" R% u( H
#include<dos.h>* h1 o& @. x# D' x" \
#include<conio.h>
" t& z+ o4 q9 j( m# c4 D H/ ~. ~
. q2 H7 e V* I( j) O7 e9 V void goto_xy(int x,int y);9 }4 j6 N: W9 N, Y
void dcls(int x1,int x2,int y1,int y2);
0 }, c8 @& w5 ^6 x( y7 p# I void bcls(int x1,int x2,int y1,int y2);1 _- d; x# I# F9 K. |- r
void kcls(int x1,int x2,int y1,int y2);
/ K8 J! S+ [/ Y/ x) F void recls(int x1,int x2,int y1,int y2);) n" W3 W. d5 r: S
void zcls(int x1,int x2,int y1,int y2);: b# p' x, D( s3 e! \0 F# X
void puta(void);( l5 f3 g2 r! J( a3 z- V! |2 W- H( I
$ b& V" h L2 K I' R2 Y
6 c% J: X4 i; V$ g n /*--------------演示程序---------------------*/) B, f$ N# }5 R
main()3 k: v7 x; B$ z4 |# f' ~
{
/ E! N. f" q; h$ e# L0 e+ S puta();" D: A) s4 G8 ]9 p; b% g
getch();5 i4 {3 ~0 ?7 e1 x$ ?" W
dcls(0,4,0,79);
- B3 }- G# V+ {2 u+ [( t( U getch();. o0 _$ f6 Z: C o% ~
puta();0 f, n" l8 x8 t; w/ R
getch();
' ?7 G) h' s- j& n: t bcls(0,25,0,79);5 N: V6 L: i; N' v1 I8 l0 b6 U' c$ \
getch();" | U! ^- R0 s" S+ I9 Y* P% P
puta();
4 C9 h6 x! G1 B8 j* q getch(); x1 A: Q' L9 q1 D+ _
zcls(0,25,0,79);
' D) g7 ^" O, W, ?; P getch();2 d! c. @% E2 M( j+ L: `2 y
}
9 A; {. Q: v6 k) J' H4 L /*********center clear screen(中心清屏)***********/
1 i8 c( }% {- p8 f$ V# z5 { void zcls(int x1,int x2,int y1,int y2)
6 U B1 W, l5 j$ [) O8 x4 | {
* X( H8 ?) Z8 J \" g int x00,y00,x0,y0,i,d;
/ C: D/ k, ]1 U7 D, P/ }, W if((y2-y1)>(x2-x1)){
2 P, H* s, \* X' r1 d% A$ v d=(x2-x1)/2;
6 V+ j) o2 }; Q$ ^& z/ Z7 N2 l x0=(x1+x2)/2;( t: G, k+ s' v+ {
y0=y1+d;0 _( i( A7 B2 C) _! {
y00=y2-d;
+ V& D" n, k% _1 v) `% m7 x) X for(i=0;i<(d+1);i++)
2 d) T* l6 o, B% p# ?+ H recls((x0-i),(x00+i),(y0-i),(y00+i));
/ V$ O5 Y( \6 p* D- G delay(10);# D% m& ` |* y1 S
}
' X1 o, [- @3 w" Y else{
: V5 A- x$ U, o1 ^' X8 U% S8 v& N d=(y2-y1)/2;8 U3 |1 }5 x" q0 J2 Q/ \/ c
y0=(y1+y2)/2;
* p5 w l1 G' ^" u x0=x1+d;
& B! x! Z+ O( ?+ G0 u x00=x2-d;0 \& M; X. J, e# M: _3 a* Y# S! I1 Z
for(i=0;i<d+1;i++)
6 k7 o: P( z# N/ w; l, Z recls(x0-i,x00+i,y0-i,y00+i);* u( b) e( u+ V: e
delay(10);: M+ |- m% s3 D3 g5 p9 B
}* J: F* r3 Y: X% S
}
9 C% s" c3 I/ B% m6 s+ l- m; C9 ^- i/ t
/************* clear rectangle side(矩形边清屏)***********************/
V7 j+ K& _3 a3 Y. w$ U: G) z5 Y& W) z* l5 k- V J+ {& K2 }# E6 V
void recls(int x1,int x2,int y1,int y2)
: T% _( A% t& c5 I3 [+ b {$ G/ Q: G; e$ Q1 x* S3 F
int i,j;
# k. Y( a3 C7 r; Q6 ~$ G1 R! d* B4 U for(i=y1;i<y2;i++){- b$ Y( Q9 i$ j- T
goto_xy(x1,i);
. N2 c+ C0 v) B# |; ?% F" v t6 l$ ]* @ putchar(' ');
1 J, T: ~9 ?9 ]) ^0 t goto_xy(x2,i);
; {: `+ q/ j$ {- b: `2 H1 u+ V2 w! R putchar(' ');
! Q( l% p0 }. d delay(10);; s* o* F N& z5 m |0 s
}
2 z8 n( O# b2 `8 O: s6 m for(j=x1;j<x2;j++){
( a! e3 A8 U3 E8 J; Z' H- V goto_xy(i,y1);
( v- ~ A, F! Z putchar(' ');) T& P/ {% X+ H( q% S) P
goto_xy(j,y2);
5 V: L8 \9 \/ y6 o2 } putchar(' ');
8 y- s- f# l! B- t n) a( C8 L delay(10);
- S4 M h; Q7 A) H' j }) M' b1 ~; B4 f# o" r, D5 K
}
0 S$ r9 Y# a0 [5 W7 E" B- ] /******************open screen clear(开屏式清屏)*********************/0 u) z5 {# ^- S; U$ m
6 U' A$ ? {9 s
void kcls(int x1,int x2,int y1,int y2)
3 h, D9 O# _2 b; K9 i {/ @6 I3 y5 F* a2 i! }5 N6 s Y
int t,s,i,j;
1 a0 f5 `4 M1 K: U+ E t=s=(y1+y2)/2;
# O9 t7 n6 t- o) \- P* E for(;t<=y2;t++,s--)
* h: Z# x# n* p# B$ h1 a) J for(j=x1;j<x2;j++){
0 ^ B! O. F+ U' D) B goto_xy(j,t);2 o+ N6 O" C7 a- D
putchar(' ');
* x: [( u b. Y, G goto_xy(j,s);
% Y9 w+ p& z/ h" | {; x# q& L( J i putchar(' ');
' R, m1 R8 H" f- ^; {" Y delay(10);
2 y# a0 \- }9 }' t' R3 Z0 d }% N+ V4 y c0 _/ E% f
}) |4 [( Y" g, o2 a6 G
/*****************close screen clear*****闭幕式清屏*******************/
( R. N2 ]- s# R9 R q- O# L% a
6 p+ {) N; y% a, a$ M- u# n void bcls(int x1,int x2,int y1,int y2)
! z) B' l' M( f) B9 G3 F4 V# [ {
; ~5 q& q9 s9 ^+ j( O% E% a- \ int t,s,j;; p' h6 {* p$ P" Q" U, z" k# o$ g
t=y1;
/ f8 \! I& q' L+ M; n s=y2;
/ a W% M+ H. [" J' i6 T+ ^, s9 g1 T1 y for(t=y1;t<(y1+y2)/2;t++,s--)$ x* Q# C+ h' y+ e3 @
for(j=x1;j<x2;j++){
8 L0 S8 D7 D1 i- F I$ s. i goto_xy(j,t);
7 i3 h& J( i0 V% T, ]9 R! [+ R+ v putchar(' ');
2 Z: J/ k! @9 S7 e goto_xy(j,s);- b n9 l; h: u+ d/ A
putchar(' ');
+ W: h2 i2 s) `. }2 F delay(10);. [. b. J+ D4 v% j+ [ ?+ e- w
}8 z9 i; ]' f: b0 i
}
b; x' m" s' A( x. s /******************bottom screen clear(自下清屏)********************/
* G& }# ~9 w& {" s1 @( t0 |9 u( y# Y4 H, ^$ z2 O6 }. |1 C
void dcls(int x1,int x2,int y1,int y2)7 R6 b. ^& I0 a! Z
{% D/ n: [% |/ V$ E7 O
int t,s,j,i;
$ \* e: n) I& Q/ f. p t=s=(y1+y2)/2;
+ E- J; J' F1 n- U+ d# \: B& I3 k for(j=x2;j>x1;j--)
8 h& i, S* F9 P for(i=y1;i<y2;i++){
* V+ V) e% ?0 M* k goto_xy(j,i);
( A8 n0 R& B/ R* }- M putchar(' ');
6 E& p, R5 H! O8 ^ delay(10);2 `( x# _8 h1 Q' W; D
}6 v u i3 z- F/ w* r0 S
}
7 B' J9 M/ k! T+ M7 j J /******************设置光标子函数******************/
( P$ c5 X* B. e* `1 X8 D& S! t3 h- d6 K3 v2 D9 N, Q6 J
void goto_xy(int x,int y)
6 K$ l0 O/ P% X" C1 S+ Q5 g {
?2 ^! x5 b6 f( i( K. d union REGS r;
" z6 {9 h) ^1 j- ?2 s r.h.ah=2;+ E# L( x; k$ l, k' ~; q
r.h.dl=y;9 ^! W' G2 h i3 e# s/ X9 E: Z
r.h.dh=x;3 W4 z) C/ W9 V K" ^
r.h.bh=0;. L& X! H0 G9 V1 s9 Q- F
int86(0x10,&r,&r);
( o1 x% ~9 i3 r _: p$ B: S }, {! a4 o" N# x7 {1 k* s
& w5 L* w6 F3 c
/**********************在屏幕上打出一连串的a字母用于演示程序******************/
; P: A' r% F7 C
6 K0 Q+ C3 B, L9 B6 w& K# l$ { void puta(void)
2 `3 s; y; r! S3 v {, \7 h& x: [, R" f0 {9 y
int i,j;! Z' @9 x; J: E& H, p
for(i=0;i<24;i++){
% O0 U& N j. W8 ^5 l. I for(j=0;j<79;j++){
$ I+ s0 K0 a% t1 E, s- o6 R goto_xy(i,j);
4 O- W% {8 `: n printf("a");9 O; v2 K+ {1 r
}
6 K. Z: H: q: ]# s }
2 U4 N) M' L- l) S/ Y$ M } |
|