'===========================================================================
' Subject: COMPURACE                          Date: 06-29-97 (00:33)       
'  Author: Jay Cook                           Code: QB, QBasic, PDS        
'  Origin: jay.cook@sandh.com               Packet: GAMES.ABC
'===========================================================================
'Project CompuRace From the C=64; Jay Cook (jay.cook@sandh.com)
'http://www.tripod.com/~jaycook/qb.htm <-- My Qbasic Web Page
'Date: Wed 6-19-96,12:30 am, thinking about 80's, and the c64
'     and Compurace came to mind, a little nostlogia(sp)
'  Let me fill you in, because NOBODY has played this on the C64
'and the reason was is because my dad made it =) I still remember
'when he made the little car sprite and you could control it on the
'screen before the track and opponent... those were the days(I was like
' 4 or 5 so it was 1985 or 86.
'ADDED:12:30-1:10am, programmed in car grafix, thinking entering in
'  number is so mind numbing, but doesn't matter when your half asleep
'ADDED:1:15-1:35am, track and start of cars
'Problem: When text gets to bottom of screen, it moves it up
'ADDED:1:40-2:00am,  movement and lap count
'ADDED:2:10-2:50am,  collision detection of walls(and shit tired!)
'ADDED:3:10-3:25a, comp car movement and delay, finished!!!
'  cat delaying finish by pestering me =)
'Done in 135 minutes, which is 2 hours and 15 minutes!!
' 9-16-96 Mon 5:30pm: Looked over source, seems all good, so I will zip it
'6-29-97
'Added new keyboard routine
'Added page flipping
'Added sync from Eric Carr's Spinball 2.5 source
'  Ok, I have redone the keyboard routines and added other things. This game
'isn't really half bad, but now that the keyboard buffer doesn't flood, the
'computer car can be slaughtered by a lap. If I were to reprogram this, I would
'give each "O" colision coordinates, then put the whole track in an array, so
'new tracks could be made with ease. Also I would reprogram the Computer car
'AI so it would scan left and right sides of the track to see if it can turn
'or keep going straight. But all in all, it is a fun game. Also, this isn't
'the best of my programming ability. If you see the dates in my log, you will
'see this source is about a year old. Well, once again have fun and visit my
'Qbasic page: http://members.tripod.com/~jaycook/QB.HTM
'
'#### #### How to play:
'Use the num keys to move your car(white), Q to quit
'
'                                       -Jay
DEFINT A-Z
SCREEN 7
'########################## Init Stuff ########################
DIM wcu(100): 'white car up
DIM wcd(100): 'white car down
DIM wcl(100): 'white car left
DIM wcr(100): 'white car right
DIM bcu(100): 'blue car up
DIM bcd(100): 'blue car down
DIM bcl(100):  'blue car left
DIM bcr(100): 'blue car right
DIM trk(2000): 'capture bottom of screen to make track bigger
x = 187: y = 174: XA = x: YA = y: 'Start of your car
ox = 204: oy = 174: 'Start of other car
d = 1: 'Starting direction
d2 = 1: 'starting dir of comp
dly = 1000: 'delay time
GOSUB 1
GOSUB TRACK
GOSUB laps
GOSUB START
'for screen 9 support
'DIM scrn(8000): GET (0, 0)-(319, 199), scrn: SCREEN 9: PUT (0, 0), scrn: COLOR 2, 1
GOSUB GO
GOSUB main
s1 = 1: s2 = 0
main: '############################ Main Loop #########################
DO
SWAP s1, s2
SCREEN 7, , s1, s2
WAIT &H3DA, 8
YA = 0: XA = 0 'resets controls
SELECT CASE INP(96)
      CASE 1: END
      CASE 16: END
      CASE 72: GOSUB c1e: YA = y: XA = x: y = y - 3: d = 1: GOSUB c1:
      CASE 80: GOSUB c1e: YA = y: XA = x: y = y + 3: d = 2: GOSUB c1:
      CASE 75: GOSUB c1e: XA = x: YA = y: x = x - 3: d = 3: GOSUB c1:
      CASE 77: GOSUB c1e: XA = x: YA = y: x = x + 3: d = 4: GOSUB c1:
