'===========================================================================
' Subject: QBASIC ROAD RACER                  Date: 07-07-96 (00:16)       
'  Author: Akarsha Vasant Kumar               Code: QB, QBasic, PDS        
'  Origin: avkumar@giasbm01.vsnl.net.in     Packet: GAMES.ABC
'===========================================================================
'        °°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°
'        °°°°°°°°°            Qbasic Roadrace          °°°°°°°°°°
'        °°°°°°°°°°°°°°°°-   Akarsha V. Kumar°°°°°°°°°°°°°°°°°°°°

'Namaste ! That's Indian for HI !! I'm a high school dude and I waste lottsa
'time programming in QBASIC ( My mom doesn't like it one bit tho !!)
'This was one of the first games I wrote and it works pretty neatly altho
'the code has been written in a very haphazard manner (I was very new then).
'I have absolutely no idea about how it will look in color (We in India find
'it difficult ..sob ...to afford even a mono monitor ...Boo Hoo Hoo .....).
'So please sympathise 'n do something about the color attributes I've set
'if you get wierd combinations like pink 'n orange ( Har Har ....)
'So all you Sennas out there ...... get set and go !
'Happy playing !!!

'NOTE : Runs fastest when compiled

RANDOMIZE TIMER
TIMER ON
SCREEN 1: CLS

CIRCLE (165, 85), 50, 1: PAINT (165, 85), 1
CIRCLE (160, 80), 50, 2: PAINT (160, 80), 2
LOCATE 10, 16: PRINT "ROAD RACER": SLEEP (2): CLS

LOCATE 10, 14: PRINT "PROGRAM BY :"

FOR X = 2 TO 13
LOCATE 12, X - 1: PRINT "             "
LOCATE 12, X: PRINT "AKARSHA KUMAR"
STARTIME = TIMER
DO
time = TIMER
LOOP UNTIL time - STARTIME > .1

NEXT X

FOR Y = 20 TO 14 STEP -1
LOCATE Y + 1, 11: PRINT "                     "
LOCATE Y, 11: PRINT "D.G.RUPAREL COLLEGE"
STARTIME = TIMER
DO
time = TIMER
LOOP UNTIL time - STARTIME > .1

NEXT Y

LINE (50, 50)-(250, 140), 1, B
SLEEP (1): CLS
DO
PRINT "USE THE FOLLOWING KEYS:"
PRINT : PRINT
PRINT "  LEFT AND RIGHT ARROW KEYS TO MOVE"
PRINT
PRINT "  F1 TO ACCELERATE AND F2 TO DECELERATE"
PRINT
PRINT "  Q TO QUIT ."
LOCATE 15, 5: PRINT "PRESS A KEY"
LOOP UNTIL INPUT$(1) <> ""
CLS

'Init variables
1 X = 0: Y = 10: Z = 190: A = 150: B = 195: I = 1: : SOUNDLEVEL = 1000
STARTTIME = INT(TIMER)

CAR$ = "U20 E3 R7 F3 D20 L12 E2 U15 H2 F2 R7 E2 G2 D15 F2 H2 L7"

DO

CARX = A: CARY = -50
I = (RND * 4) - 2

LOCATE 1, 31: PRINT "Time": LOCATE 1, 36: PRINT "Kms"
LOCATE 14, 1: PRINT "Speed "

10      LINE (100, 0)-(100, 200), 1: LINE (220, 0)-(220, 200), 1
'Get inputs
K$ = INKEY$
IF K$ = CHR$(0) + "K" THEN GOSUB LEFT
IF K$ = CHR$(0) + "M" THEN GOSUB RIGHT
IF UCASE$(K$) = "Q" THEN GOSUB PLAYAGAIN
ON KEY(1) GOSUB SPEEDUP
ON KEY(2) GOSUB SPEEDDOWN

'Time graph
LINE (240, 10)-(260, 190), 1, B
LINE (240, 190 - TIMETAKEN * 9 / 10)-(260, 190), 2, BF

