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