END SELECT
IF INKEY$ = "a" THEN a = a

GOSUB move
GOSUB delay
LOOP
c1e:
IF d = 1 THEN PUT (x, y), wcu
IF d = 2 THEN PUT (x, y), wcd
IF d = 3 THEN PUT (x, y), wcl
IF d = 4 THEN PUT (x, y), wcr
RETURN
c2:
'start,finish line
IF (ox > 170 AND ox < 232) AND (oy < 145 AND oy > 141) THEN l2 = l2 + 1: GOSUB laps
IF d2 = 1 THEN PUT (ox, oy), bcu
IF d2 = 2 THEN PUT (ox, oy), bcd
IF d2 = 3 THEN PUT (ox, oy), bcl
IF d2 = 4 THEN PUT (ox, oy), bcr
RETURN
c2e:
IF d2 = 1 THEN PUT (ox, oy), bcu
IF d2 = 2 THEN PUT (ox, oy), bcd
IF d2 = 3 THEN PUT (ox, oy), bcl
IF d2 = 4 THEN PUT (ox, oy), bcr
RETURN
move:
GOSUB c2e
IF n = 0 THEN d2 = 1: oy = oy - 3: IF oy < 7 THEN oy = 7: n = 1
IF n = 1 THEN d2 = 3: ox = ox - 3: IF ox < 7 THEN ox = 7: n = 2
IF n = 2 THEN d2 = 2: oy = oy + 3: IF oy > 55 THEN oy = 55: n = 3
IF n = 3 THEN d2 = 4: ox = ox + 3: IF ox > 50 THEN ox = 50: n = 4
IF n = 4 THEN d2 = 2: oy = oy + 3: IF oy > 104 THEN oy = 104: n = 5
IF n = 5 THEN d2 = 3: ox = ox - 3: IF ox < 7 THEN ox = 7: n = 6
IF n = 6 THEN d2 = 2: oy = oy + 3: IF oy > 177 THEN oy = 177: n = 7
IF n = 7 THEN d2 = 4: ox = ox + 3: IF ox > 204 THEN ox = 204: n = 0
GOSUB c2

RETURN
c1:
'start,finish line
IF (x > 170 AND x < 242) AND (y < 145 AND y > 141) THEN l1 = l1 + 1: GOSUB laps
GOSUB limits
IF d = 1 THEN PUT (x, y), wcu
IF d = 2 THEN PUT (x, y), wcd
IF d = 3 THEN PUT (x, y), wcl
IF d = 4 THEN PUT (x, y), wcr
RETURN
limits: 'screen limits for your car and If you hit wall:
IF x < 6 THEN x = 6: RETURN
IF x > 209 THEN x = 209: RETURN
IF y < 6 THEN y = 6: RETURN
IF y > 177 THEN y = 177: RETURN
IF x > 1 AND x < 46 AND y > 58 AND y < 101 THEN x = XA: y = YA: RETURN
IF x > 42 AND x < 103 AND y > 26 AND y < 46 THEN x = XA: y = YA: RETURN
IF x > 90 AND x < 174 AND y > 26 AND y < 158 THEN x = XA: y = YA: RETURN
IF x > 42 AND x < 103 AND y > 114 AND y < 158 THEN x = XA: y = YA: RETURN
RETURN

delay: 'delay for speed of game
' FOR B = 1 TO dly: NEXT B
DEF SEG = 0
POKE (1132), 0  'reset timer again
T:
IF PEEK(1132) < 1 THEN GOTO T  'If not enough time was passed goto T
RETURN

