C语言艺术清屏
问题的提出:我们在编制程序时,经常要用到清屏处理,如dos下的cls,Turbo C下的clrscr()等都具有清屏功能,但这些均为一般意义的清屏,S$xDz'iq%D7`并未显示其清屏规律.而有时为了达到清屏的艺术美观,往往对清屏有一些具体要求,如:开幕清屏;闭幕清屏;上清屏;下清屏;中清屏.为此,这里+Ef.s-b U9n)F
$WH(Cj;D^)nW&G
用C语言编制了几个子函数,用于程序中时,既可达到清屏的目的,有能增加屏幕的艺术美观. PGe}D0Gs;G'mA
子函数及演示程序:cu$E&H3Or
;N9F$B5Hz-Y O-_-w\
#include<stdio.h>
#include<dos.h>
#include<conio.h>
void goto_xy(int x,int y);
void dcls(int x1,int x2,int y1,int y2);M4xR2K{ C.eL?%e
void bcls(int x1,int x2,int y1,int y2);8Q'D&F#F b6m } \
void kcls(int x1,int x2,int y1,int y2);5@'EV5C7}
void recls(int x1,int x2,int y1,int y2);eS-r?'P
void zcls(int x1,int x2,int y1,int y2);"dW3`p,g
void puta(void);
E%v#}(H z/t6M4@"X2wA4^A
e:`l;HJJ/D ot
/*--------------演示程序---------------------*/
main()D@Ld5tt|R3n
{+CST%l9b,r3F`/F-X
puta();]xi6a1k
getch();
dcls(0,4,0,79);
getch();
puta();
getch();
bcls(0,25,0,79);
getch();6rLU!vy!u{D
puta();o&Mjg TO-o
getch();
zcls(0,25,0,79);%\i8b/F/cNlBXw:v
getch();
}9bt/r(Tv!d
/*********center clear screen(中心清屏)***********/
void zcls(int x1,int x2,int y1,int y2)$aNbIWgg
{
int x00,y00,x0,y0,i,d;
if((y2-y1)>(x2-x1)){
d=(x2-x1)/2;
x0=(x1+x2)/2;zKLgG"S
y0=y1+d;0e~5JlRaX }
y00=y2-d;3Q\Ko!QG}
for(i=0;i<(d+1);i++)
recls((x0-i),(x00+i),(y0-i),(y00+i));hv*fu'd'{
delay(10);HmC uG xpu V4c
}
else{-zh"[$T$IG
d=(y2-y1)/2;+Vi%Ag/g(A[
y0=(y1+y2)/2; ^)]:lvbH
x0=x1+d;N Q,n?Y`re?3q ?
x00=x2-d;0z2@})S)b5X5J.e
for(i=0;i<d+1;i++)u0u+KF3U&TR5|9[*]o
recls(x0-i,x00+i,y0-i,y00+i);@;\4v/f7R(O"`(n:~
delay(10);
}
}
*w+gj }CGN8Y
/************* clear rectangle side(矩形边清屏)***********************/
void recls(int x1,int x2,int y1,int y2)
{
int i,j;4^Wd/dz#z
for(i=y1;i<y2;i++){/|\;rVfP
goto_xy(x1,i);
putchar(' ');
goto_xy(x2,i);
putchar(' ');
delay(10); V{!P,fR@2b%m_c
}
for(j=x1;j<x2;j++){:SO0Q4nz Q7a
goto_xy(i,y1);
putchar(' ');Gw%M*Q sd9PA6c
goto_xy(j,y2);#kkC;n/No/Yi}
putchar(' ');
delay(10);,@%X1rQ!bg,uEbMX
}4Q(PW3u"R h8b!VR B
}z$T\NKA|;s'tC+X&P
/******************open screen clear(开屏式清屏)*********************/
A5t(E5z1I%M7o9M;d
void kcls(int x1,int x2,int y1,int y2)Gm"F{6EeY
{Cc0U)P:}%g4v&lyp
int t,s,i,j;
t=s=(y1+y2)/2;g+O%p)`7fQ/n
for(;t<=y2;t++,s--))G g%u0S9Z"jo
for(j=x1;j<x2;j++){}3p [ A Cv
goto_xy(j,t);
putchar(' ');
goto_xy(j,s);i rq$Ly
putchar(' ');$i+wZ,u~#ZK
delay(10);+^{Y-S]$[
}\7nI4ng3j.g0M}
}
/*****************close screen clear*****闭幕式清屏*******************/Y0U?*zr~7VB
void bcls(int x1,int x2,int y1,int y2)
{
int t,s,j;
t=y1;
s=y2;:D ~8U]L-z?
for(t=y1;t<(y1+y2)/2;t++,s--)Yw`-T7S Zcf.X
for(j=x1;j<x2;j++){8M0dfnWOvx$j_
goto_xy(j,t);
putchar(' ');
goto_xy(j,s);
putchar(' ');5O$z&wh0]oI
delay(10);0J:crw g
}
}
/******************bottom screen clear(自下清屏)********************/]"P$j.\(v5zla
void dcls(int x1,int x2,int y1,int y2)
{'WUK)x%Uw.Eg%^
int t,s,j,i;lF5u0Eu"FG
t=s=(y1+y2)/2;1a`p%p&L0A9M"G
for(j=x2;j>x1;j--)
for(i=y1;i<y2;i++){
goto_xy(j,i);
putchar(' ');
delay(10);1mLm I$R
}
}
/******************设置光标子函数******************/%ictI A
void goto_xy(int x,int y)%] hmS#@a {
{!J'v^bRDb
union REGS r;
r.h.ah=2;
r.h.dl=y;hE/Wad7m
r.h.dh=x;:F9V8F9nX&O*C7f
r.h.bh=0;{+[Q'W9s'nh
int86(0x10,&r,&r);
}|%u1|*f6C1CO}L VW
2\V#|BkDB{
/**********************在屏幕上打出一连串的a字母用于演示程序******************/
~.r,T/@"KnvG
void puta(void)
{
int i,j; ]T&_N zKW
for(i=0;i<24;i++){+OT+uV!k
for(j=0;j<79;j++){3X JFeZ
goto_xy(i,j);'XpyP)e9_i
printf("a");
}
}9@DuhmC
}
页:
[1]