该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
我这一段程序的结果为什么和预想的不一样,请高手指点一下
#include
#include
#include
#include
#include
void initgr(void);
void restore_scr(char *buffer,int x1,int y1,int x2,int y2);
void save_scr(char *buffer,int x1,int y1,int x2,int y2);
void wn_cls(int x1,int y1,int x2,int y2);
void box(int,int);
char getkey(void);
int SC_color=2;
int Bar_color=12;
int WDX=64;
int WDY=80;
main()
{
int x1,y1,x2,y2,x0,y0;
int size;
int ch,a;
char *buffer;
initgr();
setfillstyle(1,SC_color);
bar(0,0,639,479);
rectangle(0,0,639,479);
setfillstyle(1,0);
bar(74,444,640,452);
setcolor(4);
rectangle(5,30,634,474);
setfillstyle(1,Bar_color);
bar(70,440,640,448);
setcolor(8);
outtextxy(100,80,"Welcome");
x1=48;
y1=50;
x2=x1+WDX;
y2=y1+WDY;
size=(x2-x1)/8*(y2-y1+1)*4;
buffer=(char *)malloc(size);
if(buffer==NULL){
printf("Noenough memory!\n");
exit(1);
}
save_scr(buffer,x1,y1,x1+WDX,y1+WDY);
box(x1,y1);
do{
x0=x1;y0=y1;
ch=getkey();
switch(ch){
case 75: x0-=8; break;
case 77: x0+=8; break;
case 72: y0-=8; break;
case 80: y0+=8; break;
default: break;
}
if(x0<0)x0=0;
if(y0<0)y0=0;
if(x0>640-WDX)x0=640-WDX;
if(y0>480-WDY)y0=480-WDY;
if(x1!=x0||y1!=y0){
restore_scr(buffer,x1,y1,x1+WDX,y1+WDY);
x1=x0;y1=y0;
save_scr(buffer,x1,y1,x1+WDX,y1+WDY);
box(x1,y1);}
}while(ch!=1);
getch();
free(buffer);
closegraph();
}
void box(int x1,int y1)
{
setfillstyle(1,RED);
bar(x1,y1,x1+WDX-1,y1+WDY-1);
}
void save_scr(char *buffer,int x1,int y1,int x2,int y2)
{
int i;
register long j,k;
char far *ptr;
for(i=0;i<4;i++)
{
outportb(0x3ce,4);
outportb(0x3cf,0);
outportb(0x3c3,4);
outportb(0x3cf,i);
ptr=(char far*)0xA0000000L+((long)y1*80L+x1/8);
for(j=1;j
{
for(k=1;k<=(x2-x1)/8;k++)
{
*buffer=*ptr;
ptr++;
buffer++;
}
ptr+=8L-(long)((x2-x1)/8);
}
}
outportb(0x3cf,0);
}
void restore_scr(char *buffer,int x1,int y1,int x2,int y2)
{
int i,k=1;
register long j,j1;
char far *ptr;
long int dp;
int dx;
dx=(x2-x1)/8;
dp=80L-(long)((x2-x1)/8);
for(i=0;i<4;i++)
{
outportb(0x3c4,2);
outportb(0x3c5,k);
ptr=(char far*)0xA0000000L+((long)y1*80L+(x1)/9);
for(j=y1;j
{
for(j1=1;j1<=dx;j1++)
{*ptr=*buffer;
buffer++;
ptr++;}
ptr+=dp;
}
k*=2;
}
outportb(0x3c4,2);
outportb(0x3c5,0x0f);
}
void initgr(void)
{int gdriver=DETECT,gmode,errorcode;
initgraph(&gdriver,&gmode,"");
errorcode=graphresult();
if(errorcode!=grOk){
printf("Graphics System Error:%s\n",grapherrormsg(errorcode));
exit(1);
}
}
char getkey(void)
{
union key{
int i;
char ch[2];
}k;
k.ch[1]=bioskey(0);
return k.ch[1];
}