REM Saturday 5.4.97 BREAKWAY SCREEN 13 LOCATE 19, 1: COLOR 1: PRINT "B" FOR Q = 1 TO 50000: NEXT LOCATE 17, 2: COLOR 8: PRINT "R" FOR Q = 1 TO 46000: NEXT LOCATE 15, 3: COLOR 4: PRINT "E" FOR Q = 1 TO 42000: NEXT LOCATE 13, 5: COLOR 6: PRINT "A" FOR Q = 1 TO 38000: NEXT LOCATE 11, 7: COLOR 5: PRINT "K" FOR Q = 1 TO 34000: NEXT LOCATE 9, 10: COLOR 9: PRINT "I" FOR Q = 1 TO 30000: NEXT LOCATE 7, 14: COLOR 2: PRINT "N" FOR Q = 1 TO 26000: NEXT LOCATE 6, 18: COLOR 3: PRINT "G" FOR Q = 1 TO 22000: NEXT LOCATE 6, 23: COLOR 7: PRINT "A" FOR Q = 1 TO 18000: NEXT LOCATE 6, 27: COLOR 12: PRINT "W" FOR Q = 1 TO 14000: NEXT LOCATE 6, 31: COLOR 10: PRINT "A" FOR Q = 1 TO 10000: NEXT LOCATE 6, 35: COLOR 14: PRINT "Y"; COLOR 13 FOR Q = 1 TO 9000: NEXT PRINT "."; FOR Q = 1 TO 8000: NEXT PRINT "."; FOR Q = 1 TO 7000: NEXT PRINT "."; FOR Q = 1 TO 6000: NEXT PRINT "."; FOR Q = 1 TO 5000: NEXT PRINT "."; SLEEP 1: COLOR 15 LOCATE 12, 18: PRINT "John Harrington's" LOCATE , 18: PRINT "bicycle race game" LOCATE , 18: PRINT " computerised by" LOCATE , 18: PRINT " George Crawshay" SLEEP 3 SCREEN 12 WIDTH 80, 60 PALETTE GOSUB Colours DIM content(102, 15), numbikes(102), racepos(24), sx(102), sy(102) DIM breakaway(64), nexspr(64), dx(102), dy(102), dir(102), inout(102) DATA 10,8,6,5,4,3,2,1,10,8,6,5,4,3,2,1,20,16,12,10,8,6,4,2 DATA Blue,B,Red,R,Green,G,Yellow,Y,Purple,P,Orange,O DATA WINNER,SECOND,THIRD,FOURTH,FIFTH,SIXTH,SEVENTH,EIGHTH FOR spr = 1 TO 3 FOR place = 1 TO 8 READ score(spr, place) NEXT place, spr FOR Q = 1 TO 6: READ col$(Q), colin$(Q): NEXT FOR Q = 1 TO 8: READ plawor$(Q): NEXT limit(1) = 30: limit(2) = 25: limit(3) = 20: limit(4) = 16 limit$(1) = "30": limit$(2) = "25": limit$(3) = "20": limit$(4) = "16" FOR Q = 1 TO 64: nexspr(Q) = 34: NEXT sprsq(1) = 34: sprsq(2) = 74: sprsq(3) = 101 RANDOMIZE (-80) Board: x = 118: y = 38 LINE (x, y)-(x + 384, y + 384), 7, B FOR xx = 1 TO 10 STEP 9 LINE (x + 16 + xx * 32, y)-(x + 16 + xx * 32, y + 384), 7 NEXT FOR yy = 1 TO 10 STEP 9 LINE (x, y + 16 + yy * 32)-(x + 384, y + 16 + yy * 32), 7 NEXT FOR xx = 2 TO 9 LINE (x + 16 + xx * 32, y)-(x + 16 + xx * 32, y + 48), 7 LINE (x + 16 + xx * 32, y + 336)-(x + 16 + xx * 32, y + 384), 7 NEXT xx FOR yy = 2 TO 9 LINE (x, y + 16 + yy * 32)-(x + 48, y + 16 + yy * 32), 7 LINE (x + 336, y + 16 + yy * 32)-(x + 384, y + 16 + yy * 32), 7 NEXT yy FOR Q = 18 TO 54 STEP 4 n = INT(Q / 4 - 4): n$ = STR$(n) LOCATE 48, Q: IF Q = 18 THEN LOCATE 48, 16 COLOR 10: PRINT RIGHT$(n$, 1) NEXT FOR Q = 48 TO 12 STEP -4 n = 22 - (INT(Q / 4)): n$ = STR$(n) LOCATE Q, 58: PRINT RIGHT$(n$, 2) NEXT FOR Q = 22 TO 58 STEP 4 n = 34 - INT(Q / 4): n$ = STR$(n) LOCATE 6, Q: PRINT RIGHT$(n$, 2) NEXT FOR Q = 8 TO 44 STEP 4 n = 28 + (INT(Q / 4)): n$ = STR$(n) LOCATE Q, 16: IF Q = 8 THEN LOCATE 6, 16 PRINT RIGHT$(n$, 2) NEXT LOCATE 50, 10: COLOR 10: PRINT "START" LOCATE 6, 65: PRINT "FINISH" LOCATE 23, 9: PRINT "SPRINT" LOCATE 14, 25: COLOR 7: PRINT "Do you want a special" LOCATE , 25: INPUT "random seed (Y/N)"; rs$ IF UCASE$(rs$) = "Y" THEN 45 LOCATE 17, 25: PRINT "Enter a number" LOCATE , 25: INPUT "from 1 to 10000"; rs IF rs < 1 OR rs > 10000 GOTO 45 rs = -rs: LOCATE , 25: PRINT "OK, the seed is "; rs RANDOMIZE (rs) ELSE RANDOMIZE TIMER END IF LOCATE 21, 25: COLOR 7: INPUT "How many teams"; np PRINT : LOCATE , 25: PRINT "Which colour do you want,": PRINT 50 LOCATE , 25 FOR Q = 1 TO np COLOR Q: PRINT " "; colin$(Q); " "; NEXT: COLOR 7: INPUT c$: c$ = UCASE$(c$) FOR Q = 1 TO np IF c$ = colin$(Q) THEN humno = Q: GOTO 55 NEXT: GOTO 50 55 PRINT : LOCATE , 25: PRINT "OK, you're Captain of" PRINT : LOCATE , 30: PRINT "the "; : COLOR humno PRINT col$(humno); : COLOR 7: PRINT " team ( No."; PRINT humno; ")" PRINT : LOCATE , 25: PRINT "Random selection for your" LOCATE , 25: INPUT "initial move set-up (Y/N)"; a$ IF UCASE$(a$) = "Y" THEN moverand = 1 Bikestapix: REM start positions for bike graphics FOR Q = 1 TO 9 sx(Q) = x + (Q + 1) * 32: sy(Q) = 384 dx(Q) = sx(Q) - 3: dir(Q) = -1: inout(Q) = 1 NEXT FOR Q = 40 TO 49 sx(Q) = x + (Q - 40) * 32 + 32: sy(Q) = 384 dx(Q) = sx(Q) - 3: dir(Q) = -1: inout(Q) = 1 NEXT FOR Q = 80 TO 89 sx(Q) = x + (Q - 80) * 32 + 32: sy(Q) = 384 dx(Q) = sx(Q) - 3: dir(Q) = -1: inout(Q) = 1 NEXT FOR Q = 10 TO 19 sx(Q) = 460: sy(Q) = 386 - (Q - 10) * 32 dy(Q) = sy(Q) + 11: dir(Q) = 1: inout(Q) = 1 NEXT Q FOR Q = 50 TO 59 sx(Q) = 460: sy(Q) = 386 - (Q - 50) * 32 dy(Q) = sy(Q) + 11: dir(Q) = 1: inout(Q) = 1 NEXT Q FOR Q = 90 TO 100 sx(Q) = 460: sy(Q) = 386 - (Q - 90) * 32 dy(Q) = sy(Q) + 11: dir(Q) = 1: inout(Q) = 1 NEXT Q FOR Q = 20 TO 29 sx(Q) = 466 - (Q - 20) * 32: sy(Q) = 82 dx(Q) = sx(Q) + 11: dir(Q) = 1: inout(Q) = -1 NEXT FOR Q = 60 TO 69 sx(Q) = 466 - (Q - 60) * 32: sy(Q) = 82 dx(Q) = sx(Q) + 11: dir(Q) = 1: inout(Q) = -1 NEXT FOR Q = 30 TO 39 sx(Q) = 160: sy(Q) = 71 + (Q - 30) * 32 dy(Q) = sy(Q) - 3: dir(Q) = -1: inout(Q) = -1 NEXT Q FOR Q = 70 TO 79 sx(Q) = 160: sy(Q) = 71 + (Q - 70) * 32: inout(Q) = -1 dy(Q) = sy(Q) - 3: dir(Q) = -1 NEXT Q IF moverand = 1 GOTO Movefactors Hummovfax: GOSUB Wipe: COLOR humno: LOCATE 20, 25 PRINT "Choose your movement factors": PRINT LOCATE , 25: PRINT "First, will your No.1 bike" 60 LOCATE 23, 25: INPUT "have 3 or 4 factors"; nm IF nm < 3 OR nm > 4 GOTO 60 nm(humno, 1) = nm: FOR Q = 2 TO 4: nm(humno, Q) = 3: NEXT PRINT : LOCATE , 25: PRINT "Now choose the starting" LOCATE , 25: PRINT "factors for each bike" FOR bike = 1 TO 4 totn = 0: nm = nm(humno, bike): PRINT LOCATE , 25: culi = CSRLIN: PRINT "No."; bike; "("; limit$(bike); ")"; 65 FOR move = 1 TO nm - 1 70 LOCATE culi, 32 + move * 5: INPUT m(move) IF m(move) > 15 GOTO 70 totn = totn + m(move) IF totn >= limit(bike) THEN LOCATE culi + 1, 35: COLOR 7: PRINT "too much": SLEEP 2: totn = 0 LOCATE culi, 35: PRINT SPC(20); : COLOR humno LOCATE culi + 1, 35: PRINT SPC(15); : GOTO 65 END IF NEXT move m(nm) = limit(bike) - totn IF m(nm) > 15 THEN LOCATE culi + 1, 35: COLOR 7: PRINT "too little": SLEEP 2: totn = 0 LOCATE culi, 35: PRINT SPC(20); : COLOR humno LOCATE culi + 1, 35: PRINT SPC(15); : GOTO 65 END IF LOCATE culi, 32 + nm * 5: PRINT m(nm) FOR move = 1 TO nm movfac(humno, bike, move) = m(move) NEXT move NEXT bike: PRINT LOCATE , 25: INPUT "Happy with this (Y/N)"; a$ IF UCASE$(a$) = "N" THEN GOSUB Wipe: GOTO Hummovfax Movefactors: FOR team = 1 TO np: IF team = humno AND moverand = 0 GOTO Nxteam FOR bike = 1 TO 4 totn = 0: nm(team, bike) = 3 IF bike = 1 THEN nm(team, bike) = 3 + INT(RND * 2): REM Bike 1, 3 or 4 moves END IF Rand: nm = nm(team, bike) FOR posmove = 1 TO nm - 1 n = INT(RND * 15 + 1): totn = totn + n IF totn >= limit(bike) THEN totn = 0: GOTO Rand: REM if total over limit m(posmove) = n NEXT posmove m(nm) = limit(bike) - totn: REM last selection is what's left IF m(nm) > 15 THEN totn = 0: GOTO Rand: REM if last selection is too big FOR move = 1 TO nm movfac(team, bike, move) = m(move) REM PRINT "Team"; team; "Bike no."; bike; "-"; m(move) NEXT move NEXT bike Nxteam: NEXT team GOSUB Orderfactor COLOR humno: LOCATE 54, 30: PRINT "YOUR MOVEMENT FACTORS" LOCATE , 20: PRINT "Bike 1 Bike 2 Bike 3 Bike 4" GOSUB Facdisplay turn = 1 Start: starter = INT(RND * np) + 1: PRINT : LOCATE 38, 25: COLOR 7 PRINT "The "; : COLOR starter: PRINT col$(starter); COLOR 7: PRINT " team starts" IF starter = humno THEN LOCATE , 30: PRINT " - that's you!" SLEEP 3: GOSUB Wipe 75 LOCATE 14, 25: COLOR humno: INPUT "Choose your 1st move"; move FOR Q = 1 TO nm(humno, 1) IF move = movfac(humno, 1, Q) THEN movfac(humno, 1, Q) = 0: GOTO 80 NEXT Q GOTO 75 END IF 76 SLEEP 3: GOSUB Wipe REM First move of starter IF nm(starter, 1) = 3 THEN move = movfac(starter, 1, 2): movfac(starter, 1, 2) = 0 ELSE n = INT(RND * 2 + 2): move = movfac(starter, 1, n) movfac(starter, 1, n) = 0 END IF LOCATE 13, 30: COLOR starter: PRINT col$(starter); " 1 moves"; move 80 numbikes(move) = 1: content(move, 1) = starter * 10 + 1 bikepos(starter, 1) = move dir = dir(bikepos): sx = sx(move): sy = sy(move) dx = dx(move): dy = dy(move): col = starter: bikeno = 1 IF move < 10 THEN GOSUB Horbike ELSE GOSUB Verbike REM First move of other bikes FOR bike = 1 TO 4 FOR jj = starter TO starter + np - 1 IF bike = 1 AND jj = starter GOTO Nxjj IF jj > np THEN team = jj - np ELSE team = jj bikepos = 0: nm = nm(team, bike): COLOR team IF team = humno THEN culi = CSRLIN 85 LOCATE culi, 25: PRINT "Choose move for bike"; bike; : INPUT move FOR Q = 1 TO nm(humno, bike) IF move = movfac(humno, bike, Q) THEN movfac(humno, bike, Q) = 0: GOTO 90 NEXT Q culi = CSRLIN - 1: GOTO 85 END IF Jump1: GOSUB Moveval move = movfac(team, bike, bestno): movfac(team, bike, bestno) = 0 LOCATE , 30: PRINT col$(team); bike; "moves"; move 90 numbikes(move) = numbikes(move) + 1 n = 1 DO UNTIL content(move, n) = 0 n = n + 1 LOOP content(move, n) = team * 10 + bike bikepos(team, bike) = move col = team: bikeno = bike: dir = dir(move) IF move < 10 THEN sx = sx(move): dx = dx(move) sy = sy(move) + (numbikes(move) - 1) * 4 * inout(move): GOSUB Horbike ELSE sx = sx(move) + (numbikes(move) - 1) * 4 * inout(move) sy = sy(move): dy = dy(move): GOSUB Verbike END IF GOSUB Pause Nxjj: NEXT jj NEXT bike LOCATE 46, 35: COLOR 7: PRINT "Next turn coming up": SLEEP 2 GOSUB Replacemove Nextmove: turn = turn + 1: GOSUB Wipe LOCATE 12, 30 FOR position = 1 TO 4 * np - finishers - dropouts IF finishers = 8 GOTO Raceend rpcont = racepos(position): REM compressed value of bike in position team = INT(rpcont / 10): bike = rpcont MOD 10: REM decompress bikepos = bikepos(team, bike): REM establishes square no. IF raceover(team, bike) = 1 GOTO Nxpos FOR Q = 1 TO 10 IF content(bikepos, Q) = rpcont THEN contno = Q NEXT Q: REM establishes contents position within old square nm = nm(team, bike): COLOR team IF team = humno THEN nexspr = nexspr(rpcont): sprno = INT(nexspr / 30): culi = CSRLIN 95 LOCATE culi, 25: PRINT "Choose move for bike"; bike; : INPUT move FOR Q = 1 TO nm(humno, bike) IF move = movfac(humno, bike, Q) THEN movfac(humno, bike, Q) = 0: GOTO 100 NEXT Q culi = CSRLIN - 1: GOTO 95 END IF Jump2: GOSUB Moveval nexspr = nexspr(rpcont) move = movfac(team, bike, bestno): movfac(team, bike, bestno) = 0 LOCATE , 30: PRINT col$(team); " "; bike; " moves"; move REM "sf"; straggle(team, bike) 100 newpos = bikepos + move: REM establish new square IF newpos > 101 THEN newpos = 101 IF newpos >= lastsq + 40 THEN GOSUB Lapping REM reduce bike nos. by 1 and erase bike from old square contents: col = 0: col2 = 0: bikeno = bike bp = INT(bikepos / 10): dir = dir(bikepos): inout = inout(bikepos) IF bp / 2 = INT(bp / 2) AND bp < 10 THEN sx = sx(bikepos): dx = dx(bikepos) sy = sy(bikepos) + (contno - 1) * 4 * inout IF lapped(team, bike) = 1 THEN sy = sy + inout * 20 GOSUB Horbike ELSE sx = sx(bikepos) + (contno - 1) * 4 * inout sy = sy(bikepos): dy = dy(bikepos) IF lapped(team, bike) = 1 THEN sx = sx + inout * 20 GOSUB Verbike END IF REM check for sprint score IF sprno > 0 AND nexspr > bikepos AND nexspr <= newpos THEN GOSUB Sprint numbikes(bikepos) = numbikes(bikepos) - 1 content(bikepos, contno) = 0 IF newpos = 101 THEN GOSUB Pastpost: GOSUB Pause: GOTO Nxpos REM increase bike nos. by 1 and insert bike into new square contents: numbikes(newpos) = numbikes(newpos) + 1 n = 1 DO UNTIL (content(newpos, n) = 0) n = n + 1 LOOP content(newpos, n) = team * 10 + bike bikepos(team, bike) = newpos: REM record new bikepos IF newpos > firstsq - 40 THEN lapped(team, bike) = 0 col = team: col2 = 7: bikeno = bike nep = INT(newpos / 10): dir = dir(newpos): inout = inout(newpos) IF nep / 2 = INT(nep / 2) AND nep < 10 THEN sx = sx(newpos): dx = dx(newpos) sy = sy(newpos) + (numbikes(newpos) - 1) * 4 * inout IF lapped(team, bike) = 1 THEN sy = sy + inout * 20 GOSUB Horbike ELSE sx = sx(newpos) + (numbikes(newpos) - 1) * 4 * inout sy = sy(newpos): dy = dy(newpos) IF lapped(team, bike) = 1 THEN sx = sx + inout * 20 GOSUB Verbike END IF GOSUB Firstlast GOSUB Pause Nxpos: NEXT position LOCATE 46, 35: COLOR 7: PRINT "Next turn coming up": SLEEP 2 GOSUB Replacemove GOTO Nextmove Raceend: GOSUB Wipe FOR team = 1 TO np FOR bike = 1 TO 4 totpoints(team) = totpoints(team) + points(team, bike) NEXT bike, team LOCATE 14, 32: COLOR 9: PRINT "THE RACE IS OVER" LOCATE 17, 27: COLOR 7: PRINT "Sprint 1 Sprint 2 Finish" LOCATE , 27: PRINT "-------- -------- ------": PRINT FOR p = 1 TO 8 LOCATE , 23: COLOR 7: PRINT p; FOR s = 1 TO 3 tebi = sprintpos(s, p) team = INT(tebi / 10): bike = tebi MOD 10 LOCATE , 18 + s * 10: COLOR team: PRINT team; bike; NEXT s: PRINT NEXT p: PRINT : PRINT : PRINT : PRINT LOCATE , 34: COLOR 9: PRINT "TOTAL POINTS" LOCATE , 34: PRINT "------------": PRINT LOCATE , 23: COLOR 7: PRINT "Bike"; : spa = 9 - np LOCATE , 32 FOR team = 1 TO np COLOR team: PRINT RIGHT$(STR$(team), 1); SPC(spa); NEXT: PRINT : COLOR 7: LOCATE , 23: PRINT "----"; LOCATE , 31 FOR team = 1 TO np: COLOR team: PRINT "---"; SPC(spa - 2); : NEXT: PRINT : PRINT FOR bike = 1 TO 4 LOCATE , 24: COLOR 7: PRINT bike; FOR team = 1 TO np LOCATE , 31 + (team - 1) * (spa + 1): COLOR team ptb = points(team, bike): PRINT RIGHT$(STR$(ptb), 2); NEXT team: PRINT NEXT bike LOCATE , 30 FOR team = 1 TO np: COLOR team: PRINT "----"; SPC(spa - 3); : NEXT: PRINT hupo = 1 FOR team = 1 TO np LOCATE , 31 + (team - 1) * (spa + 1): COLOR team tts = totpoints(team): PRINT RIGHT$(STR$(tts), 2); IF team <> humno AND totpoints(team) > totpoints(humno) THEN hupo = hupo + 1 NEXT team: PRINT LOCATE , 30 FOR team = 1 TO np: COLOR team: PRINT "----"; SPC(spa - 3); : NEXT: PRINT tts = totpoints(humno): evalsco = tts * 100 * np / 156 / hupo LOCATE 3, 13: COLOR humno SELECT CASE evalsco CASE IS > 160 PRINT "Well done - on this form it's the Tour de France next!" CASE IS > 99 AND evalsco < 161 PRINT " Well done, a good performance" CASE IS > 61 AND evalsco < 100 PRINT " Hard luck - you nearly made it" CASE IS > 44 AND evalsco < 61 PRINT " Not bad at all, just a little more effort needed" CASE IS > 32 AND evalsco < 45 PRINT " Quite a decent score, but others were better" CASE IS > 25 AND evalsco < 33 PRINT " Hmmm - obviously some more practice needed" CASE IS > 18 AND evalsco < 26 PRINT " You won't get very far on this form, I fear" CASE IS > 9 AND evalsco < 19 PRINT " Perhaps the less said about this the better!" CASE ELSE PRINT " Oh dear, oh dear, oh dear - what CAN I say?" END SELECT END Pause: a$ = INKEY$ WHILE a$ = "" GOTO Pause WEND RETURN Wipe: FOR Q = 12 TO 46: LOCATE Q, 23: PRINT SPC(34); : NEXT RETURN Facdisplay: COLOR humno IF nm(humno, 1) = 3 THEN FOR fac = 1 TO 3 LOCATE 57, 16 + 3 * fac: PRINT RIGHT$(STR$(movfac(humno, 1, fac)), 2); NEXT ELSE FOR fac = 1 TO 4 LOCATE 57, 14 + 3 * fac: PRINT RIGHT$(STR$(movfac(humno, 1, fac)), 2); NEXT END IF FOR bike = 2 TO 4 FOR fac = 1 TO 3 LOCATE 57, 5 + 11 * bike + 3 * fac PRINT RIGHT$(STR$(movfac(humno, bike, fac)), 2); NEXT fac, bike: PRINT RETURN Firstlast: REM establish first & last squares sq = 100 DO UNTIL (numbikes(sq) > 0) sq = sq - 1 LOOP firstsq = sq: IF firstsq > 30 THEN culi = CSRLIN: GOSUB Changenos: LOCATE culi, 25 IF firstsq > 100 THEN firstsq = 100 sq = 1 DO UNTIL (numbikes(sq) > 0) sq = sq + 1 LOOP lastsq = sq RETURN Replacemove: p = 0 FOR sq = 100 TO 1 STEP -1 IF numbikes(sq) = 0 GOTO Nxsq n = numbikes(sq) FOR occ = 1 TO n cont = content(sq, occ): p = p + 1: racepos(p) = cont breakaway(cont) = 0 IF p = 1 THEN newlead = cont: IF turn > 1 AND newlead <> oldlead THEN breakaway(cont) = 1 team = INT(cont / 10): bike = cont MOD 10 REM work out new movfac j = sq: count = 0 IF breakaway(cont) = 1 THEN nn = 0 DO UNTIL (nn > 0) OR (j = 0) j = j - 1: nn = numbikes(j): count = count + 1 LOOP movfac = count ELSE nn = 1 DO UNTIL (nn = 0) j = j + 1: nn = numbikes(j): count = count + nn LOOP movfac = count + 3 END IF REM put new movfac into vacant slot FOR slot = 1 TO nm(team, bike) IF movfac(team, bike, slot) = 0 THEN movfac(team, bike, slot) = movfac NEXT slot IF turn < 3 GOTO Nxocc REM check for straggle factor IF p > (np - 1) * 4 THEN straggle(team, bike) = straggle(team, bike) + 1 ELSE straggle(team, bike) = 0 END IF Nxocc: NEXT occ Nxsq: NEXT sq: GOSUB Orderfactor: GOSUB Facdisplay oldlead = newlead RETURN Orderfactor: REM puts bikes' move factors into magnitude order LOCATE 1, 65 FOR team = 1 TO np FOR bike = 1 TO 4 nm = nm(team, bike) FOR Q = 1 TO nm FOR j = Q TO nm IF movfac(team, bike, j) > movfac(team, bike, Q) THEN x = movfac(team, bike, j) movfac(team, bike, j) = movfac(team, bike, Q) movfac(team, bike, Q) = x END IF NEXT j NEXT Q NEXT bike NEXT team REM FOR q = 1 TO 52: LOCATE q, 1: PRINT SPC(12); : NEXT: LOCATE 1, 65 REM FOR team = 1 TO np: FOR bike = 1 TO 4: FOR move = 1 TO nm(team, bike) REM LOCATE , 1: PRINT team; bike; movfac(team, bike, move) REM NEXT: NEXT: NEXT: IF turn > 10 THEN GOSUB Pause RETURN Moveval: REM evaluates possible moves of a bike bestno = 0: max = 0: sprno = 0: totmoves = 0 REM test for reaching Finish FOR moveno = nm TO 1 STEP -1 totmoves = totmoves + movfac(team, bike, moveno) NEXT moveno IF bikepos + totmoves >= 101 THEN bestno = 1 IF bikepos > 73 THEN nexspr(rpcont) = 101: sprno = 3 ELSE sprno = 2 RETURN END IF FOR moveno = nm TO 1 STEP -1 bkwy = 1: posmove = bikepos + movfac(team, bike, moveno) REM test for breakaway IF turn = 1 OR racepos(1) = team * 10 + bike THEN bkwy = 0: GOTO Evalcount REM No break on 1st turn and Leader can't break away FOR j = posmove TO posmove + 30 IF j > 100 THEN EXIT FOR IF numbikes(j) > 0 THEN bkwy = 0: EXIT FOR: REM if bikes ahead, no break NEXT j Evalcount: j = posmove: count = 0 IF bkwy = 1 THEN n = 0 DO UNTIL (n > 0) OR (j = 0) j = j - 1: n = numbikes(j): count = count + 1 LOOP count = (count - 6) * position * 2 / np ELSE n = 1 DO UNTIL (n = 0) j = j + 1: n = numbikes(j): count = count + n LOOP END IF nexspr = nexspr(rpcont) IF posmove < nexspr GOTO 105: REM can't reach next sprint sprno = INT(nexspr / 30): REM establishes which sprint IF linepass(sprno) = 8 GOTO 105 score = score(sprno, linepass(sprno) + 1) count = count + score 105 value(moveno) = count IF count > max THEN bestno = moveno: max = count NEXT moveno IF bestno > 0 THEN RETURN REM bestno=0, therefore change choice if straggler IF straggle(team, bike) < 3 OR turn < 3 THEN bestno = nm ELSE r = INT(RND(2) + 1): bestno = r END IF REM PRINT " Max ="; max; "bestno ="; bestno RETURN Sprint: IF linepass(sprno) = 8 THEN nexspr(rpcont) = sprsq(sprno + 1): RETURN score = score(sprno, linepass(sprno) + 1) linepass(sprno) = linepass(sprno) + 1 points(team, bike) = points(team, bike) + score sprintpos(sprno, linepass(sprno)) = rpcont IF nexspr = 101 THEN raceover(team, bike) = 1: finishers = finishers + 1 nexspr(rpcont) = sprsq(sprno + 1) LOCATE , 35: COLOR team: PRINT "scores"; score RETURN Lapping: REM when bikes are lapped lapsq = newpos - 40: IF lapsq > 60 THEN lapsq = 60 FOR sq = lapsq TO lapsq - move STEP -1 IF sq < 1 GOTO Nxsq2 culi = CSRLIN: nb = numbikes(sq): IF nb = 0 GOTO Nxsq2 FOR Q = 1 TO nb contret = content(sq, Q) teamret = INT(contret / 10): bikeret = contret MOD 10 IF lapped(teamret, bikeret) = 0 THEN LOCATE culi, 34: COLOR teamret: PRINT teamret; bikeret; PRINT "lapped" SLEEP 1 lapped(teamret, bikeret) = 1 bikeno = bikeret: bp = INT(sq / 10): dir = dir(sq): inout = inout(sq) IF bp / 2 = INT(bp / 2) THEN col = 0: sx = sx(sq): dx = dx(sq) sy = sy(sq) + (Q - 1) * 4 * inout: GOSUB Horbike col = teamret: col2 = 7: sy = sy + inout * 20 lapfg = 1: GOSUB Horbike: lapfg = 0 ELSE col = 0: sx = sx(sq) + (Q - 1) * 4 * inout sy = sy(sq): dy = dy(sq): GOSUB Verbike col = teamret: col2 = 7: sx = sx + inout * 20 lapfg = 1: GOSUB Verbike: lapfg = 0 END IF END IF NEXT Q Nxsq2: NEXT sq culi = CSRLIN: GOSUB Changenos: LOCATE culi, 25 RETURN Pastpost: sx = 600: sy = 76 + finishers * 32: dx = sx: dy = sy + 11: dir = 1 culi = CSRLIN LOCATE finishers * 4 + 11, 68: COLOR 7: PRINT plawor$(finishers) LOCATE culi, 1 col = team: bikeno = bike Verbike: LINE (sx + 1, sy)-(sx + 1, sy + 8), col FOR y = 2 TO 5 STEP 3 LINE (sx, sy + y)-(sx + 2, sy + y + 1), col, B NEXT: GOSUB Verno RETURN Horbike: LINE (sx, sy + 1)-(sx + 8, sy + 1), col FOR x = 2 TO 5 STEP 3 LINE (sx + x, sy)-(sx + x + 1, sy + 2), col, B NEXT: GOSUB Horno RETURN Verno: LINE (sx + 1, dy)-(sx + 1, dy - dir * 1 + dir * bikeno), col IF lapped(team, bike) = 1 OR lapfg = 1 THEN LINE (sx + 1, dy + dir * 5)-(sx + 1, dy + dir * 7), col2 END IF RETURN Horno: LINE (dx, sy + 1)-(dx - dir * 1 + dir * bikeno, sy + 1), col IF lapped(team, bike) = 1 OR lapfg = 1 THEN LINE (dx + dir * 5, sy + 1)-(dx + dir * 7, sy + 1), col2 END IF RETURN Changenos: FOR Q = 18 TO 58 STEP 4: REM 40 - 50 n = INT(Q / 4 + 36): n$ = STR$(n): oldn$ = STR$(n - 40) LOCATE 48, Q: IF Q = 18 THEN LOCATE 48, 16 COLOR 10: IF numbikes(n - 40) = 0 OR numbikes(n) > 0 THEN PRINT RIGHT$(n$, 2) IF numbikes(n - 40) > 0 AND numbikes(n) = 0 THEN PRINT RIGHT$(oldn$, 2) NEXT IF firstsq < 41 THEN RETURN FOR Q = 44 TO 8 STEP -4: REM 51 - 60 n = 62 - (INT(Q / 4)): n$ = STR$(n): oldn$ = STR$(n - 40) LOCATE Q, 58: IF Q = 8 THEN LOCATE 6, 58 IF numbikes(n - 40) = 0 OR numbikes(n) > 0 THEN PRINT RIGHT$(n$, 2); " " IF numbikes(n - 40) > 0 AND numbikes(n) = 0 THEN PRINT RIGHT$(oldn$, 2) NEXT IF firstsq < 51 THEN RETURN FOR Q = 18 TO 54 STEP 4: REM 61 - 70 n = 74 - INT(Q / 4): n$ = STR$(n): oldn$ = STR$(n - 40) LOCATE 6, Q: IF Q = 18 THEN LOCATE 6, 16 IF numbikes(n - 40) = 0 OR numbikes(n) > 0 THEN PRINT RIGHT$(n$, 2) IF numbikes(n - 40) > 0 AND numbikes(n) = 0 THEN PRINT RIGHT$(oldn$, 2) NEXT IF firstsq < 61 THEN RETURN FOR Q = 12 TO 48 STEP 4: REM 71 - 80 n = 68 + (INT(Q / 4)): n$ = STR$(n): oldn$ = STR$(n - 40) LOCATE Q, 16: IF numbikes(n - 40) = 0 OR numbikes(n) > 0 THEN PRINT RIGHT$(n$, 2) IF numbikes(n - 40) > 0 AND numbikes(n) = 0 THEN PRINT RIGHT$(oldn$, 2) NEXT IF firstsq < 71 THEN RETURN FOR Q = 22 TO 58 STEP 4: REM 81 - 90 n = INT(Q / 4 + 76): n$ = STR$(n): oldn$ = STR$(n - 40) LOCATE 48, Q: COLOR 10 IF numbikes(n - 40) = 0 OR numbikes(n) > 0 THEN PRINT RIGHT$(n$, 2) IF numbikes(n - 40) > 0 AND numbikes(n) = 0 THEN PRINT RIGHT$(oldn$, 2) NEXT IF firstsq < 81 THEN RETURN FOR Q = 44 TO 8 STEP -4: REM 91 - 100 n = 102 - (INT(Q / 4)): n$ = STR$(n): oldn$ = STR$(n - 40) LOCATE Q, 58 IF numbikes(n - 40) = 0 OR numbikes(n) > 0 THEN IF Q > 8 THEN PRINT RIGHT$(n$, 2) ELSE LOCATE 6, 58: PRINT "100" END IF IF numbikes(n - 40) > 0 AND numbikes(n) = 0 THEN IF Q > 8 THEN LOCATE Q, 58 ELSE LOCATE 6, 58 PRINT RIGHT$(oldn$, 2) END IF NEXT RETURN Colours: REM PALETTE 0, 1842204: REM grey PALETTE 1, 3747352: REM blue PALETTE 2, 1115455: REM red PALETTE 3, 1652496: REM green PALETTE 4, 80191: REM yellow PALETTE 5, 3408437: REM purple PALETTE 6, 1382970: REM orange PALETTE 7, 4144959: REM white PALETTE 8, 3619333: REM cyan PALETTE 9, 2697513: REM light grey PALETTE 10, 2500134: REM grey PALETTE 11, 656911: REM crimson PALETTE 12, 659206: REM dark green PALETTE 13, 2958137: REM pink PALETTE 14, 1385522: REM brown PALETTE 15, 2042152: REM beige RETURN REM Movement factors: movfac(1,1,1)-(6,4,4) REM Track contents (number of bikes): numbikes(1)-(100) REM Track contents (detail of bikes): content(1,10)-(100,10) = 11 to 64 REM (or content$ - possibly A1 to F4?) REM Bike track position (square): bikepos(1,1)-(6,4) = 1 to 100 REM Race position of individual bikes (order): racepos(1)-(24) = 11 to 64 REM Sprint & Final positions of bikes: sprintpos(1,1)-(3,8) = 11 to 64 REM Sprint & Final scores: score(1,1)-(3,8) REM Sprint positions filled: linepass(1)-(3) = 1 to 8 REM Next sprint for each bike: nexspr(11)-(64)=34, 74 or 100 REM Individual bike scores: points(1,1)-(6,4) = 0 to 40 REM Bikes out of race: raceover(team,bike) = 1 (Is this necessary?) REM Bikes lapped: lapped(team,bike)=1 REM signal to S/R's Verno & Horno that bike's just been lapped: lapfg=1 REM Create opening title etc.