100#include "rand.h" 110#include "inkey.h" 120#define e (47-1) 130#define GX 96 140#define GY 48 150#define GD 4 160#define m 65535 170char mz[e+1][e+1],*yj[4]={"0004067F0604","081C3E08080808","0010307F3010","080808083E1C08"};int dv[4][2]={0,-1,-1,0,0,1,1,0},ik=0,ia=1; 180maze(){ 190char p[5];int n,i,j,x,y,k,l,h,f; 200for(f=0,i=3;i<=e;i+=2)f+=i;n=0;for(i=0;i<=e;i++)mz[0][i]=mz[e][i]=mz[i][0]=mz[i][e]=5;x=1;y=e-1;mz[x][y]=1; 210while(1){k=0; 220if(!mz[x-2+(x<=1)*2][y])k++,p[k]=1; 230if(!mz[x+2-(x>=e-1)*2][y])k++,p[k]=2; 240if(!mz[x][y-2+(y<=1)*2])k++,p[k]=3; 250if(!mz[x][y+2-(y>=e-1)*2])k++,p[k]=4; 260if(k!=0){if(k==1)h=p[1];else h=p[rnd%k+1]; 270n++;for(l=0;l<2;l++){x=x-(h==1)+(h==2);y=y-(h==3)+(h==4);mz[x][y]=h;}} 280else{h=mz[x][y];for(l=0;l<2;l++){x=x+(h==1)-(h==2);y=y+(h==3)-(h==4);}} 290x=x+(x<1)*abs(e-x)-(x>e-1)*abs(e-x); 300y=y+(y<1)*abs(e-y)-(y>e-1)*abs(e-y); 310gotoxy(9,3);printf("%6.2f%%",(double)n/(double)f*100.); 320if(n>=f)break;} 330mz[1][e]=1;for(j=0;j<=e;j++)for(i=0;i<=e;i++){if(!mz[i][j])mz[i][j]=5;if(mz[i][j]>0&&mz[i][j]<=4)mz[i][j]=3;} 340for(i=1;ie||y>e)return 0;if(mz[x][y]==5)return 0;return 1;} 380drwl(int w,int i){ 390int a,b,c,d;a=GX/2.*i/GD;b=GY/2.*i/GD;c=GX/2.*(i-1)/GD;d=GY/2.*(i-1)/GD; 400if(w&2){line(a,b,GX-1-a,GY-1-b,0,(w&8)?0xaaaa:m,1);} 410if(w&1){line(GX-1-c,d,GX-1-a,b,0,m,0);line(GX-1-c,GY-1-d,GX-1-a,GY-1-b,0,m,0);} 420if(w&4){line(c,d,a,b,0,m,0);line(c,GY-1-d,a,GY-1-b,0,m,0);} 430if(!(w&1)){line(GX-1-c,b,GX-1-a,b,0,m,0);line(GX-1-c,GY-1-b,GX-1-a,GY-1-b,0,m,0); 440line(GX-1-c,d,GX-1-c,GY-1-d,0,m,0);line(GX-1-a,b,GX-1-a,GY-1-b,0,m,0);} 450if(!(w&4)){line(c,b,a,b,0,m,0);line(c,GY-1-b,a,GY-1-b,0,m,0);line(c,d,c,GY-1-d,0,m,0);line(a,b,a,GY-1-b,0,m,0);}} 460pmz(int x,int y,int d){ 470int i,j,k,w,xp,yp,wd[GD+1];xp=dv[d][0];yp=dv[d][1]; 480for(i=0;i<=GD;i++,x+=xp,y+=yp){for(j=w=0;j<3;j++){k=(d+j-1>=0)?(d+j-1)%4:3;w|=(ismv(dv[k][0]+x,dv[k][1]+y)^1)<0)drwl(wd[i],i);if(wd[i]&2){if(!i)line(0,0,GX-1,GY-1,0,(wd[i]&8)?0xaaaa:m,1);break;}}} 510main(){ 520int i,j,c,cb,d,od,x,y,k,ox,oy,wk;x=ox=1;y=oy=e;cb=od=d=wk=k=0; 530gotoxy(10,2);puts("MAZE");i=0;while(inkey());while(!inkey()){i++;gotoxy(7,3);puts((i%2)?" ":"Hit any key!");}outport(0x11,8);if(inport(0x13))ia=0;gotoxy(7,3);puts(" ");srand(i);maze(); 540clrscr();pmz(x,y,d);gotoxy(18,1);puts("MAZE");gotoxy(18,2);puts("KEY \xF0"); 550while(1){if(ia>0){if(!(c=inkey()))continue;if(c!=0x1e&&c!=0x1f)while(inkey());}else{if(inkey())c=inkey();else if(ismv(x+dv[(d+1)%4][0],y+dv[(d+1)%4][1])&&!k)c=0x1d,k=1;else if(ismv(x+dv[d][0],y+dv[d][1]))c=0x1e,k=0;else c=0x1c,k=0;} 560if(c==32){clrscr();gcursor(3,8);gprint(yj[d]);for(i=0;i<=e;i++)for(j=0;j<=e;j++)if(mz[i][j]==5||mz[i][j]==3)pset(12+i,j,0);if(ia==1){while(inkey());while(!inkey())pset(12+x,y,1);od=-1;continue;}else ia=-1;} 570if(c==0x1c)d=(d-1>=0)?d-1:3;if(c==0x1d)d=(d+1)%4; 580if(c==0x1f){i=(d+2)%4;if(ismv(x+dv[i][0],y+dv[i][1]))x+=dv[i][0],y+=dv[i][1];wk++;}if(c==0x1e)if(ismv(x+dv[d][0],y+dv[d][1]))x+=dv[d][0],y+=dv[d][1],wk++;if(mz[x][y]==3)mz[x][y]=0; 590if(mz[x][y]==1){mz[x][y]=0;ik=1;i=-1;while(i<0){i=rnd%4;j=rnd%(e-1)+1;if(!i&&mz[1][j]!=5)mz[0][j]=2;else if(i==1&&mz[j][1]!=5)mz[j][0]=2;else if(i==2&&mz[e-1][j]!=5)mz[e][j]=2;else if(i==3&&mz[j][e-1]!=5)mz[j][e]=2;else i=-1;}} 600if(ox!=x||oy!=y||od!=d){if(ia!=-1){clrscr();pmz(x,y,d);}else{preset(12+ox,oy);pset(12+x,y,0);}ox=x;oy=y;od=d;gotoxy(18,1);puts("MAZE");gotoxy(18,2);puts((!ik)?"KEY \xF0":"KEY \xED");gotoxy(18,3);printf("%4i Î",wk);if(mz[x][y]==2)break;}} 610if(mz[x][y]==2){gotoxy(6,3);puts("GAOL!");gotoxy(18,3);printf("%4i Î",wk);getch();}}