TRACK: CLS ':#################### Screen Setup ##########################
COLOR 2, 1
PRINT "OOOOOOOOOOOOOOOOOOOOOOOOOOOOO"
PRINT "O                           O"
PRINT "O                           O"
PRINT "O                           O"
PRINT "O                           O"
PRINT "O      OOOOOOOOOOOOOO       O"
PRINT "O            O       O      O"
PRINT "O            O       O      O"
PRINT "O            O       O      O"
PRINT "OOOOO        O       O      O"
PRINT "     O       O       O      O"
PRINT "     O       O       O      O"
PRINT "OOOOO        O       O      O"
PRINT "O            O       O      O"
PRINT "O            O       O      O"
PRINT "O            O       O      O"
PRINT "O       OOOOOO       O      O"
PRINT "O      O             O      O"
PRINT "O      O             O      O"
PRINT "O       OOOOOOOOOOOOO       O"
PRINT "O                           O"
PRINT "O                           O"
PRINT "OOOOOOOOOOOOOOOOOOOOOOOOOOOOO"
GET (0, 160)-(230, 182), trk: PUT (0, 176), trk, PSET: 'fixes screen
COLOR 9
LOCATE 18, 32: PRINT "LAPS"
LOCATE 20, 32: PRINT "YOU    0"
LOCATE 22, 32: PRINT "ME"
RETURN
laps:
LOCATE 20, 37: COLOR 15: PRINT l1
LOCATE 22, 37: COLOR 9: PRINT l2
IF l1 > 3 THEN GOSUB WIN
IF l2 > 3 THEN GOSUB LOSE
RETURN
WIN:
LOCATE 5, 32: COLOR 15: PRINT "YOU WIN"
y = 145: GOSUB c1
END
LOSE:
LOCATE 5, 32: COLOR 9: PRINT "YOU LOSE"
oy = 145: GOSUB c2
END
GO:
LOCATE 1, 32: COLOR 9: PRINT "GET READY"
SLEEP 1
LOCATE 2, 32: COLOR 2: PRINT "GET SET"
SLEEP 1
LOCATE 3, 32: COLOR 15: PRINT "GO GO GO!"
RETURN
START:
GOSUB c1
GOSUB c2
RETURN

'############################# Grafix #########################
1 CLS
RESTORE bcu
FOR row = 1 TO 14
 FOR column = 1 TO 13
 READ picData
  PSET (column, row), picData
NEXT column
NEXT row
GET (0, 0)-(13, 14), bcu
GOTO 2
bcu:
DATA 0, 0, 0, 0, 0, 9, 9, 9, 0, 0, 0, 0, 0
DATA 0, 9, 0, 0, 9, 9, 0, 9, 9, 0, 0, 9, 0
DATA 0, 9, 0, 9, 9, 9, 9, 0, 9, 9, 0, 9, 0
DATA 0, 9, 0, 9, 9, 9, 0, 9, 9, 9, 0, 9, 0
DATA 0, 9, 0, 9, 9, 9, 0, 9, 9, 9, 0, 9, 0
DATA 0, 0, 0, 9, 9, 9, 9, 0, 9, 9, 0, 0, 0
DATA 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0
DATA 0, 0, 0, 9, 9, 9, 0, 9, 9, 9, 0, 0, 0
DATA 9, 9, 0, 9, 9, 0, 9, 0, 9, 9, 0, 9, 9
DATA 9, 9, 0, 9, 9, 0, 9, 0, 9, 9, 0, 9, 9
DATA 9, 9, 0, 9, 9, 0, 9, 0, 9, 9, 0, 9, 9
DATA 9, 9, 0, 9, 9, 0, 0, 0, 9, 9, 0, 9, 9
DATA 0, 0, 0, 0, 9, 9, 0, 9, 9, 0, 0, 0, 0
DATA 0, 0, 0, 0, 0, 9, 9, 9, 0, 0, 0, 0, 0
2 :
CLS
RESTORE bcd
FOR row = 1 TO 14
 FOR column = 1 TO 13
 READ picData
  PSET (column, row), picData
