C语言艺术清屏
问题的提出:我们在编制程序时,经常要用到清屏处理,如dos下的cls,Turbo C下的clrscr()等都具有清屏功能,但这些均为一般意义的清屏,/ \; m2 G' [, @4 D* `; I
) o! A( x1 j' D5 F5 L
并未显示其清屏规律.而有时为了达到清屏的艺术美观,往往对清屏有一些具体要求,如:开幕清屏;闭幕清屏;上清屏;下清屏;中清屏.为此,这里
6 B3 ^2 a2 o6 R P z9 F' }
2 v( r9 I# R" j* {9 t 用C语言编制了几个子函数,用于程序中时,既可达到清屏的目的,有能增加屏幕的艺术美观.
Z- f( \/ r" {9 z. s* e6 Q 子函数及演示程序:
% V8 h: R2 Q- V" A+ a8 b! s( W0 a1 H# z1 u' W* b
#include<stdio.h>
" @' U2 q$ P# g7 r6 m& `2 E: R+ B #include<dos.h>7 y4 l0 s B0 a. y; Z6 s
#include<conio.h>- k+ [& ?9 m6 p
, W% m$ \* o) k8 n: @ void goto_xy(int x,int y);2 ?8 l3 G# N/ O7 c7 i# v
void dcls(int x1,int x2,int y1,int y2);- G8 u' k: I# U; i9 f7 N: t1 Y
void bcls(int x1,int x2,int y1,int y2);
% X" V3 @, ]% v+ m. w1 k void kcls(int x1,int x2,int y1,int y2);8 ?3 ~" d9 C" d2 [ U
void recls(int x1,int x2,int y1,int y2);1 B5 J1 l5 [2 s, P' ^
void zcls(int x1,int x2,int y1,int y2);
9 N7 n; v E8 w+ q void puta(void);; S" k, t# ^6 [% g1 _; R
% q# W7 R. Z8 v0 @9 \, R) ]3 W+ g+ f- y% F. Y( c
/*--------------演示程序---------------------*/
' f6 r" ^+ R+ l {3 p6 \5 H: A main(), p8 U& T! i' ^5 _- A
{
* L$ o4 ~* }$ R9 z {; Y3 o4 { puta();
% ~8 Z, a7 z( \( x7 x: y/ H getch();
3 [% z0 W& }& D$ M% z! z' f5 Z4 i dcls(0,4,0,79);5 A# R4 _2 j2 o9 r
getch();
! N G4 O; S* p6 H1 s6 h$ A2 j puta();
- R* @) ~ A, [$ s7 S getch();0 \! A& Q6 V5 a. e7 q. X
bcls(0,25,0,79);
U' {4 n r7 O% d" y getch();0 N2 g+ v2 w- ^6 v5 C& R3 m
puta();
: T5 Q; U: m8 @2 I7 [ b7 L getch();
0 |" h0 L' l0 J# I( Z7 t zcls(0,25,0,79); h6 V. K% Y. y/ _- V: T
getch();" L! B3 V6 u7 }" M* }3 k$ D
}) }# v2 U: i& O9 @
/*********center clear screen(中心清屏)***********/
% e6 s& A' t( |: N4 D! a0 Q void zcls(int x1,int x2,int y1,int y2)% v% n4 P% g3 ~3 s N* `# j
{
3 I. |6 d! p+ u! v% Y* h3 @/ y int x00,y00,x0,y0,i,d;$ ~. g5 W1 ]7 k
if((y2-y1)>(x2-x1)){
, U5 o7 f1 _8 H+ D9 ~& n' s d=(x2-x1)/2;' {$ M5 f$ W5 T# B8 I( X
x0=(x1+x2)/2;' @2 [/ f& s' Y$ d
y0=y1+d;
$ |( B$ W" z. S# V% Q y00=y2-d; y0 N. G: m& x- G( i3 Y8 i
for(i=0;i<(d+1);i++)$ h& w9 @+ J/ k5 J0 Q
recls((x0-i),(x00+i),(y0-i),(y00+i));
8 ]: H. M, T, B- w8 f delay(10);
, M* x( @/ T% `4 @1 x+ r( I' J }
, f6 Q; j( w: j' A" [9 E- F else{/ v ?# j: z& J) _. \- Q
d=(y2-y1)/2;
$ l. u# d/ C# G' W y0=(y1+y2)/2;
6 M \: j3 J e" U: i5 P x0=x1+d;$ U# [ j3 J8 R- I; }! f# c
x00=x2-d;: Z x! G: _" S* b7 Q5 [1 R/ v
for(i=0;i<d+1;i++)3 m. W! t8 m- G/ ]
recls(x0-i,x00+i,y0-i,y00+i);
1 K& v0 d+ t. M delay(10);3 s6 A% ` W3 H" j# u: {
}
0 C* @; L, k5 u3 | }. H% r% s) V5 [" i
6 x/ b- S4 M( Q2 b0 |7 f9 [$ o /************* clear rectangle side(矩形边清屏)***********************/( p! I9 p' p: k" @5 F4 F
* J. m/ d. \8 }, y' O2 n7 X, X void recls(int x1,int x2,int y1,int y2)
5 z2 x* c4 J1 R+ ^4 A {
$ O& A" {: G1 c1 v! Y( ~ int i,j;4 S" I' F! i7 H, a/ i$ i( d5 [
for(i=y1;i<y2;i++){
9 `( F" ~3 q" Z2 k& S8 L6 w goto_xy(x1,i);9 Y1 t$ ~' u& g9 G
putchar(' ');6 J' T4 j4 A; w6 Y0 \, u
goto_xy(x2,i);
/ C# h2 M9 y. b; {" w. A! l putchar(' ');- Q" E" H( H @* o# u, [$ p
delay(10);
7 s- U0 E8 d& M( C. U }% A+ d ?/ Q) |! W( W7 B1 t
for(j=x1;j<x2;j++){ J: z' `4 _2 W: A( g8 p& m
goto_xy(i,y1);/ v* @8 ]1 ], \" o
putchar(' ');) U* g, L) [3 F) H/ p( g
goto_xy(j,y2);
* N% W* N+ e9 `5 {7 o, r! D% b putchar(' ');
7 s7 b! s9 O1 D delay(10);
7 f }) x5 ^: Y; N, o }: R, n4 e$ F0 _7 @8 n @1 o. i
}7 M9 o. X# D& k3 K+ ]9 v- H
/******************open screen clear(开屏式清屏)*********************/
* @- \# i8 P. h# W: e5 u0 B: ~8 a9 W, [% O0 Q% i$ r
void kcls(int x1,int x2,int y1,int y2)
4 q0 L3 n3 c& T h9 ^# D {8 i0 s: {( \, E; j7 q' x$ x8 R
int t,s,i,j;
; N9 n* A4 N& h7 r0 U t=s=(y1+y2)/2;/ V% q& ~7 I- O4 }1 ]3 H
for(;t<=y2;t++,s--)
7 }4 X6 d P1 J) `6 |3 B3 [3 C for(j=x1;j<x2;j++){
4 D2 e1 V( q7 {6 D goto_xy(j,t);; o% d6 g6 y- D t* \) l) O5 a$ N
putchar(' ');# M Q. @. c h% B
goto_xy(j,s);( R) b# _: s7 l
putchar(' ');! L+ M: q4 `2 X; h2 O, n
delay(10);
) A, T4 \/ X! I$ g0 [3 _* @1 R }
' E$ s( e' {0 X: C: X ]1 i }$ n* U4 ^* J% Y& P
/*****************close screen clear*****闭幕式清屏*******************/% A+ r" b* u* m) J2 g. T- `
; F1 ]0 y) G" I, A9 h% Y$ H2 U void bcls(int x1,int x2,int y1,int y2)
! M4 I' T2 K) @5 q% V$ M {. A9 D3 y( ~! f# a
int t,s,j;* E: h2 J# d: ^ t3 h
t=y1;
8 P/ e% c5 a. T( N- y& @' H% z s=y2;1 ^; D8 A7 A; s9 B, }( Q
for(t=y1;t<(y1+y2)/2;t++,s--), m* X, C( k' p; ^9 k
for(j=x1;j<x2;j++){6 T- b* o3 R9 N, x: S
goto_xy(j,t);
- n0 h- v. e- d- q putchar(' ');, d0 }* ?0 x* d' o5 v9 z) r
goto_xy(j,s);
) L( y8 z1 b$ R |' M* `$ [! k3 _ putchar(' ');, W. s6 U) K1 ~
delay(10);7 U9 }' @9 e% R2 z$ }& [
}
8 [: y! K. R# V0 Y* c' J: B }) Q- [. y+ S/ Z: C4 R+ |8 e
/******************bottom screen clear(自下清屏)********************/* a. _; ]. @8 r. _* r# O/ ~
f% t; H" ^- A! M" f& d void dcls(int x1,int x2,int y1,int y2)
* ?/ W9 ]7 R1 J) u% y5 w: K {
" }2 g6 ?( [4 X* @& I1 B int t,s,j,i;, P; z3 D; s& K1 e3 @; o
t=s=(y1+y2)/2;) @$ ~4 J6 v& L/ y
for(j=x2;j>x1;j--)& y. Y* f3 Z/ J$ z
for(i=y1;i<y2;i++){
5 b2 t4 h! I4 a$ N, O: C goto_xy(j,i);
' \& l5 p; L) e2 k0 K, q putchar(' ');
! S1 M; S" }+ y- u delay(10);- D, k( l F( t2 c* p
}
; [. X: o% A3 W7 \! S) v5 [0 U }
' N: k# k) R2 ]8 c/ J /******************设置光标子函数******************/
' l; \& m- B/ N' ]& a1 u
4 @2 b: I% [8 [ V% I" n void goto_xy(int x,int y)0 T- n/ [( e) m9 @& s2 i
{& r! B/ {7 |: X7 D
union REGS r;
; q4 W0 ?* L- J8 a2 x7 V r.h.ah=2;* y/ y7 _) [/ ~) B
r.h.dl=y;
8 |0 u) \8 }/ i* ^/ [) l r.h.dh=x;2 o- t2 N& k9 p0 R% p3 V0 j
r.h.bh=0;7 s9 E4 E4 k' ^9 G1 I; \+ p
int86(0x10,&r,&r);
7 | S! Q& J" l& n) x }
: u! Y: P5 }5 s! q+ ^% }) W4 K
/**********************在屏幕上打出一连串的a字母用于演示程序******************/4 A- `+ B% }5 E+ a( G+ |4 R. D
! N: k5 n( Z5 j void puta(void)9 A& }& v. h$ D
{
# I- B- W! Z; Q4 L0 l int i,j;. F% z8 Z8 D; |5 \' V
for(i=0;i<24;i++){. X1 n. C( p. s! i8 O0 U7 {; {
for(j=0;j<79;j++){
! q" a' g4 ]! y- G+ ~ goto_xy(i,j);
5 t+ d0 P; I1 e; v6 } printf("a");
3 z8 |& w R6 M& a/ W8 f }( G. j( ^' e" N. d- [1 F& o! y& X3 z
}
! m+ X: {% I. A" f* L5 U: L }