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","0 81C3E08080808","001030 7F3010","080808083E1C0 8"};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/(dou ble)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)?0xaa aa: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,G Y-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);li ne(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);l ine(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=d v[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=o y=e;cb=od=d=wk=k=0; 530gotoxy(10,2);puts("MA ZE");i=0;while(inkey() );while(!inkey()){i++; gotoxy(7,3);puts((i%2) ?" ":"Hit a ny key!");}outport(0x1 1,8);if(inport(0x13))i a=0;gotoxy(7,3);puts(" ");srand(i );maze(); 540clrscr();pmz(x,y,d);g otoxy(18,1);puts("MAZE ");gotoxy(18,2);puts(" KEY \xF0"); 550while(1){if(ia>0){if( !(c=inkey()))continue; if(c!=0x1e&&c!=0x1f)wh ile(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();gc ursor(3,8);gprint(yj[d ]);for(i=0;i<=e;i++)fo r(j=0;j<=e;j++)if(mz[i ][j]==5||mz[i][j]==3)p set(12+i,j,0);if(ia==1 ){while(inkey());while (!inkey())pset(12+x,y, 1);od=-1;continue;}els e 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{pres et(12+ox,oy);pset(12+x ,y,0);}ox=x;oy=y;od=d; gotoxy(18,1);puts("MAZ E");gotoxy(18,2);puts( (!ik)?"KEY \xF0":"KEY \xED");gotoxy(18,3);pr intf("%4i Î",wk);if(mz [x][y]==2)break;}} 610if(mz[x][y]==2){gotox y(6,3);puts("GAOL!");g otoxy(18,3);printf("%4 i Î",wk);getch();}}