'Distance graph
LINE (280, 10)-(300, 190), 2, B
LINE (280, 190 - (DISTANCE / 1000) * 5 * 9 / 10)-(300, 190), 1, BF

'Speedometer
LINE (50, 50)-(75, 200), 1, BF
LINE (50, 200 - SPEED * 10)-(75, 200 - SPEED * 10), 2

IF CARY > 200 THEN GOTO 20 'Check if obstacle car has moved out of screen

IF SPEED = 0 THEN CARY = CARY - 3 ' If your speed=0 then move obstacle in opp. direction

KEY(1) ON: KEY(2) ON

LINE (95, X)-(100, X - 95), 1, BF         ' --
LINE (95, Y)-(100, Y - 5), 1, BF          '   |
LINE (95, Z)-(100, Z - 95), 1, BF         '   |__ Draw side lines
                                          '   |
LINE (220, X)-(225, X - 95), 1, BF        '   |
LINE (220, Y)-(225, Y - 10), 1, BF        ' --
LINE (220, Z)-(225, Z - 95), 1, BF        '

'Draw Finishline
IF FINISH$ = "WIN" THEN LINE (100, FINISHLINE)-(220, FINISHLINE + 10), 2, BF
PSET (A, 195)
DRAW CAR$

LINE (CARX, CARY)-(CARX + 20, CARY + 35), 1, BF: LINE (CARX + 5, CARY + 10)-(CARX + 15, CARY + 30), 2, BF
LINE (CARX + 5, CARY + 7)-(CARX + 15, CARY + 10), 0, BF

STARTIME = TIMER
DO
time = TIMER
LOOP UNTIL time - STARTIME > .01

LOCATE 1, 1: PRINT "Speed :"; INT(SPEED * 10)
LOCATE 2, 1: PRINT "Crashes :"; CRASH
LOCATE 3, 1: PRINT "Kms :"; 40 - INT(DISTANCE / 1000)
LOCATE 4, 1: PRINT "Time :"; 200 - TIMETAKEN

SOUND (SOUNDLEVEL), .03 ' create that irritating noise

LINE (95, X)-(100, X - 95), 0, BF
LINE (95, Y)-(100, Y - 5), 0, BF
LINE (95, Z)-(100, Z - 95), 0, BF

LINE (220, X)-(225, X - 95), 0, BF
LINE (220, Y)-(225, Y - 10), 0, BF
LINE (220, Z)-(225, Z - 95), 0, BF

IF Z > 240 THEN Z = 0  '
IF Y > 240 THEN Y = 0  ' Check if sidelines move out
IF X > 240 THEN X = 0  '


X = X + SPEED: Y = Y + SPEED: Z = Z + SPEED

LINE (A + 5, 175)-(A + 15, 195), 0, BF ' erase car

'Erase obstacle
LINE (CARX, CARY)-(CARX + 20, CARY + 35), 0, BF: LINE (CARX + 5, CARY + 10)-(CARX + 15, CARY + 30), 0, BF
LINE (CARX + 5, CARY + 7)-(CARX + 15, CARY + 10), 0, BF

'Erase Finishline
IF FINISH$ = "WIN" THEN LINE (100, FINISHLINE)-(220, FINISHLINE + 10), 0, BF

DISTANCE = DISTANCE + SPEED
SYSTEMTIME = INT(TIMER)
TIMETAKEN = SYSTEMTIME - STARTTIME
CARY = CARY + SPEED / 2
CARX = CARX + I
IF FINISH$ = "WIN" THEN FINISHLINE = FINISHLINE + SPEED
IF 200 - TIMETAKEN = 0 THEN LOCATE 11, 16: PRINT "TIME UP": BEEP: SLEEP (2): : STATUS$ = "LOSE": GOSUB PLAYAGAIN
IF FINISHLINE >= 170 THEN LOCATE 11, 13: GOSUB VICTORY
IF 40 - INT(DISTANCE / 1000) <= 0 THEN : FINISH$ = "WIN"
IF CARX > 190 OR CARX < 100 THEN I = I * -1
IF CARY = 190 THEN GOTO 20
IF CARY > 135 AND CARY < 195 AND CARX >= A - 25 AND CARX <= A + 15 THEN SOUND (190), 1: GOSUB CARCRASH: CRASH = CRASH + 1:  ELSE GOTO 10