NEXT column
NEXT row
GET (0, 0)-(13, 14), bcd
GOTO 3
bcd:
DATA 0, 0, 0, 0, 0, 9, 9, 9, 0, 0, 0, 0, 0
DATA 0, 0, 0, 0, 9, 9, 0, 9, 9, 0, 0, 0, 0
DATA 9, 9, 0, 9, 9, 0, 9, 0, 9, 9, 0, 9, 9
DATA 9, 9, 0, 9, 9, 0, 9, 0, 9, 9, 0, 9, 9
DATA 9, 9, 0, 9, 9, 0, 9, 0, 9, 9, 0, 9, 9
DATA 9, 9, 0, 9, 9, 0, 0, 0, 9, 9, 0, 9, 9
DATA 0, 0, 0, 9, 9, 9, 0, 9, 9, 9, 0, 0, 0
DATA 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0
DATA 0, 0, 0, 9, 9, 9, 9, 0, 9, 9, 0, 0, 0
DATA 0, 9, 0, 9, 9, 9, 0, 9, 9, 9, 0, 9, 0
DATA 0, 9, 0, 9, 9, 9, 0, 9, 9, 9, 0, 9, 0
DATA 0, 9, 0, 9, 9, 9, 9, 0, 9, 9, 0, 9, 0
DATA 0, 9, 0, 0, 9, 9, 0, 9, 9, 0, 0, 9, 0
DATA 0, 0, 0, 0, 0, 9, 9, 9, 0, 0, 0, 0, 0
3 :
CLS
RESTORE bcl
FOR row = 1 TO 13
 FOR column = 1 TO 14
 READ picData
  PSET (column, row), picData
NEXT column
NEXT row
GET (0, 0)-(14, 13), bcl
GOTO 4
bcl:
DATA 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 0, 0
DATA 0, 9, 9, 9, 9, 0, 0, 0, 9, 9, 9, 9, 0, 0
DATA 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
DATA 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0
DATA 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0
DATA 9, 9, 0, 9, 9, 0, 9, 9, 0, 0, 0, 0, 9, 9
DATA 9, 0, 9, 0, 0, 9, 9, 0, 9, 9, 9, 0, 0, 9
DATA 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 9, 9
DATA 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0
DATA 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0
DATA 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
DATA 0, 9, 9, 9, 9, 0, 0, 0, 9, 9, 9, 9, 0, 0
DATA 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 0, 0
4 :
CLS
RESTORE bcr
FOR row = 1 TO 13
 FOR column = 1 TO 14
 READ picData
  PSET (column, row), picData
NEXT column
NEXT row
GET (0, 0)-(14, 13), bcr
GOTO 5
bcr:
DATA 0, 0, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0
DATA 0, 0, 9, 9, 9, 9, 0, 0, 0, 9, 9, 9, 9, 0
DATA 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
DATA 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0
DATA 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0
DATA 9, 9, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9
DATA 9, 0, 0, 9, 9, 9, 0, 9, 9, 0, 0, 9, 0, 9
DATA 9, 9, 0, 0, 0, 0, 9, 9, 0, 9, 9, 0, 9, 9
DATA 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0
DATA 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0
DATA 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
DATA 0, 0, 9, 9, 9, 9, 0, 0, 0, 9, 9, 9, 9, 0
DATA 0, 0, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0

5 :
CLS
RESTORE wcu
FOR row = 1 TO 14
 FOR column = 1 TO 13
 READ picData
  PSET (column, row), picData
NEXT column
NEXT row
GET (0, 0)-(13, 14), wcu
GOTO 6
wcu:
DATA  0, 0, 0, 0, 0,15,15,15, 0, 0, 0, 0, 0
DATA  0,15, 0, 0,15,15, 0,15,15, 0, 0,15, 0
DATA  0,15, 0,15,15,15,15, 0,15,15, 0,15, 0
DATA  0,15, 0,15,15,15, 0,15,15,15, 0,15, 0
DATA  0,15, 0,15,15,15, 0,15,15,15, 0,15, 0
DATA  0, 0, 0,15,15,15,15, 0,15,15, 0, 0, 0
DATA  0, 0, 0,15,15,15,15,15,15,15, 0, 0, 0
DATA  0, 0, 0,15,15,15, 0,15,15,15, 0, 0, 0
DATA 15,15, 0,15,15, 0,15, 0,15,15, 0,15,15
DATA 15,15, 0,15,15, 0,15, 0,15,15, 0,15,15
DATA 15,15, 0,15,15, 0,15, 0,15,15, 0,15,15
DATA 15,15, 0,15,15, 0, 0, 0,15,15, 0,15,15
DATA  0, 0, 0, 0,15,15, 0,15,15, 0, 0, 0, 0
DATA  0, 0, 0, 0, 0,15,15,15, 0, 0, 0, 0, 0
6 :
CLS
RESTORE wcd
FOR row = 1 TO 14
 FOR column = 1 TO 13
 READ picData
  PSET (column, row), picData
