BBS: Inland Empire Archive Date: 05-09-92 (11:07) Number: 168 From: JEFF FREEMAN Refer#: NONE To: ALL Recvd: NO Subj: Random World Map Conf: (2) Quik_Bas
Someone asked earlier about making a random map. Here's a little ditty for generating random land-masses. This is setup for text-mode, but you could easily change it to PSET's instead of PRINT's and even save it in a RAF. If you're using XLOC and YLOC for grid coordinates, MAXXY for the limit of XLOC and YLOC (so if you want a map that's 100 x 100 then MAXXY = 100) then here's how you determine the record # of a given grid coordinate: RecNum = ((XLOC-1)*MAXXY)-YLOC If you want a wrap-around map then use the ABSLOC function: FUNCTION ABSLOC(XYLOC) Select case XYLOC case is > MAXXY ABSLOC = XYLOC - MAXXY case is < 1 ABSLOC = XYLOC + MAXXY case else ABSLOC = XYLOC end select end function Then call the function like this: RecNum = ((AbsLoc(XLOC)-1)*MaxXY)-AbsLoc(YLoc) Okay... sorry this is sloppy, I just wrapped it out. Here's the actual land-mass generation thing. This uses a function called DIST, which returns the distance from one grid location to another grid location. DECLARE FUNCTION DIST% (X1%, Y1%, X2%, Y2%) DEFINT A-Z RANDOMIZE TIMER CLS FOR Landmass = 1 TO 9 'the number of land-masses desired F1X = FIX(RND * 23) + 1: F2X = FIX(RND * 15) + F1X - 7 F1Y = FIX(RND * 78) + 1: F2Y = FIX(RND * 15) + F1Y - 7 'play with the above to make vastly larger land-masses Size = DIST(F1X, F1Y, F2X, F2Y) + FIX(RND * 10) + 1 LoX = LoX: LoY = F1Y: HiX = F2X: HiY = F2Y IF F1X > F2X THEN SWAP LoX, HiX IF F1Y > F2Y THEN SWAP LoY, HiY FOR PX = LoX - Size / 3 TO HiX + Size / 3 FOR PY = LoY - Size / 3 TO HiY + Size / 3 D1 = DIST(PX, PY, F1X, F1Y): D2 = DIST(PX, PY, F2X, F2Y) IF (D1 + D2) <= Size THEN XX = PX: YY = PY IF XX > 23 THEN XX = XX - 23 'These won't be necessary if IF XX < 2 THEN XX = XX + 23 ' you're using the ABSLOC IF YY > 78 THEN YY = YY - 78 ' function. IF YY < 2 THEN YY = YY + 78 ' LOCATE XX, YY: PRINT "+"; END IF NEXT PY, PX NEXT Landmass BEEP: A$ = INPUT$(1) 'just to letcha know it's done FUNCTION DIST (X1, Y1, X2, Y2) Dist1 = X1 - X2: Dist2 = Y1 - Y2 DIST = SQR((Dist1 ^ 2) * (Dist2 ^ 2)) END FUNCTION There are vast improvements to be made, especially where speed is concerned... This sucker is slow as all heck. Also need something to give the land masses raggly-edges. The basic premise is to select to coordinates as your Foci. Then select a distance which is greater than the distance between Focus 1 and Focus 2. Then following the definition of an ellipse, the sum of the distances from Focus 1 to Focus 2 is the border of the land-mass. "Fill in" all of the squares within that border. ... OFFLINE 1.36 * Ross Perot and what's-his name, 1992. --- * Origin: Camelot BBS - Dallas, TX - (214) 339-8283 (1:124/1011)
Books at Amazon:
Back to BASIC: The History, Corruption, and Future of the Language
Hackers: Heroes of the Computer Revolution (including Tiny BASIC)
Go to: The Story of the Math Majors, Bridge Players, Engineers, Chess Wizards, Scientists and Iconoclasts who were the Hero Programmers of the Software Revolution
The Advent of the Algorithm: The Idea that Rules the World
Moths in the Machine: The Power and Perils of Programming
Mastering Visual Basic .NET