!*********************************************************
! HOTROD.BAS
!
! by Dave Heyliger - AMUS Staff
!
! A Race Car Game
!
! NEEDS INKEY.SBR (INKEY.M68 in [100,52])
!*********************************************************
!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