08-09-2025, 10:23 PM
Here is an old GW-Basic (or maybe older) maze maker that someone posted on an old BASIC newsgroup back in the 90's.
Code: (Select All)
1010 Key Off
1020 DefInt A-Z
1030 X.MAX = 95
1040 Y.MAX = 49
1050 Dim DELTA.X(6, 720)
1060 Dim DELTA.Y(6, 720)
1070 Dim PAGE(Y.MAX, X.MAX)
1080 Dim R.N(8)
1090 Dim STACK.1(Y.MAX * X.MAX)
1100 Dim STACK.2(Y.MAX * X.MAX)
1110 Cls
1120 Print " Maze Generator"
1130 Print
1140 Print
1150 Print
1160 Print " Random number seed? ";
1170 Line Input SEED$
1180 R.N.INDEX.1 = 1
1190 For R.N.INDEX.2 = 1 To Len(SEED$)
1200 TEM.INT = Asc(Mid$(SEED$, R.N.INDEX.2, 1))
1210 R.N(R.N.INDEX.1) = TEM.INT
1220 R.N.INDEX.1 = R.N.INDEX.1 + 1
1230 Next R.N.INDEX.2
1240 R.N.INDEX.2 = 8
1250 While (R.N.INDEX.1 > 1)
1260 R.N.INDEX.1 = R.N.INDEX.1 - 1
1270 R.N(R.N.INDEX.2) = R.N(R.N.INDEX.1)
1280 R.N.INDEX.2 = R.N.INDEX.2 - 1
1290 Wend
1300 While (R.N.INDEX.2 >= 1)
1310 R.N(R.N.INDEX.2) = 367
1320 R.N.INDEX.2 = R.N.INDEX.2 - 1
1330 Wend
1340 DELTA.Y(1, 1) = -1
1350 DELTA.X(1, 1) = -2
1360 DELTA.Y(2, 1) = 1
1370 DELTA.X(2, 1) = -2
1380 DELTA.Y(3, 1) = -2
1390 DELTA.X(3, 1) = 0
1400 DELTA.Y(4, 1) = 2
1410 DELTA.X(4, 1) = 0
1420 DELTA.Y(5, 1) = -1
1430 DELTA.X(5, 1) = 2
1440 DELTA.Y(6, 1) = 1
1450 DELTA.X(6, 1) = 2
1460 DELTA.INDEX.2 = 0
1470 For DELTA.INDEX.1A = 1 To 6
1480 For DELTA.INDEX.1B = 1 To 6
1490 If DELTA.INDEX.1A = DELTA.INDEX.1B Then 1850
1500 For DELTA.INDEX.1C = 1 To 6
1510 If DELTA.INDEX.1A = DELTA.INDEX.1C Then 1840
1520 If DELTA.INDEX.1B = DELTA.INDEX.1C Then 1840
1530 For DELTA.INDEX.1D = 1 To 6
1540 If DELTA.INDEX.1A = DELTA.INDEX.1D Then 1830
1550 If DELTA.INDEX.1B = DELTA.INDEX.1D Then 1830
1560 If DELTA.INDEX.1C = DELTA.INDEX.1D Then 1830
1570 For DELTA.INDEX.1E = 1 To 6
1580 If DELTA.INDEX.1A = DELTA.INDEX.1E Then 1820
1590 If DELTA.INDEX.1B = DELTA.INDEX.1E Then 1820
1600 If DELTA.INDEX.1C = DELTA.INDEX.1E Then 1820
1610 If DELTA.INDEX.1D = DELTA.INDEX.1E Then 1820
1620 For DELTA.INDEX.1F = 1 To 6
1630 If DELTA.INDEX.1A = DELTA.INDEX.1F Then 1810
1640 If DELTA.INDEX.1B = DELTA.INDEX.1F Then 1810
1650 If DELTA.INDEX.1C = DELTA.INDEX.1F Then 1810
1660 If DELTA.INDEX.1D = DELTA.INDEX.1F Then 1810
1670 If DELTA.INDEX.1E = DELTA.INDEX.1F Then 1810
1680 DELTA.INDEX.2 = DELTA.INDEX.2 + 1
1690 DELTA.X(DELTA.INDEX.1A, DELTA.INDEX.2) = DELTA.X(1, 1)
1700 DELTA.Y(DELTA.INDEX.1A, DELTA.INDEX.2) = DELTA.Y(1, 1)
1710 DELTA.X(DELTA.INDEX.1B, DELTA.INDEX.2) = DELTA.X(2, 1)
1720 DELTA.Y(DELTA.INDEX.1B, DELTA.INDEX.2) = DELTA.Y(2, 1)
1730 DELTA.X(DELTA.INDEX.1C, DELTA.INDEX.2) = DELTA.X(3, 1)
1740 DELTA.Y(DELTA.INDEX.1C, DELTA.INDEX.2) = DELTA.Y(3, 1)
1750 DELTA.X(DELTA.INDEX.1D, DELTA.INDEX.2) = DELTA.X(4, 1)
1760 DELTA.Y(DELTA.INDEX.1D, DELTA.INDEX.2) = DELTA.Y(4, 1)
1770 DELTA.X(DELTA.INDEX.1E, DELTA.INDEX.2) = DELTA.X(5, 1)
1780 DELTA.Y(DELTA.INDEX.1E, DELTA.INDEX.2) = DELTA.Y(5, 1)
1790 DELTA.X(DELTA.INDEX.1F, DELTA.INDEX.2) = DELTA.X(6, 1)
1800 DELTA.Y(DELTA.INDEX.1F, DELTA.INDEX.2) = DELTA.Y(6, 1)
1810 Next DELTA.INDEX.1F
1820 Next DELTA.INDEX.1E
1830 Next DELTA.INDEX.1D
1840 Next DELTA.INDEX.1C
1850 Next DELTA.INDEX.1B
1860 Next DELTA.INDEX.1A
1870 Y.OUT.MOD.4 = 1
1880 For Y.OUT = 1 To Y.MAX
1890 If Y.OUT.MOD.4 <> 1 Then 2030
1900 X.OUT.MOD.8 = 1
1910 For X.OUT = 1 To X.MAX
1920 If ((X.OUT.MOD.8 = 0) And (Y.OUT <> 1) And (Y.OUT <> Y.MAX)) Then 1980
1930 If X.OUT.MOD.8 = 3 Then 1980
1940 If X.OUT.MOD.8 = 4 Then 1980
1950 If X.OUT.MOD.8 = 5 Then 1980
1960 PAGE(Y.OUT, X.OUT) = 0
1970 GoTo 1990
1980 PAGE(Y.OUT, X.OUT) = 1
1990 X.OUT.MOD.8 = X.OUT.MOD.8 + 1
2000 If X.OUT.MOD.8 >= 8 Then X.OUT.MOD.8 = 0
2010 Next X.OUT
2020 GoTo 2260
2030 If ((Y.OUT.MOD.4 <> 0) And (Y.OUT.MOD.4 <> 2)) Then 2140
2040 X.OUT.MOD.8 = 1
2050 For X.OUT = 1 To X.MAX
2060 If ((X.OUT.MOD.8 = 2) Or (X.OUT.MOD.8 = 6)) Then 2090
2070 PAGE(Y.OUT, X.OUT) = 0
2080 GoTo 2100
2090 PAGE(Y.OUT, X.OUT) = 1
2100 X.OUT.MOD.8 = X.OUT.MOD.8 + 1
2110 If X.OUT.MOD.8 >= 8 Then X.OUT.MOD.8 = 0
2120 Next X.OUT
2130 GoTo 2260
2140 X.OUT.MOD.8 = 1
2150 For X.OUT = 1 To X.MAX
2160 If X.OUT.MOD.8 = 0 Then 2220
2170 If X.OUT.MOD.8 = 1 Then 2220
2180 If X.OUT.MOD.8 = 4 Then 2220
2190 If X.OUT.MOD.8 = 7 Then 2220
2200 PAGE(Y.OUT, X.OUT) = 0
2210 GoTo 2230
2220 PAGE(Y.OUT, X.OUT) = 1
2230 X.OUT.MOD.8 = X.OUT.MOD.8 + 1
2240 If X.OUT.MOD.8 >= 8 Then X.OUT.MOD.8 = 0
2250 Next X.OUT
2260 Y.OUT.MOD.4 = Y.OUT.MOD.4 + 1
2270 If Y.OUT.MOD.4 >= 4 Then Y.OUT.MOD.4 = 0
2280 Next Y.OUT
2290 X = 4
2300 Y = Y.MAX - 2
2310 PAGE(Y, X) = 0
2320 STACK.HEAD = -1
2330 DELTA.INDEX.1A = 1
2340 DELTA.INDEX.2 = R.N(1)
2350 R.N.INDEX.1 = 1
2360 For R.N.INDEX.2 = 2 To 8
2370 TEM.INT = R.N(R.N.INDEX.2)
2380 R.N(R.N.INDEX.1) = TEM.INT
2390 DELTA.INDEX.2 = DELTA.INDEX.2 + TEM.INT
2400 If DELTA.INDEX.2 > 727 Then DELTA.INDEX.2 = DELTA.INDEX.2 - 727
2410 R.N.INDEX.1 = R.N.INDEX.2
2420 Next R.N.INDEX.2
2430 R.N(8) = DELTA.INDEX.2
2440 If DELTA.INDEX.2 > 720 Then 2340
2450 PASSAGE.FOUND = 0
2460 SEARCH.COMPLETE = 0
2470 While (SEARCH.COMPLETE = 0)
2480 While ((DELTA.INDEX.1A <= 6) And (PASSAGE.FOUND = 0))
2490 X.NEXT = X + 2 * DELTA.X(DELTA.INDEX.1A, DELTA.INDEX.2)
2500 If X.NEXT > 0 Then 2530
2510 DELTA.INDEX.1A = DELTA.INDEX.1A + 1
2520 GoTo 2670
2530 If X.NEXT < X.MAX Then 2560
2540 DELTA.INDEX.1A = DELTA.INDEX.1A + 1
2550 GoTo 2670
2560 Y.NEXT = Y + 2 * DELTA.Y(DELTA.INDEX.1A, DELTA.INDEX.2)
2570 If Y.NEXT > 0 Then 2600
2580 DELTA.INDEX.1A = DELTA.INDEX.1A + 1
2590 GoTo 2670
2600 If Y.NEXT < Y.MAX Then 2630
2610 DELTA.INDEX.1A = DELTA.INDEX.1A + 1
2620 GoTo 2670
2630 If PAGE(Y.NEXT, X.NEXT) = 0 Then 2660
2640 PASSAGE.FOUND = -1
2650 GoTo 2670
2660 DELTA.INDEX.1A = DELTA.INDEX.1A + 1
2670 Wend
2680 If PASSAGE.FOUND <> 0 Then 2760
2690 If STACK.HEAD < 0 Then 2760
2700 DELTA.INDEX.1A = STACK.1(STACK.HEAD)
2710 DELTA.INDEX.2 = STACK.2(STACK.HEAD)
2720 X = X - 2 * DELTA.X(DELTA.INDEX.1A, DELTA.INDEX.2)
2730 Y = Y - 2 * DELTA.Y(DELTA.INDEX.1A, DELTA.INDEX.2)
2740 STACK.HEAD = STACK.HEAD - 1
2750 DELTA.INDEX.1A = DELTA.INDEX.1A + 1
2760 If PASSAGE.FOUND = 0 Then 2790
2770 SEARCH.COMPLETE = -1
2780 GoTo 2810
2790 If ((STACK.HEAD >= 0) Or (DELTA.INDEX.1A <= 6)) Then 2810
2800 SEARCH.COMPLETE = -1
2810 Wend
2820 If PASSAGE.FOUND = 0 Then 2900
2830 STACK.HEAD = STACK.HEAD + 1
2840 STACK.1(STACK.HEAD) = DELTA.INDEX.1A
2850 STACK.2(STACK.HEAD) = DELTA.INDEX.2
2860 PAGE(Y.NEXT, X.NEXT) = 0
2870 PAGE((Y + Y.NEXT) \ 2, (X + X.NEXT) \ 2) = 0
2880 X = X.NEXT
2890 Y = Y.NEXT
2900 If STACK.HEAD <> -1 Then 2330
2910 PAGE(2, 2) = 0
2920 PAGE(Y.MAX - 1, X.MAX - 1) = 0
2930 Screen 1
2940 Color 0, 0
2950 Cls
2960 Y.PREVIOUS = 0
2970 Y.NEXT = 2
2980 For Y.OUT = 1 To Y.MAX
2990 X.OUT = 1
3000 For X.NEXT = 2 To X.MAX
3010 If PAGE(Y.OUT, X.OUT) = 0 Then 3100
3020 If PAGE(Y.OUT, X.NEXT) = 0 Then 3040
3030 Line (3 * (X.OUT - 1), 4 * (Y.OUT - 1))-(3 * (X.NEXT - 1), 4 * (Y.OUT - 1)), 1
3040 If Y.PREVIOUS <= 0 Then 3070
3050 If PAGE(Y.PREVIOUS, X.NEXT) = 0 Then 3070
3060 Line (3 * (X.OUT - 1), 4 * (Y.OUT - 1))-(3 * (X.NEXT - 1), 4 * (Y.PREVIOUS - 1)), 1
3070 If Y.NEXT > Y.MAX Then 3100
3080 If PAGE(Y.NEXT, X.NEXT) = 0 Then 3100
3090 Line (3 * (X.OUT - 1), 4 * (Y.OUT - 1))-(3 * (X.NEXT - 1), 4 * (Y.NEXT - 1)), 1
3100 X.OUT = X.NEXT
3110 Next X.NEXT
3120 Y.PREVIOUS = Y.OUT
3130 Y.NEXT = Y.NEXT + 1
3140 Next Y.OUT
3150 Beep
3160 While (InKey$ = "")
3170 Wend
3180 NUM.DEAD.ENDS = 0
3190 For Y.OUT = 3 To Y.MAX Step 4
3200 For X.OUT = 4 To X.MAX Step 8
3210 NUM.WALLS = PAGE(Y.OUT - 1, X.OUT - 2)
3220 NUM.WALLS = NUM.WALLS + PAGE(Y.OUT + 1, X.OUT - 2)
3230 NUM.WALLS = NUM.WALLS + PAGE(Y.OUT + 2, X.OUT)
3240 NUM.WALLS = NUM.WALLS + PAGE(Y.OUT + 1, X.OUT + 2)
3250 NUM.WALLS = NUM.WALLS + PAGE(Y.OUT - 1, X.OUT + 2)
3260 NUM.WALLS = NUM.WALLS + PAGE(Y.OUT - 2, X.OUT)
3270 If NUM.WALLS <> 5 Then 3510
3280 NUM.DEAD.ENDS = NUM.DEAD.ENDS + 1
3290 If PAGE(Y.OUT - 1, X.OUT - 2) <> 0 Then 3330
3300 Line (3 * (X.OUT - 4), 4 * (Y.OUT - 1))-(3 * (X.OUT - 2), 4 * (Y.OUT - 3)), 2
3310 PAGE(Y.OUT - 1, X.OUT - 2) = 1
3320 GoTo 3510
3330 If PAGE(Y.OUT - 2, X.OUT) <> 0 Then 3370
3340 Line (3 * (X.OUT - 2), 4 * (Y.OUT - 3))-(3 * X.OUT, 4 * (Y.OUT - 3)), 2
3350 PAGE(Y.OUT - 2, X.OUT) = 1
3360 GoTo 3510
3370 If PAGE(Y.OUT - 1, X.OUT + 2) <> 0 Then 3410
3380 Line (3 * X.OUT, 4 * (Y.OUT - 3))-(3 * (X.OUT + 2), 4 * (Y.OUT - 1)), 2
3390 PAGE(Y.OUT - 1, X.OUT + 2) = 1
3400 GoTo 3510
3410 If PAGE(Y.OUT + 1, X.OUT + 2) <> 0 Then 3450
3420 Line (3 * (X.OUT + 2), 4 * (Y.OUT - 1))-(3 * X.OUT, 4 * (Y.OUT + 1)), 2
3430 PAGE(Y.OUT + 1, X.OUT + 2) = 1
3440 GoTo 3510
3450 If PAGE(Y.OUT + 2, X.OUT) <> 0 Then 3490
3460 Line (3 * X.OUT, 4 * (Y.OUT + 1))-(3 * (X.OUT - 2), 4 * (Y.OUT + 1)), 2
3470 PAGE(Y.OUT + 2, X.OUT) = 1
3480 GoTo 3510
3490 Line (3 * (X.OUT - 2), 4 * (Y.OUT + 1))-(3 * (X.OUT - 4), 4 * (Y.OUT - 1)), 2
3500 PAGE(Y.OUT + 1, X.OUT - 2) = 1
3510 Next X.OUT
3520 Next Y.OUT
3530 Y.LIMIT = Y.MAX - 1
3540 For Y.OUT = 5 To Y.LIMIT Step 4
3550 For X.OUT = 8 To X.MAX Step 8
3560 NUM.WALLS = PAGE(Y.OUT - 1, X.OUT - 2)
3570 NUM.WALLS = NUM.WALLS + PAGE(Y.OUT + 1, X.OUT - 2)
3580 NUM.WALLS = NUM.WALLS + PAGE(Y.OUT + 2, X.OUT)
3590 NUM.WALLS = NUM.WALLS + PAGE(Y.OUT + 1, X.OUT + 2)
3600 NUM.WALLS = NUM.WALLS + PAGE(Y.OUT - 1, X.OUT + 2)
3610 NUM.WALLS = NUM.WALLS + PAGE(Y.OUT - 2, X.OUT)
3620 If NUM.WALLS <> 5 Then 3860
3630 NUM.DEAD.ENDS = NUM.DEAD.ENDS + 1
3640 If PAGE(Y.OUT - 1, X.OUT - 2) <> 0 Then 3680
3650 Line (3 * (X.OUT - 4), 4 * (Y.OUT - 1))-(3 * (X.OUT - 2), 4 * (Y.OUT - 3)), 2
3660 PAGE(Y.OUT - 1, X.OUT - 2) = 1
3670 GoTo 3860
3680 If PAGE(Y.OUT - 2, X.OUT) <> 0 Then 3720
3690 Line (3 * (X.OUT - 2), 4 * (Y.OUT - 3))-(3 * X.OUT, 4 * (Y.OUT - 3)), 2
3700 PAGE(Y.OUT - 2, X.OUT) = 1
3710 GoTo 3860
3720 If PAGE(Y.OUT - 1, X.OUT + 2) <> 0 Then 3760
3730 Line (3 * X.OUT, 4 * (Y.OUT - 3))-(3 * (X.OUT + 2), 4 * (Y.OUT - 1)), 2
3740 PAGE(Y.OUT - 1, X.OUT + 2) = 1
3750 GoTo 3860
3760 If PAGE(Y.OUT + 1, X.OUT + 2) <> 0 Then 3800
3770 Line (3 * (X.OUT + 2), 4 * (Y.OUT - 1))-(3 * X.OUT, 4 * (Y.OUT + 1)), 2
3780 PAGE(Y.OUT + 1, X.OUT + 2) = 1
3790 GoTo 3860
3800 If PAGE(Y.OUT + 2, X.OUT) <> 0 Then 3840
3810 Line (3 * X.OUT, 4 * (Y.OUT + 1))-(3 * (X.OUT - 2), 4 * (Y.OUT + 1)), 2
3820 PAGE(Y.OUT + 2, X.OUT) = 1
3830 GoTo 3860
3840 Line (3 * (X.OUT - 2), 4 * (Y.OUT + 1))-(3 * (X.OUT - 4), 4 * (Y.OUT - 1)), 2
3850 PAGE(Y.OUT + 1, X.OUT - 2) = 1
3860 Next X.OUT
3870 Next Y.OUT
3880 If NUM.DEAD.ENDS <> 0 Then 3180
3890 Beep
3900 While (InKey$ = "")
3910 Wend
3920 Screen 0
3930 Width 80
3940 End

