I was looking through some of my old CP/M files (running on a virtual ALTAIR Z80 using simh) when I can across this old FORTRAN IV program.
Unfortunately I have no idea where it came from or what algorithm it uses but it seems to work quite nicely. It will also compile using the VAX FORTRAN compiler running on VMS (which I also have running on a virtual MicroVAX using simh) with a few minor modifications, mostly to do with the file numbers used in the WRITE statements.
Actually I can’t remember which version is the original, but this one is straight off my CP/M machine and you should be able compile it without any errors using Microsoft FORTRAN-80 (3.44).
Enjoy!!
PROGRAM MAZE
C This program will display a random maze on the display.
INTEGER W(25,53),V(25,53),H,B,S,R,X,Z,Q,H1,C
REAL LINE(26)
DATA EDD, EBB, BBI, BBB /'|--', '| ', ' |', ' ' /
WRITE(1,98)
98 FORMAT ('1','Maze Generator')
WRITE (1,97)
97 FORMAT('0','Enter a random seed ? ')
READ (1,101) IX
WRITE(1,99)
99 FORMAT(' ','Enter number of rows ? ')
120 READ(1,101) B
IF ((B .GE. 5).AND.(B .LT. 54)) GOTO 95
WRITE (1,102)
GOTO 120
95 WRITE(1,100)
100 FORMAT(' ','Enter number of columns ? ')
94 READ(1,101) H
101 FORMAT(I5)
IF ((H .GE. 5).AND.(H .LT. 26)) GOTO 150
WRITE(1,102)
102 FORMAT(' ','Out of range - try again ? ')
GOTO 94
150 WRITE(1,103)
103 FORMAT(' ')
DO 10 I=1, 25
DO 10 J=1, 53
W(I,J)=0
V(I,J)=0
10 CONTINUE
Q = 0
Z = 0
H1 = H + 1
X = IFIX (RND(IX) * H + 1)
DO 180 I=1, H
IF (I .EQ. X) GOTO 173
LINE(I) = EDD
GOTO 180
173 LINE(I) = EBB
180 CONTINUE
LINE(H1) = EBB
WRITE (1,104) (LINE(I), I = 1, H1)
104 FORMAT('1',2X,26A3)
C = 1
W(X, 1) = C
C = C + 1
R = X
S = 1
GOTO 260
210 IF (R .NE. H) GOTO 240
IF (S .NE. B) GOTO 230
R=1
S=1
GOTO 250
230 R=1
S=S+1
GOTO 250
240 R=R+1
250 IF (W(R,S) .EQ. 0 ) GOTO 210
260 IF (R-1 .EQ. 0 ) GOTO 530
IF (W(R-1,S) .NE. 0) GOTO 530
IF (S-1 .EQ. 0) GOTO 390
IF (W(R,S-1) .NE. 0) GOTO 390
IF (R .EQ. H) GOTO 330
IF (W(R+1,S) .NE. 0) GOTO 330
X=IFIX(RND(IX)*3+1)
GOTO (790, 820, 860), X
330 IF (S .NE. B) GOTO 340
IF (Z .EQ. 1) GOTO 370
Q=1
GOTO 350
340 IF (W(R,S+1) .NE. 0) GOTO 370
350 X=IFIX(RND(IX)*3+1)
IF (X .EQ. 1) GOTO 790
IF (X .EQ. 2) GOTO 820
IF (X .EQ. 3) GOTO 910
370 X=IFIX(RND(IX)*2+1)
IF (X .EQ. 1) GOTO 790
IF (X .EQ. 2) GOTO 820
390 IF (R .EQ. H) GOTO 470
IF (W(R+1,S) .NE. 0) GOTO 470
IF (S .NE. B) GOTO 420
IF (Z .EQ. 1) GOTO 450
Q = 1
GOTO 430
420 IF (W(R,S+1) .NE. 0) GOTO 450
430 X = IFIX(RND(IX)*3+1)
IF (X .EQ. 1) GOTO 790
IF (X .EQ. 2) GOTO 860
IF (X .EQ. 3) GOTO 910
450 X=IFIX(RND(IX)*2+1)
IF (X .EQ. 1) GOTO 790
IF (X .EQ. 2) GOTO 860
470 IF (S .NE. B) GOTO 490
IF (Z .EQ. 1) GOTO 520
Q = 1
GOTO 500
490 IF (W(R,S+1) .NE. 0) GOTO 520
500 X=IFIX(RND(IX)*2+1)
IF (X .EQ. 1) GOTO 790
IF (X .EQ. 2) GOTO 910
520 GOTO 790
530 IF (S-1 .EQ. 0) GOTO 670
IF (W(R,S-1) .NE. 0) GOTO 670
IF (R .EQ. H) GOTO 610
IF (W(R+1,S) .NE. 0) GOTO 610
IF (S .NE. B) GOTO 560
IF (Z .EQ. 1) GOTO 590
Q=1
GOTO 570
560 IF (W(R,S+1) .NE. 0) GOTO 590
570 X=IFIX(RND(IX)*3+1)
IF (X .EQ. 1) GOTO 820
IF (X .EQ. 2) GOTO 860
IF (X .EQ. 3) GOTO 910
590 X=IFIX(RND(IX)*2+1)
IF (X .EQ. 1) GOTO 820
IF (X .EQ. 2) GOTO 860
610 IF (S .NE. B) GOTO 630
IF (Z .EQ. 1) GOTO 660
Q=1
GOTO 640
630 IF (W(R,S+1) .NE. 0) GOTO 660
640 X=IFIX(RND(IX)*2+1)
IF (X .EQ. 1) GOTO 820
IF (X .EQ. 2) GOTO 910
660 GOTO 820
670 IF (R .EQ. H) GOTO 740
IF (W(R+1,S) .NE. 0) GOTO 740
IF (S .NE. B) GOTO 700
IF (Z .EQ. 1) GOTO 730
Q=1
GOTO 830
700 IF (W(R,S+1) .NE. 0) GOTO 730
X=IFIX(RND(IX)*2+1)
IF (X .EQ. 1) GOTO 860
IF (X .EQ. 2) GOTO 910
730 GOTO 860
740 IF (S .NE. B) GOTO 760
IF (Z .EQ. 1) GOTO 780
Q=1
GOTO 770
760 IF (W(R,S+1) .NE. 0) GOTO 780
770 GOTO 910
780 GOTO 1000
790 W(R-1,S)=C
C=C+1
V(R-1,S)=2
R=R-1
IF (C .EQ. H*B+1) GOTO 1010
Q=0
GOTO 260
820 W(R,S-1)=C
830 C=C+1
V(R,S-1)=1
S=S-1
IF (C .EQ. H*B+1) GOTO 1010
Q=0
GOTO 260
860 W(R+1,S)=C
C=C+1
IF (V(R,S) .EQ. 0) GOTO 880
V(R,S)=3
GOTO 890
880 V(R,S)=2
890 R=R+1
IF (C .EQ. H*B+1) GOTO 1010
GOTO 530
910 IF (Q .EQ. 1) GOTO 960
W(R,S+1)=C
C=C+1
IF (V(R,S) .EQ. 0) GOTO 940
V(R,S)=3
GOTO 950
940 V(R,S)=1
950 S=S+1
IF (C .EQ. H*B+1) GOTO 1010
GOTO 260
960 Z=1
IF (V(R,S) .EQ. 0) GOTO 980
V(R,S)=3
Q=0
GOTO 1000
980 V(R,S)=1
Q=0
R=1
S=1
GOTO 250
1000 GOTO 210
1010 DO 1073 J=1, B
LINE(1) = BBI
DO 1040 I=1, H
IF (V(I,J) .LT. 2) GOTO 1030
LINE(I+1) = BBB
GOTO 1040
1030 LINE(I+1) = BBI
1040 CONTINUE
WRITE(1, 106) (LINE(I), I=1, H1)
106 FORMAT (1X,26A3)
DO 1070 I=1, H
IF (V(I,J) .EQ. 0) GOTO 1060
IF (V(I,J) .EQ. 2) GOTO 1060
LINE(I) = EBB
GOTO 1070
1060 LINE(I) = EDD
1070 CONTINUE
LINE(H1) = EBB
WRITE (1,107) (LINE(I), I = 1, H1)
107 FORMAT (3X, 26A3)
1073 CONTINUE
END
FUNCTION RND(IY)
C This function returns a psudo random real number between 0 and 1.
IY = IY*899
IF (IY .LT. 0) IY = IY + 32767 + 1
RND=FLOAT(IY)/32767.
RETURN
END
C This program will display a random maze on the display.
INTEGER W(25,53),V(25,53),H,B,S,R,X,Z,Q,H1,C
REAL LINE(26)
DATA EDD, EBB, BBI, BBB /'|--', '| ', ' |', ' ' /
WRITE(1,98)
98 FORMAT ('1','Maze Generator')
WRITE (1,97)
97 FORMAT('0','Enter a random seed ? ')
READ (1,101) IX
WRITE(1,99)
99 FORMAT(' ','Enter number of rows ? ')
120 READ(1,101) B
IF ((B .GE. 5).AND.(B .LT. 54)) GOTO 95
WRITE (1,102)
GOTO 120
95 WRITE(1,100)
100 FORMAT(' ','Enter number of columns ? ')
94 READ(1,101) H
101 FORMAT(I5)
IF ((H .GE. 5).AND.(H .LT. 26)) GOTO 150
WRITE(1,102)
102 FORMAT(' ','Out of range - try again ? ')
GOTO 94
150 WRITE(1,103)
103 FORMAT(' ')
DO 10 I=1, 25
DO 10 J=1, 53
W(I,J)=0
V(I,J)=0
10 CONTINUE
Q = 0
Z = 0
H1 = H + 1
X = IFIX (RND(IX) * H + 1)
DO 180 I=1, H
IF (I .EQ. X) GOTO 173
LINE(I) = EDD
GOTO 180
173 LINE(I) = EBB
180 CONTINUE
LINE(H1) = EBB
WRITE (1,104) (LINE(I), I = 1, H1)
104 FORMAT('1',2X,26A3)
C = 1
W(X, 1) = C
C = C + 1
R = X
S = 1
GOTO 260
210 IF (R .NE. H) GOTO 240
IF (S .NE. B) GOTO 230
R=1
S=1
GOTO 250
230 R=1
S=S+1
GOTO 250
240 R=R+1
250 IF (W(R,S) .EQ. 0 ) GOTO 210
260 IF (R-1 .EQ. 0 ) GOTO 530
IF (W(R-1,S) .NE. 0) GOTO 530
IF (S-1 .EQ. 0) GOTO 390
IF (W(R,S-1) .NE. 0) GOTO 390
IF (R .EQ. H) GOTO 330
IF (W(R+1,S) .NE. 0) GOTO 330
X=IFIX(RND(IX)*3+1)
GOTO (790, 820, 860), X
330 IF (S .NE. B) GOTO 340
IF (Z .EQ. 1) GOTO 370
Q=1
GOTO 350
340 IF (W(R,S+1) .NE. 0) GOTO 370
350 X=IFIX(RND(IX)*3+1)
IF (X .EQ. 1) GOTO 790
IF (X .EQ. 2) GOTO 820
IF (X .EQ. 3) GOTO 910
370 X=IFIX(RND(IX)*2+1)
IF (X .EQ. 1) GOTO 790
IF (X .EQ. 2) GOTO 820
390 IF (R .EQ. H) GOTO 470
IF (W(R+1,S) .NE. 0) GOTO 470
IF (S .NE. B) GOTO 420
IF (Z .EQ. 1) GOTO 450
Q = 1
GOTO 430
420 IF (W(R,S+1) .NE. 0) GOTO 450
430 X = IFIX(RND(IX)*3+1)
IF (X .EQ. 1) GOTO 790
IF (X .EQ. 2) GOTO 860
IF (X .EQ. 3) GOTO 910
450 X=IFIX(RND(IX)*2+1)
IF (X .EQ. 1) GOTO 790
IF (X .EQ. 2) GOTO 860
470 IF (S .NE. B) GOTO 490
IF (Z .EQ. 1) GOTO 520
Q = 1
GOTO 500
490 IF (W(R,S+1) .NE. 0) GOTO 520
500 X=IFIX(RND(IX)*2+1)
IF (X .EQ. 1) GOTO 790
IF (X .EQ. 2) GOTO 910
520 GOTO 790
530 IF (S-1 .EQ. 0) GOTO 670
IF (W(R,S-1) .NE. 0) GOTO 670
IF (R .EQ. H) GOTO 610
IF (W(R+1,S) .NE. 0) GOTO 610
IF (S .NE. B) GOTO 560
IF (Z .EQ. 1) GOTO 590
Q=1
GOTO 570
560 IF (W(R,S+1) .NE. 0) GOTO 590
570 X=IFIX(RND(IX)*3+1)
IF (X .EQ. 1) GOTO 820
IF (X .EQ. 2) GOTO 860
IF (X .EQ. 3) GOTO 910
590 X=IFIX(RND(IX)*2+1)
IF (X .EQ. 1) GOTO 820
IF (X .EQ. 2) GOTO 860
610 IF (S .NE. B) GOTO 630
IF (Z .EQ. 1) GOTO 660
Q=1
GOTO 640
630 IF (W(R,S+1) .NE. 0) GOTO 660
640 X=IFIX(RND(IX)*2+1)
IF (X .EQ. 1) GOTO 820
IF (X .EQ. 2) GOTO 910
660 GOTO 820
670 IF (R .EQ. H) GOTO 740
IF (W(R+1,S) .NE. 0) GOTO 740
IF (S .NE. B) GOTO 700
IF (Z .EQ. 1) GOTO 730
Q=1
GOTO 830
700 IF (W(R,S+1) .NE. 0) GOTO 730
X=IFIX(RND(IX)*2+1)
IF (X .EQ. 1) GOTO 860
IF (X .EQ. 2) GOTO 910
730 GOTO 860
740 IF (S .NE. B) GOTO 760
IF (Z .EQ. 1) GOTO 780
Q=1
GOTO 770
760 IF (W(R,S+1) .NE. 0) GOTO 780
770 GOTO 910
780 GOTO 1000
790 W(R-1,S)=C
C=C+1
V(R-1,S)=2
R=R-1
IF (C .EQ. H*B+1) GOTO 1010
Q=0
GOTO 260
820 W(R,S-1)=C
830 C=C+1
V(R,S-1)=1
S=S-1
IF (C .EQ. H*B+1) GOTO 1010
Q=0
GOTO 260
860 W(R+1,S)=C
C=C+1
IF (V(R,S) .EQ. 0) GOTO 880
V(R,S)=3
GOTO 890
880 V(R,S)=2
890 R=R+1
IF (C .EQ. H*B+1) GOTO 1010
GOTO 530
910 IF (Q .EQ. 1) GOTO 960
W(R,S+1)=C
C=C+1
IF (V(R,S) .EQ. 0) GOTO 940
V(R,S)=3
GOTO 950
940 V(R,S)=1
950 S=S+1
IF (C .EQ. H*B+1) GOTO 1010
GOTO 260
960 Z=1
IF (V(R,S) .EQ. 0) GOTO 980
V(R,S)=3
Q=0
GOTO 1000
980 V(R,S)=1
Q=0
R=1
S=1
GOTO 250
1000 GOTO 210
1010 DO 1073 J=1, B
LINE(1) = BBI
DO 1040 I=1, H
IF (V(I,J) .LT. 2) GOTO 1030
LINE(I+1) = BBB
GOTO 1040
1030 LINE(I+1) = BBI
1040 CONTINUE
WRITE(1, 106) (LINE(I), I=1, H1)
106 FORMAT (1X,26A3)
DO 1070 I=1, H
IF (V(I,J) .EQ. 0) GOTO 1060
IF (V(I,J) .EQ. 2) GOTO 1060
LINE(I) = EBB
GOTO 1070
1060 LINE(I) = EDD
1070 CONTINUE
LINE(H1) = EBB
WRITE (1,107) (LINE(I), I = 1, H1)
107 FORMAT (3X, 26A3)
1073 CONTINUE
END
FUNCTION RND(IY)
C This function returns a psudo random real number between 0 and 1.
IY = IY*899
IF (IY .LT. 0) IY = IY + 32767 + 1
RND=FLOAT(IY)/32767.
RETURN
END