home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / pl1 / maze < prev    next >
Text File  |  1989-02-21  |  9KB  |  325 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 > 39));
  9.   PRINT(sysprint,'Number of columns (2 to 39)? ');
  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. PRINT(sysprint,CHAR(179));
  220. x=1;
  221. DO WHILE(x < x_max);
  222.   IF page(0,x) = 'W' THEN
  223.     PRINT(sysprint,CHAR(196));
  224.   ELSE
  225.     PRINT(sysprint,' ');
  226.   x=x+1;
  227.   IF x < x_max THEN
  228.     DO;
  229.       IF page(1,x) = 'W' THEN
  230.         PRINT(sysprint,CHAR(194));
  231.       ELSE
  232.         PRINT(sysprint,CHAR(196));
  233.       x=x+1;
  234.     END;
  235. END;
  236. PRINT(sysprint,CHAR(191));
  237. PUTCRLF(sysprint);
  238. y=2;
  239. DO WHILE(y < y_max);
  240.   IF page(y,1) = 'W' THEN
  241.     PRINT(sysprint,CHAR(195));
  242.   ELSE
  243.     PRINT(sysprint,CHAR(179));
  244.   x=1;
  245.   DO WHILE(x < x_max);
  246.     IF page(y,x) = 'W' THEN
  247.       PRINT(sysprint,CHAR(196));
  248.     ELSE
  249.       PRINT(sysprint,' ');
  250.     x=x+1;
  251.     IF x < x_max THEN
  252.       DO;
  253.         IF page(y,x-1) = 'W' THEN
  254.           IF page(y-1,x) = 'W' THEN
  255.             IF page(y+1,x) = 'W' THEN
  256.               IF page(y,x+1) = 'W' THEN
  257.                 PRINT(sysprint,CHAR(197));
  258.               ELSE
  259.                 PRINT(sysprint,CHAR(180));
  260.             ELSE
  261.               IF page(y,x+1) = 'W' THEN
  262.                 PRINT(sysprint,CHAR(193));
  263.               ELSE
  264.                 PRINT(sysprint,CHAR(217));
  265.           ELSE
  266.             IF page(y+1,x) = 'W' THEN
  267.               IF page(y,x+1) = 'W' THEN
  268.                 PRINT(sysprint,CHAR(194));
  269.               ELSE
  270.                 PRINT(sysprint,CHAR(191));
  271.             ELSE
  272.               PRINT(sysprint,CHAR(196));
  273.         ELSE
  274.           IF page(y-1,x) = 'W' THEN
  275.             IF page(y+1,x) = 'W' THEN
  276.               IF page(y,x+1) = 'W' THEN
  277.                 PRINT(sysprint,CHAR(195));
  278.               ELSE
  279.                 PRINT(sysprint,CHAR(179));
  280.             ELSE
  281.               IF page(y,x+1) = 'W' THEN
  282.                 PRINT(sysprint,CHAR(192));
  283.               ELSE
  284.                 PRINT(sysprint,CHAR(179));
  285.           ELSE
  286.             IF page(y+1,x) = 'W' THEN
  287.               IF page(y,x+1) = 'W' THEN
  288.                 PRINT(sysprint,CHAR(218));
  289.               ELSE
  290.                 PRINT(sysprint,CHAR(179));
  291.             ELSE
  292.               IF page(y,x+1) = 'W' THEN
  293.                 PRINT(sysprint,CHAR(196));
  294.               ELSE
  295.                 PRINT(sysprint,' ');
  296.         x=x+1;
  297.       END;
  298.   END;
  299.   IF page(y,x_max-1) = 'W' THEN
  300.     PRINT(sysprint,CHAR(180));
  301.   ELSE
  302.     PRINT(sysprint,CHAR(179));
  303.   y=y+2;
  304.   PUTCRLF(sysprint);
  305. END;
  306. PRINT(sysprint,CHAR(192));
  307. x=1;
  308. DO WHILE(x < x_max);
  309.   IF page(y_max,x) = 'W' THEN
  310.     PRINT(sysprint,CHAR(196));
  311.   ELSE
  312.     PRINT(sysprint,' ');
  313.   x=x+1;
  314.   IF x < x_max THEN
  315.     DO;
  316.       IF page(y_max-1,x) = 'W' THEN
  317.         PRINT(sysprint,CHAR(193));
  318.       ELSE
  319.         PRINT(sysprint,CHAR(196));
  320.       x=x+1;
  321.     END;
  322. END;
  323. PRINT(sysprint,CHAR(179));
  324. PUTCRLF(sysprint);
  325.