!********************************************************* ! HOTROD.BAS ! ! by Dave Heyliger - AMUS Staff ! ! A Race Car Game ! ! NEEDS INKEY.SBR (INKEY.M68 in [100,52]) !********************************************************* MAP1 track,S,25,"* *" MAP1 track'course,F MAP1 track'center,F MAP1 track'centers(24),F MAP1 car'spot,F MAP1 top'car1,S,7," O-M-O " MAP1 mid'car,S,7," [ ] " MAP1 end'car1,S,7," O-W-O " MAP1 in'key,S,1 MAP1 racer'data(24),F MAP1 racer'loc,F MAP1 miles,F !instructions: ? TAB(-1,0) ? TAB(5,10)"Car stays in middle of screen. Use LEFT and RIGHT arrows" ? TAB(6,10)"to move car in appropriate direction. Do not hit other" ? TAB(7,10)"cars or the side walls. "; INPUT " Hit RETURN to begin... ",A$ !initialize game by producing beginning of track RANDOMIZE !random track gen. ? TAB(-1,0) !clear screen ? TAB(-1,29) !print track at bottom track'center=40 !start at center miles=0 !traveled 0 miles FOR j = 12 to 24 !do this 13 times: CALL out'track !print 1 line of track PRINT track'centers(j)=track'center !save track center(s) NEXT j !start of track done car'spot = 40 !set car to middle loop: FOR k = 1 to 15 !do this 15 times: ON ERROR GOTO END !quit on ^C CALL move'car !move/print the car CALL adjust'centers !adjust centers CALL crash'check !see if crash CALL out'track !print more track CALL adjust'racer'data !keep track of others PRINT miles = miles + 0.25 !increase odometer NEXT k !do it again ! Find out where new racer will be placed on the track: IF track'course > 5 & THEN racer'loc = track'center - 7 & ELSE racer'loc = track'center + 3 ! Print out new racer (takes 3 loops) while still performing same stuff FOR m = 1 to 3 !takes 3 loops: ON ERROR GOTO END !^C quit CALL move'car !move racer CALL adjust'centers !keep track of centers CALL crash'check !see if crash CALL out'track !print more track IF m = 1 THEN ? TAB(24,racer'loc) "O-M-O" !new racer data IF m = 2 THEN ? TAB(24,racer'loc) " [ ]" IF m = 3 THEN ? TAB(24,racer'loc) "O-W-O" CALL adjust'racer'data !keep track of new car racer'data(24) = racer'loc+3 !record new car loc miles = miles + 0.25 !increase odometer NEXT m !do it again GOTO loop !now do above loop !*************** ! Subroutines: !*************** !adjust'racer'data Subroutine - adjusts current "other racer" position(s) adjust'racer'data: FOR p = 10 to 23 racer'data(p) = racer'data(p+1) NEXT p racer'data(24) = 0 RETURN !out'track Subroutine - prints out 1 line of the random track out'track: ? TAB(24,track'center-13); !tab to here ? track; !print track track'course = RND(0)*10 !get a random number IF track'course < 5 & THEN track'center = track'center - 1 & ELSE track'center = track'center + 1 IF track'center < 14 & THEN track'center = 14 !limit left to 14 IF track'center > 66 & THEN track'center = 66 !limit right to 66 RETURN !end of out'track !move'car Subroutine - moves/prints out the sporty race car move'car: XCALL INKEY,in'key !get an input key IF ASC(in'key) = 12 & THEN IF car'spot <> 72 & THEN car'spot=car'spot+1 : GOTO pc IF ASC(in'key) = 8 & THEN IF car'spot <> 9 & THEN car'spot=car'spot-1 pc: ? TAB(10,car'spot)" " !print car out ? TAB(11,car'spot)top'car1 ? TAB(12,car'spot)mid'car ? TAB(13,car'spot)end'car1 RETURN !crash'check Subroutine - see if swishy race car crashed into wall or "other" crash'check: IF track'centers(14) - 13 = car'spot THEN ? CHR(7) : GOTO END IF track'centers(14) + 13 = car'spot + 8 THEN ? CHR(7) : GOTO END IF ABS(car'spot+4 - racer'data(14)) < 6 THEN ? CHR(7) : GOTO END RETURN !adjust'centers Subroutine - adjusts the center of the track array adjust'centers: FOR j = 12 to 23 track'centers(j) = track'centers(j+1) NEXT j track'centers(24) = track'center RETURN END: ? TAB(-1,28) ? TAB(24,20)"Total Miles: "miles