BASIC Terrain Generation Program
The following is a BASIC program that runs under GWbasic. If you download this page and
remove the small amount of HTML code you should be able to generate your own printed maps
with the random terrain numbers printed in the squares. You need to have Gwbasic on your
computer for this to work.
10 'Random Map Program (16x16)
20 INPUT"Do you want to start (y/n)";A$:IF A$="n" THEN END
21 M=0:CLEAR:DIM G(16,16): DIM M$(25):RANDOMIZE
40 INPUT"Do you want to print a blank map (y/n)";A$:IF A$="y" THEN GOSUB 190
50 INPUT"Do you want to create a random map (y/n)";A$:IF A$="n" THEN END
60 GOSUB 500' Fixed Features
80 GOSUB 1000' Road and Stream
90 PRINT"Is this area Coastal Plain (c), Piedmont (p), Foothills (f),
100 PRINT"Valley (v), or Hilly (h)";:INPUT; A$
110 IF A$="c" THEN GOSUB 2000
120 IF A$="p" THEN GOSUB 3000
130 IF A$="f" THEN GOSUB 4000
140 IF A$="v" THEN GOSUB 5000
150 IF A$="h" THEN GOSUB 800:GOSUB 6000
155 PRINT
160 INPUT"Do you want to print out the map (y/n)";A$:IF A$="n" GOTO 20
162 IF A$<>"y"GOTO 160 ELSE GOSUB 7000
164 GOTO 20
180 '
190 ' Blank Map Option
200 '
210 PRINT:PRINT:PRINT:PRINT
220 PRINT" TOP":A$="##":B$="####"
230 GOSUB 400:GOSUB 430
240 FOR I=1 TO 16
250 IF I=8 THEN PRINT" L"; ELSE IF I=9 THEN PRINT" E"; ELSE IF I=10 THEN
PRINT" F"; ELSE IF I=11 THEN PRINT" T";ELSE PRINT" ";
280 PRINT" ";:PRINT USING A$;I;:PRINT"!";
290 FOR J=1 TO 16
300 PRINT" !";
310 NEXT J
320 PRINT USING A$;I;
330 IF I=7 THEN PRINT" R"; ELSE IF I=8 THEN PRINT" I"; ELSE IF I=9 THEN
PRINT" G";
340 IF I=10 THEN PRINT" H" ELSE IF I=11 THEN PRINT" T" ELSE PRINT
350 GOSUB 430
360 NEXT I
370 GOSUB 400
380 PRINT" BOTTOM"
390 RETURN
400 PRINT" ";
410 FOR K=1 TO 16:PRINT USING B$;K;:NEXT K
420 PRINT:RETURN
430 PRINT" +";
440 FOR K=1 TO 16:PRINT"---+";:NEXT
450 PRINT:RETURN
500 ' Fixed Feature Routine
510 '
520 PRINT"Fixed features are terrain that appears on the campaign map
530 PRINT"and must be specifically locted or modified for the terrain map."
540 F$(1)="City":F$(2)="Town":F$(3)="Minor River"
550 INPUT "Any fixed Features (y/n)";A$:IF A$="n" THEN RETURN
560 PRINT"Which feature do you want to indicate?
570 PRINT"1 = City; 2 = Town; 3 = Minor River; 4 = Finished
580 INPUT"Number";N: IF N=4 THEN RETURN
590 IF N=3 GOTO 650
600 PRINT"Grid of "F$(N)" - number on LEFT row (99 when done)";
610 INPUT A: IF A=99 GOTO 560
620 GOSUB 740
630 IF N=2 THEN G(A,B)=98:GOTO 560
640 G(A,B)=99:GOTO 600
650 GOSUB 710:GOSUB 740
660 M$=F$(3)+" from"+STR$(A)+","+STR$(B)
670 GOSUB 710: GOSUB 740
680 M=M+1:M$=M$+" to"+STR$(A)+","+STR$(B)
690 F=INT(RND*6):M$(M)=M$+". There are"+STR$(F)+" ford(s).":GOTO 560
700 'routines
710 E$="Enters":E=E+1:IF E=2 THEN E$="Exits":E=0
720 PRINT"Grid location of where "F$(3)" " E$" map - number on LEFT";
730 INPUT A:RETURN
740 INPUT"Grid number on TOP row";B:RETURN
750 '
760 '
770 '
780 '
800 ' Pass Routine
810 PRINT"This section is to generate a map in a Mountain Pass where
820 PRINT"one or more sides are mountainous. Passes should have five
830 PRINT"or fewer 'OPEN' rows.
840 INPUT"Is this map a pass (y/n)";A$:IF A$="n" THEN RETURN
850 PRINT"What are the starting and ending OPEN rows?
860 INPUT"Open row number on the TOP left";A
870 INPUT"open row number on the TOP right";B
880 FOR I=1 TO 16
890 FOR J=1 TO (A-1)
900 GOSUB 990
910 NEXT J
920 NEXT I
930 FOR I=1 TO 16
940 FOR J=(B+1) TO 16
950 GOSUB 990
960 NEXT J
970 NEXT I
980 RETURN
990 X=INT(RND*3):X=X+80:G(I,J)=X:RETURN
1000 ' ----- Roads and Streams
1010 D$(1)="Top":D$(2)="Left":D$(3)="Right":D$(4)="Bottom"
1030 FOR I=1 TO 4
1040 X=RND:IF X<.4 GOTO 1100 ELSE Y=INT(RND*2)+1
1050 GOSUB 1230:Z=C:GOSUB 1230:A=C:GOSUB 1220:W=D
1070 M=M+1:M$(M)="Road from "+D$(I)+" at"+STR$(Z)+" to "+D$(W)+"
at"+STR$(A)
1100 NEXT I
1110 'Streams
1120 FOR I=1 TO 4
1130 X=RND:IF X<.4 GOTO 1200 ELSE Y=INT(RND*2)+1
1140 GOSUB 1230:Z=C:GOSUB 1230:A=C:GOSUB 1220:W=D
1150 TP$="Stream"
1160 M=M+1:M$(M)=TP$+" from "+D$(I)+" at"+STR$(Z)+" to "+D$(W)+"
at"+STR$(A)
1170 R=RND:IF R<.3 THEN M$(M)=M$(M)+", rough entire length.":GOTO 1200
1180 F=INT(RND*50)+35:FD=INT(RND*10)
1190 M$(M)=M$(M)+", rough"+STR$(F)+"%. There are"+STR$(FD)+" fords.
1200 NEXT I
1210 RETURN
1220 D=INT(RND*4):IF D=I OR D=0 GOTO 1220 ELSE RETURN
1230 C=INT(RND*16)+1:IF C=0 OR C>16 GOTO 1230 ELSE RETURN
2000 ' Coastal Plain Terrain
2010 FOR I=1 TO 16
2020 FOR J=1 TO 16
2030 IF G(I,J)<>0 GOTO 2310
2040 X=(INT(RND*100)+1):IF X>100 GOTO 2040
2050 IF X<32 THEN G(I,J)=0
2060 IF X=>33 AND X<=35 THEN G(I,J)=11
2070 IF X=>36 AND X<=37 THEN G(I,J)=12
2080 IF X=38 THEN G(I,J)=13
2090 IF X=>39 AND X<=41 THEN G(I,J)=21
2100 IF X=>42 AND X<=44 THEN G(I,J)=22
2110 IF X=>45 AND X<=46 THEN G(I,J)=23
2120 IF X=>47 AND X<=56 THEN G(I,J)=30
2130 IF X=>57 AND X<=58 THEN G(I,J)=31
2140 IF X=>59 AND X<=61 THEN G(I,J)=40
2150 IF X=>62 AND X<=63 THEN G(I,J)=50
2160 IF X=>64 AND X<=65 THEN G(I,J)=71
2170 IF X=>66 AND X<=68 THEN G(I,J)=61
2190 IF X=69 THEN G(I,J)=62
2210 IF X=>70 AND X<=89 THEN G(I,J)=71
2220 IF X=>90 AND X<=94 THEN G(I,J)=72
2240 IF X=>95 AND X<=98 THEN G(I,J)=28
2300 IF X>98 THEN G(I,J)=29
2310 NEXT J
2320 NEXT I
2330 RETURN
3000 ' Piedmont Terrain Generation
3010 FOR I=1 TO 16
3020 FOR J=1 TO 16
3030 IF G(I,J)<>0 GOTO 3320
3040 X=(INT(RND*100)+1):IF X>100 GOTO 3040
3050 IF X<26 THEN G(I,J)=0
3060 IF X=>26 AND X<=31 THEN G(I,J)=11
3070 IF X=>32 AND X<=34 THEN G(I,J)=12
3080 IF X=>35 AND X<=36 THEN G(I,J)=13
3090 IF X=>37 AND X<=42 THEN G(I,J)=21
3100 IF X=>43 AND X<=46 THEN G(I,J)=22
3110 IF X=>47 AND X<=49 THEN G(I,J)=23
3120 IF X=>50 AND X<=61 THEN G(I,J)=30
3130 IF X=>62 AND X<=64 THEN G(I,J)=31
3140 IF X=>65 AND X<=67 THEN G(I,J)=40
3150 IF X=68 THEN G(I,J)=50
3160 IF X=>69 AND X<=70 THEN G(I,J)=71
3170 IF X=71 THEN G(I,J)=61
3180 IF X=72 THEN G(I,J)=62
3210 IF X=>73 AND X<=83 THEN G(I,J)=71
3220 IF X=>84 AND X<=91 THEN G(I,J)=72
3230 IF X=>92 AND X<=97 THEN G(I,J)=28
3240 IF X=>98 THEN G(I,J)=29
3320 NEXT J
3330 NEXT I
3340 RETURN
4000 ' Foothill Terrain Generation
4010 FOR I=1 TO 16
4020 FOR J=1 TO 16
4030 IF G(I,J)<>O GOTO 4320
4040 X=(INT(RND*100)+1):IF X>100 GOTO 4040
4050 IF X<11 THEN G(I,J)=0
4060 IF X>11 AND X<=15 THEN G(I,J)=11
4070 IF X>15 AND X<=19 THEN G(I,J)=12
4080 IF X>19 AND X<=23 THEN G(I,J)=13
4090 IF X>23 AND X<=32 THEN G(I,J)=21
4100 IF X>32 AND X<=41 THEN G(I,J)=22
4110 IF X>41 AND X<=46 THEN G(I,J)=23
4120 IF X>46 AND X<=48 THEN G(I,J)=28
4130 IF X>48 AND X<=51 THEN G(I,J)=29
4150 IF X>51 AND X<=64 THEN G(I,J)=30
4160 IF X>64 AND X<=69 THEN G(I,J)=31
4170 IF X>69 AND X<=71 THEN G(I,J)=40
4200 IF X>71 AND X<=79 THEN G(I,J)=71
4220 IF X>79 AND X<=86 THEN G(I,J)=72
4230 IF X=87 THEN G(I,J)=62
4240 IF X>87 AND X<=89 THEN G(I,J)=61
4260 IF X>89 AND X<=92 THEN G(I,J)=14
4270 IF X>92 AND X<=94 THEN G(I,J)=24
4280 IF X=>95 THEN G(I,J)=71
4310 IF X=100 THEN G(I,J)=62
4320 NEXT J
4330 NEXT I
4340 RETURN
5000 ' Valley Terrain Generation
5010 FOR I=1 TO 16
5020 FOR J=1 TO 16
5030 IF G(I,J)>0 GOTO 5320
5040 X=(INT(RND*100)+1):IF X>100 GOTO 5040
5050 IF X<9 THEN G(I,J)=0
5060 IF X=>9 AND X<=13 THEN G(I,J)=11
5070 IF X=>14 AND X<=18 THEN G(I,J)=12
5080 IF X=>19 AND X<=23 THEN G(I,J)=13
5090 IF X=>24 AND X<=35 THEN G(I,J)=21
5100 IF X=>36 AND X<=48 THEN G(I,J)=22
5110 IF X=>49 AND X<=57 THEN G(I,J)=23
5120 IF X=>58 AND X<=60 THEN G(I,J)=28
5130 IF X=>61 AND X<=63 THEN G(I,J)=29
5150 IF X=>64 AND X<=76 THEN G(I,J)=30
5160 IF X=>77 AND X<=83 THEN G(I,J)=31
5200 IF X=84 THEN G(I,J)=50
5220 IF X=85 THEN G(I,J)=61
5230 IF X=86 THEN G(I,J)=62
5260 IF X=>87 AND X<=89 THEN G(I,J)=40
5270 IF X=>90 AND X<=94 THEN G(I,J)=71
5280 IF X=>95 THEN G(I,J)=72
5320 NEXT J
5330 NEXT I
5340 RETURN
6000 ' Hilly/Pass Terrain Generation
6010 FOR I=1 TO 16
6020 FOR J=1 TO 16
6030 IF G(I,J)>0 GOTO 6340
6040 X=(INT(RND*100)+1):IF X>100 GOTO 6040
6050 IF X<3 THEN G(I,J)=0
6060 IF X=>3 AND X<=4 THEN G(I,J)=11
6070 IF X=>5 AND X<=9 THEN G(I,J)=12
6080 IF X=>10 AND X<=17 THEN G(I,J)=13
6090 IF X=>18 AND X<=25 THEN G(I,J)=21
6100 IF X=>26 AND X<=35 THEN G(I,J)=22
6110 IF X=>36 AND X<=47 THEN G(I,J)=23
6120 IF X=>48 AND X<=49 THEN G(I,J)=28
6130 IF X=>50 AND X<=51 THEN G(I,J)=29
6140 IF X=>52 AND X<=53 THEN G(I,J)=14
6150 IF X=>54 AND X<=63 THEN G(I,J)=30
6160 IF X=>64 AND X<=73 THEN G(I,J)=31
6170 IF X=>74 AND X<=78 THEN G(I,J)=24
6180 IF X=>79 AND X<=81 THEN G(I,J)=40
6190 IF X=82 THEN G(I,J)=61
6240 IF X=83 THEN G(I,J)=62
6250 IF X=84 THEN G(I,J)=50
6270 IF X=>95 AND X<=90 THEN G(I,J)=71
6280 IF X=>91 THEN G(I,J)=72
6340 NEXT J
6350 NEXT I
6360 RETURN
7000 ' Map Printout
7001 INPUT"Name or location of map";L$
7002 LPRINT" Map Name - "L$
7010 LPRINT:LPRINT
7020 LPRINT" TOP":A$="##":B$="####":C$="###"
7030 GOSUB 7180:GOSUB 7210
7040 FOR I=1 TO 16
7050 IF I=8 THEN LPRINT" L"; ELSE IF I=9 THEN LPRINT" E"; ELSE IF I=10 THEN
LPRINT" F"; ELSE IF I=11 THEN LPRINT" T";ELSE LPRINT" ";
7060 LPRINT" ";:LPRINT USING A$;I;:LPRINT"!";
7070 FOR J=1 TO 16
7075 LPRINT USING C$;G(I,J);
7080 LPRINT"!";
7090 NEXT J
7100 LPRINT USING A$;I;
7110 IF I=7 THEN LPRINT" R"; ELSE IF I=8 THEN LPRINT" I"; ELSE IF I=9 THEN
LPRINT" G";
7120 IF I=10 THEN LPRINT" H" ELSE IF I=11 THEN LPRINT" T" ELSE LPRINT
7130 GOSUB 7210
7140 NEXT I
7150 GOSUB 7180
7160 LPRINT" BOTTOM"
7161 LPRINT:LPRINT "Suggestions":LPRINT
7162 FOR K=1 TO M:LPRINT M$(K):NEXT
7170 LPRINT CHR$(12)
7175 INPUT"Print another copy (y/n)";A$:IF A$="y" GOTO 7002 ELSE RETURN
7180 LPRINT" ";
7190 FOR K=1 TO 16:LPRINT USING B$;K;:NEXT K
7200 LPRINT:RETURN
7210 LPRINT" +";
7220 FOR K=1 TO 16:LPRINT"---+";:NEXT
7230 LPRINT:RETURN