20 LOOP UNTIL CRASH = 10
LOCATE 11, 13: PRINT "CAR DAMAGED !": BEEP: SLEEP (2): : STATUS$ = "LOSE": GOSUB PLAYAGAIN

'Routines to move car ; decrease & increase speeds

LEFT:
IF A = 100 THEN RETURN
LINE (A - 2, 197)-(A + 17, 160), 0, BF
A = A - 10
PSET (A, 195): DRAW CAR$
LINE (A - 2, 197)-(A + 17, 160), 0, BF
RETURN

RIGHT:
IF A = 200 THEN RETURN
LINE (A - 2, 197)-(A + 17, 160), 0, BF
A = A + 10
PSET (A, 195): DRAW CAR$
LINE (A - 2, 197)-(A + 17, 160), 0, BF
RETURN

SPEEDUP:
IF SPEED >= 15 THEN RETURN
SPEED = SPEED + .1
SOUNDLEVEL = SOUNDLEVEL + 10
RETURN
 
SPEEDDOWN:
IF SPEED <= 0 THEN RETURN
SPEED = SPEED - .1
SOUNDLEVEL = SOUNDLEVEL - 10
RETURN

'Now THIS is the STUPID subroutine .
'I didn't want to complicate the program (for myself).
'So I copied the main subroutine once again and made the crash subroutine .
'NOW don't blame me ! I was new then remember ! I'm too lazy to change it now.

CARCRASH:

KEY(1) STOP: KEY(2) STOP

DO

LINE (100, 0)-(100, 200), 1: LINE (220, 0)-(220, 200), 1

LINE (A - 30, B + 25)-(A + 30, B - 25), 0, BF

LINE (240, 10)-(260, 190), 1, B
LINE (240, 190 - TIMETAKEN * 9 / 10)-(260, 190), 2, BF

LINE (280, 10)-(300, 190), 2, B
LINE (280, 190 - (DISTANCE / 1000) * 5 * 9 / 10)-(300, 190), 1, BF

LINE (50, 50)-(75, 200), 1, BF
LINE (50, 200 - SPEED * 10)-(75, 200 - SPEED * 10), 2

LINE (95, X)-(100, X - 95), 0, BF
LINE (95, Y)-(100, Y - 5), 0, BF
LINE (95, Z)-(100, Z - 95), 0, BF

LINE (220, X)-(225, X - 95), 0, BF
LINE (220, Y)-(225, Y - 10), 0, BF
LINE (220, Z)-(225, Z - 95), 0, BF

IF FINISH$ = "WIN" THEN LINE (100, FINISHLINE)-(220, FINISHLINE + 10), 0, BF

IF Z > 240 THEN Z = 0
IF Y > 240 THEN Y = 0
IF X > 240 THEN X = 0

IF SPEED >= 0 THEN X = X + SPEED: Y = Y + SPEED: Z = Z + SPEED: SPEED = SPEED - .1
LINE (A + 5, 175)-(A + 15, 195), 0, BF

LINE (CARX, CARY)-(CARX + 20, CARY + 35), 0, BF: LINE (CARX + 5, CARY + 10)-(CARX + 15, CARY + 30), 0, BF
LINE (CARX + 5, CARY + 7)-(CARX + 15, CARY + 10), 0, BF

IF 50 - INT(DISTANCE / 1000) <= 0 THEN FINISH$ = "WIN"
IF 200 - TIMETAKEN = 0 THEN LOCATE 11, 16: PRINT "TIME UP": BEEP: SLEEP (2): STATUS$ = "LOSE": GOSUB PLAYAGAIN
CARY = CARY - 3
DISTANCE = DISTANCE + SPEED
SYSTEMTIME = INT(TIMER)
TIMETAKEN = SYSTEMTIME - STARTTIME

