标题:
C语言艺术清屏
[打印本页]
作者:
zw2004
时间:
2008-1-21 17:14
标题:
C语言艺术清屏
问题的提出:我们在编制程序时,经常要用到清屏处理,如dos下的cls,Turbo C下的clrscr()等都具有清屏功能,但这些均为一般意义的清屏,
# I3 A6 m% y) Y u
9 K ?6 @' V* ~6 \& M- R: Q$ f! |
并未显示其清屏规律.而有时为了达到清屏的艺术美观,往往对清屏有一些具体要求,如:开幕清屏;闭幕清屏;上清屏;下清屏;中清屏.为此,这里
' c9 S+ c' x, q+ K7 Y
4 f: o: h; X, A+ B, i- ]. c+ }
用C语言编制了几个子函数,用于程序中时,既可达到清屏的目的,有能增加屏幕的艺术美观.
+ D& | L! [4 l) V8 K( w
子函数及演示程序:
% ~& G& J8 p: x3 s- S
3 p8 n$ |+ z, I% T0 a
#include<stdio.h>
6 L$ G- Y. y; Q% G
#include<dos.h>
6 r6 H, ]0 J- e) [' Y
#include<conio.h>
% |' a7 Z* P! A. }
# z* v2 Z/ d9 f0 f ]3 z
void goto_xy(int x,int y);
5 @4 C6 ^; a4 \4 _5 P
void dcls(int x1,int x2,int y1,int y2);
- A& O1 z; }1 q( d
void bcls(int x1,int x2,int y1,int y2);
: ]3 I0 I4 m1 S% t8 |" ~' C
void kcls(int x1,int x2,int y1,int y2);
! K3 ^4 j7 V1 c" }8 p" }
void recls(int x1,int x2,int y1,int y2);
5 V, L( U. r* e# @' L) ~' U/ S
void zcls(int x1,int x2,int y1,int y2);
" o- v6 n/ q' C0 a2 Z
void puta(void);
' X' h: b- q( W
; Z. {& m/ a5 F' m9 E! }
: @" {$ g, S) a: \0 R5 e) a/ H* m
/*--------------演示程序---------------------*/
7 ]4 u7 o3 ^) [, m# Q7 Q) k' S/ |+ @
main()
- N' ` z* a2 Y$ M% b. M/ n3 ~2 j
{
) d& e5 M# y) l
puta();
[2 o" y6 i$ T
getch();
$ Y0 f" v$ D1 W( D/ B C
dcls(0,4,0,79);
4 Q9 f$ m& ^( u( O: M
getch();
) d3 o. O) N5 H8 n* H
puta();
+ Z' X9 @) H# z( q1 O
getch();
9 z$ F% v4 }$ T a& {+ @
bcls(0,25,0,79);
6 A6 U. ^4 A1 l* Q4 p4 m5 l9 j
getch();
0 ]% ?; u. J4 `7 b! u8 A
puta();
! R w6 h v" v$ j* ]+ d$ |
getch();
' `2 v2 K K% ~: G5 \4 o
zcls(0,25,0,79);
! k# v+ t+ \7 k' R9 z5 G- d9 g
getch();
: u) ?" F8 t+ k# r2 _$ g$ g) K
}
1 d y) N4 C- f# t1 @# T
/*********center clear screen(中心清屏)***********/
) k+ s& L0 i9 w6 [
void zcls(int x1,int x2,int y1,int y2)
& @6 j f& h1 D. a) K* G8 w b; r! j0 E9 A' y
{
& }; u( u! c% y( P4 H
int x00,y00,x0,y0,i,d;
0 T1 C& h$ l1 s i( f
if((y2-y1)>(x2-x1)){
" U; E0 r D7 v$ _4 ?
d=(x2-x1)/2;
8 m. F7 Y# S5 \; m4 M: Q [6 U
x0=(x1+x2)/2;
. f& r1 b3 r8 K$ B
y0=y1+d;
, C5 F& ]: Q6 H8 Y) h
y00=y2-d;
. e! F5 @, L6 l# _- b9 u; `
for(i=0;i<(d+1);i++)
/ {8 C5 d' L( H3 ~! p G
recls((x0-i),(x00+i),(y0-i),(y00+i));
- ?: e1 n! w; ]; k/ N) Z
delay(10);
4 \( p' l9 `0 L* v% G: u3 b
}
- S9 _$ F" y" V. ^6 W* C+ v6 S
else{
; a. L. A) a6 J( W! J
d=(y2-y1)/2;
3 h6 \8 W2 d6 M2 y
y0=(y1+y2)/2;
4 ~! g5 J+ Q, A! R
x0=x1+d;
# P- F3 W; r8 A% Z- d ?( Y) {
x00=x2-d;
0 K& `9 V* Y5 H, q$ B
for(i=0;i<d+1;i++)
% z1 y l' ]" Z, ?% v& ?
recls(x0-i,x00+i,y0-i,y00+i);
. @ ~. K/ A6 k1 U0 N/ R q; G
delay(10);
0 a1 W' e& B, ^/ L
}
% M4 _3 @( F" J1 V/ ]
}
& B+ u6 q* s0 k; M2 s
) A: h# L( g+ X1 k' K; Q# V
/************* clear rectangle side(矩形边清屏)***********************/
' s& p" U2 b" x' B
8 t4 A. i) \4 {9 l: @3 X
void recls(int x1,int x2,int y1,int y2)
% ^0 C2 z7 f" W; {, j" n6 h @* ]7 a
{
! w$ p$ k7 m0 |4 S
int i,j;
+ f8 @# A4 d! u' I
for(i=y1;i<y2;i++){
8 X$ @/ ]* @8 ~ Z
goto_xy(x1,i);
1 ~$ `# s9 r& U" h
putchar(' ');
3 N( f! Y* f7 Y6 A) O
goto_xy(x2,i);
! A1 Z- @$ R+ o X# P
putchar(' ');
7 p' ~( S1 U4 T! d
delay(10);
( B9 E7 C' B( B" s$ X6 u
}
* j4 B z# E( G( T3 q0 a
for(j=x1;j<x2;j++){
5 T- _% r) h" H0 G- v- `2 H" W
goto_xy(i,y1);
- N6 }9 T0 J, S7 J; k9 d
putchar(' ');
0 X! c, V% g( g1 r) S7 V) G2 V
goto_xy(j,y2);
) H- ^% Z3 N- ^0 w
putchar(' ');
& D* [7 F2 z+ Y# s* y' |: }: _, f
delay(10);
# }& `8 U# z" e
}
4 b' Y5 a+ X0 [, }$ P
}
7 X9 [1 ^' p% s5 e$ O1 i, P' `
/******************open screen clear(开屏式清屏)*********************/
8 R3 }' b$ P( H' ]4 {, d0 ^1 @
2 j. {2 z# w7 X4 B" Q
void kcls(int x1,int x2,int y1,int y2)
' g: P9 z j% r
{
: C- k1 R, V/ w! I
int t,s,i,j;
, H# m% t# t1 | c
t=s=(y1+y2)/2;
% D1 ^, K# r3 V! Z
for(;t<=y2;t++,s--)
b1 `$ S' D* S$ m9 b
for(j=x1;j<x2;j++){
" X- f; V4 L2 u! V: t& S# [
goto_xy(j,t);
3 l+ [0 n5 I; F! p* m6 M. a& i
putchar(' ');
0 Z0 q l" ?" A' G
goto_xy(j,s);
! R! O" M6 t) e! }# W- j
putchar(' ');
) {$ _+ ~- X% V" S1 P2 k
delay(10);
|4 Z* z: A6 S% t
}
& m7 c2 I0 d, f9 Q5 T8 }, t; l
}
2 L2 |) g% e( f& j! [! R
/*****************close screen clear*****闭幕式清屏*******************/
8 B: P+ {; _. o0 l. F- t# V/ m
6 `3 z1 k8 u- g- q, _/ u
void bcls(int x1,int x2,int y1,int y2)
( M6 A: `9 A2 x0 M
{
- G, i9 @: V" D7 s( E% e
int t,s,j;
- ^+ ?) d, X0 I
t=y1;
7 Y! s! i! U1 ]" b* d
s=y2;
) R! f5 P7 l( k* S% n
for(t=y1;t<(y1+y2)/2;t++,s--)
& a5 ~( `/ d2 R7 x; K. e o. t0 \
for(j=x1;j<x2;j++){
! P( X. S/ [/ J
goto_xy(j,t);
3 \6 `$ V+ s% P2 h
putchar(' ');
9 m$ R5 J7 l3 d6 ^5 R+ _( l
goto_xy(j,s);
5 s3 l8 c- g8 p1 ^
putchar(' ');
( ~' ?4 r; x/ O P6 E8 }
delay(10);
/ G" Z- [7 C7 b0 i" d# D) m8 v
}
! e9 Q- G. C7 M! E1 d0 _1 D* g) ]
}
0 k4 R H6 B. M7 l, n7 T
/******************bottom screen clear(自下清屏)********************/
. `1 U& |, M' h) w/ V. O
! T0 B& {8 T( _
void dcls(int x1,int x2,int y1,int y2)
; s. x& g o* G
{
. ?5 G$ _# s: S/ g2 r1 H
int t,s,j,i;
) `# _/ O2 @1 f0 S/ G
t=s=(y1+y2)/2;
H* L! c N0 M: d; n
for(j=x2;j>x1;j--)
V7 |9 w' x( }* y$ C. z
for(i=y1;i<y2;i++){
* g/ V% I6 W. _" J8 o
goto_xy(j,i);
$ ]" j: k" f0 V, ]3 f7 S; q6 [, H d6 z
putchar(' ');
$ Z( B O& z* ~' |; y1 k' q
delay(10);
6 Y' F& `/ K- B& |/ q
}
/ v. a/ s5 ^' V4 }9 T; J
}
8 [" j5 j* k" t @
/******************设置光标子函数******************/
% h- B* G4 f, ]1 |$ j$ R
$ v7 \- t( z/ p5 w0 O6 f _+ M
void goto_xy(int x,int y)
* \; q. D8 Z h; W7 _) }
{
5 \0 i/ o( G' q3 E4 J
union REGS r;
1 L/ m M* C" `6 M- _( A; O- ^
r.h.ah=2;
0 p0 A1 ~& ?+ i8 D$ ]8 ]. I
r.h.dl=y;
- Z0 R& C9 k- h& a! F
r.h.dh=x;
" d2 T. D. J; M, u9 a( c) b
r.h.bh=0;
% J4 P# t/ Q7 `7 v) s
int86(0x10,&r,&r);
1 L; F$ {8 e# h
}
7 K& w/ Y* X" G8 J8 r+ k
" w6 c7 C8 v E% @. j
/**********************在屏幕上打出一连串的a字母用于演示程序******************/
9 n, H' O' c# d6 C7 O& |3 P
) i. \* ^0 l9 B! s# i
void puta(void)
1 @: v. e; l( O$ V0 ?
{
" Y% \2 u, m8 {: a: K' A8 L' {$ B' s2 E
int i,j;
5 c$ ]4 `* j/ h) h. [, ?
for(i=0;i<24;i++){
* v! `. z; |8 g2 j! L* J9 m, ~: J* |
for(j=0;j<79;j++){
0 l2 A* C: [, N$ o% V# x
goto_xy(i,j);
* S1 [- M; i- ^0 u
printf("a");
7 x# J j5 u5 t$ {3 K
}
3 }' Z! I) N0 I3 B8 u: c
}
a7 u; p6 V% I: o I5 ?
}
欢迎光临 捌玖网络工作室 (http://89w.org/)
Powered by Discuz! 7.2