home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / pl1 / invmaze < prev    next >
Text File  |  1989-02-22  |  8KB  |  271 lines

  1. ClrScr;
  2. PRINT(sysprint,'                                 Maze Generator');
  3. PUTCRLF(sysprint);
  4. PUTCRLF(sysprint);
  5. PUTCRLF(sysprint);
  6. PUTCRLF(sysprint);
  7. num_columns=0;
  8. DO WHILE((num_columns < 2) | (num_columns > 79));
  9.   PRINT(sysprint,'Number of columns (2 to 79)? ');
  10.   num_columns=GETINT(sysin);
  11. END;
  12. PUTCRLF(sysprint);
  13. num_rows=0;
  14. DO WHILE((num_rows < 2) | (num_rows > 20));
  15.   PRINT(sysprint,'Number of columns (2 to 20)? ');
  16.   num_rows=GETINT(sysin);
  17. END;
  18. PUTCRLF(sysprint);
  19. PRINT(sysprint,'Random number seed? ');
  20. seed=GETINT(sysin);
  21. seed=ABS(seed);
  22. x_max=2*num_columns;
  23. y_max=2*num_rows;
  24. r_n_index_1=1;
  25. DO WHILE(r_n_index_1 <= 8);
  26.   quotient=seed/29;
  27.   r_n(r_n_index_1)=seed+1-29*quotient;
  28.   seed=quotient;
  29.   r_n_index_1=r_n_index_1+1;
  30. END;
  31. delta_x(1,1)=-1;
  32. delta_y(1,1)=0;
  33. delta_x(2,1)=0;
  34. delta_y(2,1)=1;
  35. delta_x(3,1)=1;
  36. delta_y(3,1)=0;
  37. delta_x(4,1)=0;
  38. delta_y(4,1)=-1;
  39. delta_index_2=0;
  40. delta_index_1a=1;
  41. DO WHILE(delta_index_1a <= 4);
  42.   delta_index_1b=1;
  43.   DO WHILE(delta_index_1b <= 4);
  44.     IF delta_index_1a != delta_index_1b THEN
  45.       DO;
  46.         delta_index_1c=1;
  47.         DO WHILE(delta_index_1c <= 4);
  48.           IF ((delta_index_1a != delta_index_1c)
  49.           &   (delta_index_1b != delta_index_1c)) THEN
  50.             DO;
  51.               delta_index_1d=1;
  52.               DO WHILE(delta_index_1d <= 4);
  53.                 IF ((delta_index_1a != delta_index_1d)
  54.                 &   (delta_index_1b != delta_index_1d)
  55.                 &   (delta_index_1c != delta_index_1d)) THEN
  56.                   DO;
  57.                     delta_index_2=delta_index_2+1;
  58.                     delta_x(delta_index_1a,delta_index_2)
  59.                      =delta_x(1,1);
  60.                     delta_y(delta_index_1a,delta_index_2)
  61.                      =delta_y(1,1);
  62.                     delta_x(delta_index_1b,delta_index_2)
  63.                      =delta_x(2,1);
  64.                     delta_y(delta_index_1b,delta_index_2)
  65.                      =delta_y(2,1);
  66.                     delta_x(delta_index_1c,delta_index_2)
  67.                      =delta_x(3,1);
  68.                     delta_y(delta_index_1c,delta_index_2)
  69.                      =delta_y(3,1);
  70.                     delta_x(delta_index_1d,delta_index_2)
  71.                      =delta_x(4,1);
  72.                     delta_y(delta_index_1d,delta_index_2)
  73.                      =delta_y(4,1);
  74.                   END;
  75.                 delta_index_1d=delta_index_1d+1;
  76.               END;
  77.             END;
  78.           delta_index_1c=delta_index_1c+1;
  79.         END;
  80.       END;
  81.     delta_index_1b=delta_index_1b+1;
  82.   END;
  83.   delta_index_1a=delta_index_1a+1;
  84. END;
  85. x_out=0;
  86. DO WHILE(x_out <= x_max);
  87.   y_out=0;
  88.   DO WHILE(y_out <= y_max);
  89.     page(y_out,x_out)='W';
  90.     y_out=y_out+1;
  91.   END;
  92.   x_out=x_out+1;
  93. END;
  94. sum=0;
  95. digit_num=1;
  96. DO WHILE(digit_num <= 3);
  97.   digit=r_n(1);
  98.   r_n_index_1=1;
  99.   r_n_index_2=2;
  100.   DO WHILE(r_n_index_2 <= 8);
  101.     tem_int_1=r_n(r_n_index_2);
  102.     r_n(r_n_index_1)=tem_int_1;
  103.     digit=digit+tem_int_1;
  104.     IF digit > 29 THEN
  105.       digit=digit-29;
  106.     r_n_index_1=r_n_index_2;
  107.     r_n_index_2=r_n_index_2+1;
  108.   END;
  109.   r_n(8)=digit;
  110.   sum=29*sum+digit;
  111.   digit_num=digit_num+1;
  112. END;
  113. x=2*MOD(sum,num_columns)+1;
  114. sum=0;
  115. digit_num=1;
  116. DO WHILE(digit_num <= 3);
  117.   digit=r_n(1);
  118.   r_n_index_1=1;
  119.   r_n_index_2=2;
  120.   DO WHILE(r_n_index_2 <= 8);
  121.     tem_int_1=r_n(r_n_index_2);
  122.     r_n(r_n_index_1)=tem_int_1;
  123.     digit=digit+tem_int_1;
  124.     IF digit > 29 THEN
  125.       digit=digit-29;
  126.     r_n_index_1=r_n_index_2;
  127.     r_n_index_2=r_n_index_2+1;
  128.   END;
  129.   r_n(8)=digit;
  130.   sum=29*sum+digit;
  131.   digit_num=digit_num+1;
  132. END;
  133. y=2*MOD(sum,num_rows)+1;
  134. page(y,x)=' ';
  135. stack_head=0;
  136. finished=FALSE;
  137. DO WHILE(! finished);
  138.   delta_index_1=1;
  139.   too_big=TRUE;
  140.   DO WHILE(too_big);
  141.     delta_index_2=r_n(1);
  142.     r_n_index_1=1;
  143.     r_n_index_2=2;
  144.     DO WHILE(r_n_index_2 <= 8);
  145.       tem_int_1=r_n(r_n_index_2);
  146.       r_n(r_n_index_1)=tem_int_1;
  147.       delta_index_2=delta_index_2+tem_int_1;
  148.       IF delta_index_2 > 29 THEN
  149.         delta_index_2=delta_index_2-29;
  150.       r_n_index_1=r_n_index_2;
  151.       r_n_index_2=r_n_index_2+1;
  152.     END;
  153.     r_n(8)=delta_index_2;
  154.     IF delta_index_2 <= 24 THEN
  155.       too_big=FALSE;
  156.   END;
  157.   passage_found=FALSE;
  158.   search_complete=FALSE;
  159.   DO WHILE(! search_complete);
  160.     DO WHILE((delta_index_1 <= 4) & (! passage_found));
  161.       x_next=x+2*delta_x(delta_index_1,delta_index_2);
  162.       IF x_next <= 0 THEN
  163.         delta_index_1=delta_index_1+1;
  164.       ELSE
  165.         IF x_next >= x_max THEN
  166.           delta_index_1=delta_index_1+1;
  167.         ELSE
  168.           DO;
  169.             y_next=y+2*delta_y(delta_index_1,delta_index_2);
  170.             IF y_next <= 0 THEN
  171.               delta_index_1=delta_index_1+1;
  172.             ELSE
  173.               IF y_next >= y_max THEN
  174.                 delta_index_1=delta_index_1+1;
  175.               ELSE
  176.                 IF page(y_next,x_next) = 'W' THEN
  177.                   passage_found=TRUE;
  178.                 ELSE
  179.                   delta_index_1=delta_index_1+1;
  180.           END;
  181.     END;
  182.     IF (! passage_found) THEN
  183.       DO;
  184.         delta_index_1=stacked_index_1(stack_head);
  185.         delta_index_2=stacked_index_2(stack_head);
  186.         x=x-2*delta_x(delta_index_1,delta_index_2);
  187.         y=y-2*delta_y(delta_index_1,delta_index_2);
  188.         stack_head=stack_head-1;
  189.         delta_index_1=delta_index_1+1;
  190.       END;
  191.     IF ((passage_found) | (stack_head = 0)) THEN
  192.       search_complete=TRUE;
  193.   END;
  194.   IF passage_found THEN
  195.     DO;
  196.       stack_head=stack_head+1;
  197.       stacked_index_1(stack_head)=delta_index_1;
  198.       stacked_index_2(stack_head)=delta_index_2;
  199.       page(y_next,x_next)=' ';
  200.       IF x = x_next THEN
  201.         DO;
  202.           y_wall_1=(y+y_next)/2;
  203.           page(y_wall_1,x_next)=' ';
  204.         END;
  205.       ELSE
  206.         DO;
  207.           x_wall_1=(x+x_next)/2;
  208.           page(y_next,x_wall_1)=' ';
  209.         END;
  210.       x=x_next;
  211.       y=y_next;
  212.     END;
  213.   IF stack_head = 0 THEN
  214.     finished=TRUE;
  215. END;
  216. page(0,1)=' ';
  217. page(y_max,x_max-1)=' ';
  218. ClrScr;
  219. y=1;
  220. DO WHILE(y <= y_max);
  221.   x=1;
  222.   DO WHILE(x <= x_max);
  223.     IF page(y,x-1) != 'W' THEN
  224.       IF page(y-1,x) != 'W' THEN
  225.         IF page(y+1,x) != 'W' THEN
  226.           IF page(y,x+1) != 'W' THEN
  227.             PRINT(sysprint,CHAR(206));
  228.           ELSE
  229.             PRINT(sysprint,CHAR(185));
  230.         ELSE
  231.           IF page(y,x+1) != 'W' THEN
  232.             PRINT(sysprint,CHAR(202));
  233.           ELSE
  234.             PRINT(sysprint,CHAR(188));
  235.       ELSE
  236.         IF page(y+1,x) != 'W' THEN
  237.           IF page(y,x+1) != 'W' THEN
  238.             PRINT(sysprint,CHAR(203));
  239.           ELSE
  240.             PRINT(sysprint,CHAR(187));
  241.         ELSE
  242.           IF page(y,x+1) != 'W' THEN
  243.             PRINT(sysprint,CHAR(205));
  244.           ELSE
  245.             PRINT(sysprint,CHAR(181));
  246.     ELSE
  247.       IF page(y-1,x) != 'W' THEN
  248.         IF page(y+1,x) != 'W' THEN
  249.           IF page(y,x+1) != 'W' THEN
  250.             PRINT(sysprint,CHAR(204));
  251.           ELSE
  252.             PRINT(sysprint,CHAR(186));
  253.         ELSE
  254.           IF page(y,x+1) != 'W' THEN
  255.             PRINT(sysprint,CHAR(200));
  256.           ELSE
  257.             PRINT(sysprint,CHAR(208));
  258.       ELSE
  259.         IF page(y+1,x) != 'W' THEN
  260.           IF page(y,x+1) != 'W' THEN
  261.             PRINT(sysprint,CHAR(201));
  262.           ELSE
  263.             PRINT(sysprint,CHAR(210));
  264.         ELSE
  265.           PRINT(sysprint,CHAR(198));
  266.     x=x+2;
  267.   END;
  268.   y=y+2;
  269.   PUTCRLF(sysprint);
  270. END;
  271.