LINE (95, X)-(100, X - 95), 1, BF
LINE (95, Y)-(100, Y - 5), 1, BF
LINE (95, Z)-(100, Z - 95), 1, BF

LINE (220, X)-(225, X - 95), 1, BF
LINE (220, Y)-(225, Y - 10), 1, BF
LINE (220, Z)-(225, Z - 95), 1, BF

IF FINISH$ = "WIN" THEN LINE (100, FINISHLINE)-(220, FINISHLINE + 10), 2, BF

'Rotate car
DRAW "TA=" + VARPTR$(ANGLE)
PSET (A, B)
DRAW CAR$

LINE (CARX, CARY)-(CARX + 20, CARY + 35), 1, BF: LINE (CARX + 5, CARY + 10)-(CARX + 15, CARY + 30), 2, BF
LINE (CARX + 5, CARY + 7)-(CARX + 15, CARY + 10), 0, BF

STARTIME = TIMER
DO
time = TIMER
LOOP UNTIL time - STARTIME > .01

LOCATE 1, 1: PRINT "Speed :"; INT(SPEED * 10)
LOCATE 2, 1: PRINT "Crashes :"; CRASH
LOCATE 3, 1: PRINT "Kms :"; 40 - INT(DISTANCE / 1000)
LOCATE 4, 1: PRINT "Time :"; 200 - TIMETAKEN
SOUND (SOUNDLEVEL), .03

IF A > 190 THEN A = 190
IF A < 130 THEN A = 130

'Determine direction of spin and centre car if it spins out of road
IF CARX <= A - 15 THEN ANGLE = ANGLE - SPEED ELSE ANGLE = ANGLE + SPEED
B = B - SPEED * .05: IF ANGLE <= -360 OR ANGLE >= 355 THEN ANGLE = 0

IF FINISHLINE >= 200 THEN GOSUB VICTORY
IF SPEED < 0 THEN SOUNDLEVEL = 440
SOUNDLEVEL = SOUNDLEVEL - 10

LOOP UNTIL SPEED <= 0 AND CARY < -50
LOCATE 1, 1: PRINT "Speed : 0"
SLEEP (2)
SOUNDLEVEL = 1000
SPEED = 0: ANGLE = 0: B = 195: CLS
RETURN

VICTORY:
KEY(12) STOP: KEY(13) STOP: KEY(1) STOP: KEY(2) STOP

SPEED = 0
FOR I = 200 TO 0 STEP -1
LINE (A - 2, I)-(A + 17, I + 30), 0, BF
PSET (A, I): DRAW CAR$
STARTIME = TIMER
DO
time = TIMER
LOOP UNTIL time - STARTIME > .005

NEXT I
CLS
CIRCLE (165, 85), 50, 1: PAINT (165, 85), 1
CIRCLE (160, 80), 50, 2: PAINT (160, 80), 2
LOCATE 10, 16: PRINT " YOU WIN !!":
PLAY "MFo3L8ED+ED+Eo2Bo3DCL2o2A": SLEEP (1)

SYSTEM

PLAYAGAIN:
50 CLS : LOCATE 11, 13: INPUT "QUIT ?(Y/N)"; ANS$: ANS$ = UCASE$(ANS$)
IF ANS$ = "N" THEN
CLS
IF STATUS$ = "LOSE" THEN GOTO 1 ELSE RETURN
END IF
IF ANS$ = "Y" THEN
SCREEN 2: SCREEN 0: CLS
LOCATE 10, 25: PRINT "This game was written in QuickBasic"
LOCATE 11, 22: PRINT "You are free to distribute it as you like."
LOCATE 12, 28: PRINT "Do send in comments at:"
LOCATE 13, 27: PRINT "avkumar@giasbm01.vsnl.net.in"

LOCATE 15, 30: PRINT "Thanks for playing..."
DO: LOOP UNTIL INKEY$ <> ""
CLS : SYSTEM

ELSE GOTO 50
END IF