NEXT column
NEXT row
GET (0, 0)-(13, 14), wcd
GOTO 7
wcd:
DATA  0, 0, 0, 0, 0,15,15,15, 0, 0, 0, 0, 0
DATA  0, 0, 0, 0,15,15, 0,15,15, 0, 0, 0, 0
DATA 15,15, 0,15,15, 0,15, 0,15,15, 0,15,15
DATA 15,15, 0,15,15, 0,15, 0,15,15, 0,15,15
DATA 15,15, 0,15,15, 0,15, 0,15,15, 0,15,15
DATA 15,15, 0,15,15, 0, 0, 0,15,15, 0,15,15
DATA  0, 0, 0,15,15,15, 0,15,15,15, 0, 0, 0
DATA  0, 0, 0,15,15,15,15,15,15,15, 0, 0, 0
DATA  0, 0, 0,15,15,15,15, 0,15,15, 0, 0, 0
DATA  0,15, 0,15,15,15, 0,15,15,15, 0,15, 0
DATA  0,15, 0,15,15,15, 0,15,15,15, 0,15, 0
DATA  0,15, 0,15,15,15,15, 0,15,15, 0,15, 0
DATA  0,15, 0, 0,15,15, 0,15,15, 0, 0,15, 0
DATA  0, 0, 0, 0, 0,15,15,15, 0, 0, 0, 0, 0
7 :
CLS
RESTORE wcl
FOR row = 1 TO 13
 FOR column = 1 TO 14
 READ picData
  PSET (column, row), picData
NEXT column
NEXT row
GET (0, 0)-(14, 13), wcl
GOTO 8
wcl:
DATA  0, 0, 0, 0, 0, 0, 0, 0,15,15,15,15, 0, 0
DATA  0,15,15,15,15, 0, 0, 0,15,15,15,15, 0, 0
DATA  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
DATA  0, 0,15,15,15,15,15,15,15,15,15,15, 0, 0
DATA  0,15,15,15,15,15,15,15,15,15,15,15,15, 0
DATA 15,15, 0,15,15, 0,15,15, 0, 0, 0, 0,15,15
DATA 15, 0,15, 0, 0,15,15, 0,15,15,15, 0, 0,15
DATA 15,15,15,15,15,15,15,15, 0, 0, 0, 0,15,15
DATA  0,15,15,15,15,15,15,15,15,15,15,15,15, 0
DATA  0, 0,15,15,15,15,15,15,15,15,15,15, 0, 0
DATA  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
DATA  0,15,15,15,15, 0, 0, 0,15,15,15,15, 0, 0
DATA  0, 0, 0, 0, 0, 0, 0, 0,15,15,15,15, 0, 0
8 :
CLS
RESTORE wcr
FOR row = 1 TO 13
 FOR column = 1 TO 14
 READ picData
  PSET (column, row), picData
NEXT column
NEXT row
GET (0, 0)-(14, 13), wcr
GOTO 9
wcr:
DATA  0, 0,15,15,15,15, 0, 0, 0, 0, 0, 0, 0, 0
DATA  0, 0,15,15,15,15, 0, 0, 0,15,15,15,15, 0
DATA  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
DATA  0, 0,15,15,15,15,15,15,15,15,15,15, 0, 0
DATA  0,15,15,15,15,15,15,15,15,15,15,15,15, 0
DATA 15,15, 0, 0, 0, 0,15,15,15,15,15,15,15,15
DATA 15, 0, 0,15,15,15, 0,15,15, 0, 0,15, 0,15
DATA 15,15, 0, 0, 0, 0,15,15, 0,15,15, 0,15,15
DATA  0,15,15,15,15,15,15,15,15,15,15,15,15, 0
DATA  0, 0,15,15,15,15,15,15,15,15,15,15, 0, 0
DATA  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
DATA  0, 0,15,15,15,15, 0, 0, 0,15,15,15,15, 0
DATA  0, 0,15,15,15,15, 0, 0, 0, 0, 0, 0, 0, 0
9 :
CLS
RETURN
