petit train pour Sharp PC1500 ( pas de programme ) tiré du magazine Hebdogiciel N°34 http://www.hebdogiciel.fr Bon Jeu ! Ouessan / Chistian DUBROEUCQ Nécessite l'extension PETOOLS. Le Far-West vous fait rêver? Vous aimeriez partir à la conquête de l'ouest à bord d'un petit train à vapeur? Eh bien, rien n'est impossible, surtout si vous possédez un Sharp pc1500. Prenez donc les commandes de votre machine;je suis sûr que vous deviendrez bien vite un des plus grands pionniers de notre temps! Avant tout, il vous faudra charger le programme ( ce qui constitue déjà une prouesse ! ). Je vous conseille de le faire soigneusement en respectant particulièrement les espaces dans les PRINT ( car ce sont eux qui sont à la base des effets graphiques ) et surtout, lisez attentivement les consignes ci-dessous avant le chargement : - faire tout d'abord, en mode PRO, la séquence de touches : NEW &38D5. Elle a pour but de réserver un espace mémoire déstiné à la routine d'inversion vidéo en langage machine. Je précise que, vu la longueur du programme, vous devez obligatoirement posséder un module d'extension mémoire de 8Ko ( CE155 ). Avec un autre module, le programme risquerait de ne pas tourner. - rentrer ensuite le programme ligne par ligne en respectant particulièrement la structure de la ligne 1060 : en effet, à la fin du jeu, votre meilleur score sera automatiquement programmé dans le premier PRINT de cette ligne. Une sous-routine Basci se charge de la recherche de l'adresse où le score devra être programmé. Si la ligne 1060 est inexistante, la machine ne pourra programmer votre score et vous avertira par le message "erreur, pas de ligne 1060!". Si, par contre, vous oubliez de mettre le signe = dans cette ligne, la machine affichera "erreur contenu ligne 1060!". Je vous signale enfin qu'après ce fameux = il doit y avoir exactement 5 espaces qu'il est primordial de conserver si vous ne voulez pas que votre programme soit détruit. - vous pouvez maintenant sauver votre programme sur cassette par un classique CSAVE. Par contre, n'oubliez jamais de faire NEW &38D5 avant chaque rechargement du programme, faute de quoi vous risqueriez d'avoir quelques surprises! Vous avez bien fait attention à tout cela? Eh bien, vous pouvez jouer maintenant ! Le principe du jeu est très simple : faire un maximum de kilomètres aux commandes de votre petit train à vapeur avec au départ 100kg de charbon et 5000$ en poche. Bien entendu, il faudra de temps en temps alimenter la chaudière de votre locomotive en appuyant sur la touche SPACE chaque fois que la machine vous demandera du charbon. Mais soyez vigilant, si vous ne lui en donnez pas au bout de 6 demandes, vous tomberez en panne sèche et le jeu s'arrêtera. Pour pouvoir acheter du charbon ( car les réserves s'épuisent vite, à raison de 10kg par pelleté ), la machine passe aléatoirement par des villages en faisant une pause-café ou un arrêt eau. Elle vous propose alors un prix par kg de charbon ( notez la rapidité de l'inversion vidéo en LM ) et vous demande si vous voulez marchander. Cette partie du programme est intéressante car elle vous donne droit à plusieurs options : - si vous appuyez sur ENTER ( rappelé par @ sur l'afficheur entre parenthèses ), la machine vous rappelle les données : prix proposé, nb de kg de charbon, argent restant - si vous appuyez sur B, vous pourrez choisir entre BEEP ON ou BEEP OFF - si vous désirez interrompre momentanément le jeu en espérant le continuer plus tard ( les parties sont souvent longues ), il vous suffit d'éteindre la machine, sans faire BREAK, en appuyant sur OFF;lorsque vous le rallumerez, le jeu reprendra au même endroit. - enfin, vous indiquez à l'aide des touches O et N si vous voulez ou non marchander. Si vous décidez de marchander, la machine demande votre prix ( le signe * vous rappelle que si vous pressez la touche ENTER sans rien répondre auparavant, vous aurez alors le rappel des données : prix proposé, kg de charbon, argent restant ). Si votre prix est accepté vous pouvez remarchander;sinon vous repartez sans rien. NB : le nombre de marchandages n'est pas limitatif si le prix proposé est accepté. Attention, si vous refusez un nouveau marchandage, vous serez obligé de prendre du charbon au dernier prix fixé car la séquence ENTER ou 0 ENTER vous rappelle encore les données. Vous pouvez prendre sinon une quantité de charbon comprise entre 1 et 100kg : vous pouvez être certain que jusqu'à 50kg, la machine acceptera d'en prendre. Mais au-delà de 50kg, elle est libre d'accepter ou de refuser la quantité demandée. De toute façon, vous avez droit à 2 propositions avant de repartir bredouille ! A noter encore : - si vous n'avez plus d'argent, la machine continue de passer par les villages, donne le cours du charbon mais ne s'arrête pas - à chaque passage par un village, un test aléatoire détermine l'affichage d'un des indicateurs |, || ou ||| correspondants aux 6 touches programmables de la machine;le niveau | correspond à 15km minimum après chaque pelletée de charbon, le niveau || à 20km et le niveau ||| à 25km. Le hasard départage encore les concurrents! - à partir de 40kg de charbon, l'indicateur SMALL s'allume pour vous indiquer que votre réserve s'épuise. - enfin, pour vous encourager, vous avez droit à un bonus de 600$ tous les milliers de kms. Vous trouverez enfouinant un peu dans les lignes de ce programme beaucoup de petites astuces, notamment pour contrôler les indicateurs de la machine. Vous pouvez vous amuser à les changer sous-programme en pokant aux adresses 28750 et 28751 des valeurs comprises entre 0 et 255 ( &00 à &FF en héxa ). Vous serez très surpris par les effets obtenus ! Je conseille aussi aux programmeurs avertis de jeter un coup d'oeil sur l'autoprogrammeur de score ( aux environs des lignes 1300 et 1950 ). Enfin, rien ne vous interdit de vous servir de l'inversion vidéo en langage machine. Pour cela vous pouvez, en programmation écrire une ligne du type : 3000 WAIT 0:PRINT "expression":CALL &38C5:WAIT:PRINT:END Votre expression apparaitra en vidéo inversée, à condition, bien entendu, que vous avez fait marcher ne serait-ce qu'une fois le programme "petit train", la routine LM étant chargée durant le jeu. Sinon, pas beaucoup d'adaptation possible sur un autre micro, vu que les adresses RAM et ROM ne sont pas les mêmes. Bon voyage et amusez-vous bien ! Programme : 1002 CLS:WAIT 0:CLEAR:DIM LO$(0)*40,VA$(3)*34,VC$(0)*30,A$(0)*26,TA$(0)*24,H2O$(0)*34 1003 DIM CH$(9)*6,RE$(0)*18,MA$(0)*28,GA$(0)*50,PA$(0)*80 1004 REM "inversion vidéo langage machine" 1005 POKE &38C5,&68,&70,&8E,&38,&CC,&68,&71,&6A,&4D,&B5,&FF,&2D,&2E,&88,&06,&9A 1006 POKE 28750,65:MIN=15 1007 AR$="060F7F0F06":RE$(0)="1F7E1E1E7E1F010106":REM "arbres et réservoirs d'eau" 1008 MA$(0)="080C7E7F6F7F6F7F4F4F7F7E0C08":REM "maison" 1009 GA$(0)="787C6E6F6E7C787C7E4B4B4B7B7B48484E7C787C6E6F6E7C78":REM "gare" 1010 VA$(0)="113F3F79793F3F39393F3F79793F3F11":REM "wagon" 1011 VA$(1)="1133F7F7F3F3F2135353D3F7F7F3F3F11":REM "wagon f" 1012 VA$(2)="1133F7F7F3F3F3F213F3F3F7F7F3F3F11":REM "wagon i" 1013 VA$(3)="113F3F7F7F213D3B372F213F7F7F3F3F11":REM "wagon n" 1015 LO$(0)="20383C3C7F7F3F7C7C3C3F3F3F3F39397F7F3910":REM "locomotive" 1016 REM "chiffres panneau kilométrique" 1017 CH$(0)="7F637F":CH$(1)="41417F":CH$(2)="7B6B6F":CH$(3)=é636B7F" 1018 CH$(4)="4F4979":CH$(5)="6F6B78":CH$(6)="7F6B7B":CH$(7)="43437F" 1019 CH$(8)="7F6B7F":CH$(9)="6F6B7F" 1020 VC$(0)="10103C3C7C7E3E3F3F3F7F7F3E3C10":REM "tender" 1022 TA$(0)="20405F7F7F7F7F7F5F4A2A04":REM "pause café" 1023 H2O$(0)="3F405F44445F40525956404E51514E403F":REM "arret eau" 1024 REM "presentation" 1025 BEEP ON:PAUSE " tut tut tut":BEEP 2,10,1000:BEEP 1,10,5000 1030 CLS:FOR I=155 TO 35 STEP -1:GCURSOR I:GPRINT LO$(0);VC$(0);VA$(0)+"10";VA$(0)+"10";VA$(0)+"00" 1035 BEEP 1,40,3:BEEP 1,37,3:BEEP 1,40,3:NEXT I:GCURSOR 2:PRINT "petit":GCURSOR 123:WAIT 100:PRINT "train" 1040 WAIT 20:FOR I=1 TO 4:GCURSOR 2:PRINT " ":GCURSOR 124:PRINT " " 1045 GCURSOR 2:PRINT "petit":GCURSOR 124:PRINT "train":NEXT I 1050 BEEP 1,73,180:BEEP 1,100,100:BEEP 1,57,230:BEEP 1,73,2801055 RANDOM:WAIT 150:C=100:A=5000 1060 PRINT "record à battre= 0km.":PRINT " en voiture!!!" 1062 PRINT " * fermeture des portes *" 1065 BEEP 1,50,6000:WAIT 20:A$(0)="tch...tch... tch... tch..." 1070 FOR I=1 TO 26:BEEP 1,10,10:PRINT LEFT$(A$(0,I):NEXT I:BEEP 1,200:BEEP 1,150:BEEP 1,100:BEEP 1,70,1000 1075 WAIT 0:CLS:CURSOR 0:PRINT "km =":CURSOR 14:PRINT ":100kg;5000$" 1077 REM "partie principale du prgm" 1080 WAIT 2:Y=0 1085 K=K+1:CURSOR 5:PRINT USING "######";K:USING 1086 K1=K/1000:K2=(K1-INT K1):REM "test de bonus" 1087 IF K2=0 LET A=A+600:CURSOR 5:PAUSE " bonus !":GOSUB 1985:CURSOR 6:PRINT " ":K1=99:GOSUB 1695 1088 REM "test de km minimum par pelletée de charbon" 1090 Y=Y+1:IF Y<=MIN THEN 1085 1095 Z=RND 50:IF Z>=47 THEN 1090 1100 Z=RND 5 1105 IF Z<=3 THEN 1085 1107 REM "demande charbon" 1110 WAIT 30:FOR I=1 TO 6 1115 CURSOR 5:PRINT "charbon!":BEEP 2,60,100 1120 A$="":A$=INKEY$:IF A$=" " THEN 1500 1122 REM "test de passage par un village" 1125 Z=RND 50:IF Z>=44 THEN 1530 1130 WAIT 0:CURSOR 4:PRINT " ":K=K+1:WAIT 30:CURSOR 5:PRINT USING "######";K:USING 1131 K1=K1/1000:K2=(K1-INT K1) 1132 IF K2=0 LET A=A+600:CURSOR 5:PAUSE " bonus !":GOSUB 1985:CURSOR 6:PRINT " ":K1=99:GOSUB 1695 1135 A$="":A$=INKEY$:IF A$=" " THEN 1500 1140 NEXT I:WAIT 200 1142 IF C<>0 BEEP 1,73,180:BEEP 1,100,100:BEEP 1,57,230:BEEP 1,73,200:PRINT " alors,on rêve??!" 1144 CLS:PRINT " panne sèche!" 1145 BEEP 3,200,25:BEEP 1,150,200:BEEP 1,115,200 1146 BEEP 3,200,25:BEEP 1,150,200:BEEP 1,115,400 1147 BEEP 1,150,150:BEEP 1,150,50:BEEP 2,160,50:BEEP 2,180,50:BEEP 1,200,100 1148 WAIT 150:PRINT "terminus,fin du voyage!" 1149 POKE 28750,65:CLS 1150 A$(0)="votre score =":WAIT 1:J=1 1155 FOR I=25 TO (J-1) STEP -1:CURSOR I:A$=MID$(A$(0),J,1):IF A$=" " THEN 1158 1156 PRINT A$+" " 1157 NEXT I 1158 J=J+1:IF J<=13 THEN 1155 1160 WAIT 35:PRINT:CURSOR 13:PRINT K;:WAIT 0:PRINT " km.":PRINT 1163 AA=INT(K/1000):AA=(AA*600+5000-A)/K 1165 IF AA<>0 WAIT 150:PRINT:WAIT 0:PRINT "prix moyen du km=";USING "###.##";AA;"$.":USING 1167 GOSUB 1950 1170 SC$="":FOR I=ADD TO (ADD+4):SC$=SC$+CHR$ PEEK I:NEXT I:WAIT 200 1175 SC=VAL(SC$):PRINT "dernier record =";SC;" km." 1180 IF K>SC BEEP 1,20,500:BEEP 1,28,1000:GOSUB 1300 1185 GOSUB 1900:CLS:WAIT 0:I=155 1190 BEEP 1,4,4:I=I-1:GCURSOR 1:GPRINT 0;72;106;31;43;104;PA$(0);0 1192 IF I<=0 THEN 1200 1195 I=I-1:GCURSOR I:GPRINT 0;8;74;127;11;8;PA$(0);0:GOTO 1190 1200 GCURSOR 1:GPRINT 0;0;0;0;0 1210 PAUSE:PAUSE:BEEP 1,25,1000:BEEP 1,25,4000 1215 FOR I=155 TO 57 STEP -1:GCURSOR I:GPRINT LO$(0);VC$(0);VA$(1)+"10;VA$(2)+"10";VA$(3)+"00" 1220 BEEP 1,40,3:BEEP 1,37,3:BEEP 1,40,3:NEXT I:PAUSE:PAUSE 1225 FOR I=1 TO 4:BEEP 1,105,80:BEEP 1,82,80:BEEP 1,68,80:NEXT I 1230 BEEP 1,105,80:BEEP 1,82,80:BEEP 1,68,600:GCURSOR 0:WAIT:GPRINT 0 1235 CLS:WAIT 0:PRINT "une autre partie ?(o/n)" 1240 A$="":A$=INKEY$:IF A$="" THEN 1240 1245 IF A$="o" THEN 1000 1250 IF A$="n" THEN 1260 1255 GOTO 1240 1260 WAIT 200:PRINT "dommage.au revoir!":PRINT:CALL &CD71 1300 REM "programmation automatique de votre meilleur score si c'est le meilleur" 1305 PRINT "bravo!vous battez le record":PRINT "avec";K-SC;" km de plus!" 1310 SC=K:SC$=STR$ SC:L=LEN SC$:J=0 1320 FOR I=ADD+(5-L) TO (ADD+4):J=J+1:POKE I,ASC(MID$(SC$,J,1)):NEXT I:RETURN 1500 REM "sous-prgm pelletée de charbon" 1502 C=C-10:IF C<0 THEN 1144 1505 WAIT 20:CURSOR 4:PRINT "1 pelletée":IF C>=100 CURSOR 15:PRINT STR$ C:GOTO 1520 1510 IF C>=10 CURSOR 15:PRINT " "+STR$ C:GOTO 1520 1515 CURSOR 15:PRINT " "+STR$ C 1520 CURSOR 4:WAIT 0:PRINT " ":IF C<=40 THEN (1800+MIN) 1525 GOTO (1815+MIN) 1530 REM "passage par un village" 1532 CURSOR 4:WAIT 100:PRINT "village!":GOSUB 1850 1535 IF Z=49 BEEP 2,20,1000:CURSOR 4:PRINT " tut-tut! ":WAIT 0:CURSOR 4:PRINT " ":GOTO 1080 1540 CLS:Z=RND 2:GOSUB 1900:WAIT 0:GPRINT PA$(0);"0000";AR$+"00";AR$+"0000";MA$(0)+"00"; 1542 IF Z=2 BEEP 3,200,25:BEEP 1,150,200:BEEP 1,115,200:PRINT:CLS 1546 IF Z=2 WAIT 0:PRINT " pause café":GCURSOR 90:WAIT 150:GPRINT TA$(0):GOTO 1560 1550 BEEP 1,73,180:BEEP 1,100,100:BEEP 1,57,230:BEEP 1,73,280 1552 PRINT 1555 CLS:CURSOR 6:WAIT 0:PRINT "arrêt eau":GCURSOR 8:GPRINT H2O$(0):GCURSOR 105:WAIT 150:GPRINT H2O$(0) 1560 Z=RND 35:V1=99 1565 B=RND 35:IF B>Z THEN 1565 1570 IF A<=0 PRINT " plus d'argent!!":GOTO 1665 1575 WAIT 0:PRINT " prix du charbon=":CALL &38C5:CURSOR 18:PRINT " ";Z;" $ " 1577 WAIT 125:PRINT 1580 PRINT "charbon restant=";C;"kg." 1585 PRINT "argent disponible=";A;"$" 1590 WAIT 5:V$="":PRINT "marchandage?(o/n/q/b/off)":BEEP 1,50:WAIT 0 1595 V$=INKEY$:IF V$="" PRINT "marchandage?(o/n/q/b/off)":GOTO 1595 1596 IF V$=CHR$ 15 CALL 58175 1597 IF V$=CHR$ 66 GOSUB 1745 1599 IF V$=CHR$ 13 PAUSE "prix=";STR$ Z;"$";c=";STR$ C;"kg;a=";STR$ A;"$":GOTO 1595 1600 IF (V$<>"o") AND (V$<>"n") THEN 1590 1603 WAIT 100 1605 IF V$="n" THEN 1625 1610 V=0:V1=0:INPUT "*votre prix=";V 1611 A$=INKEY$ 1612 IF (V=0) AND (A$=CHR$ 13) WAIT 0:PAUSE " prix=";STR$ Z;"$;c=";STR$ C;"kg;a=";STR$ A;"$":GOTO 1611 1613 IF (V=0) AND (A$<>CHR$ 13) THEN 1610 1615 IF VCHR$ 13) THEN 1630 1640 IF (W>H) AND (D=1) PRINT "c'est trop lourd!":D=D+1:BEEP 1:GOTO 1630 1644 IF (W>H) AND (D>1) BEEP 1,20,500:BEEP 1,28,1000:PRINT "c'est encore trop lourd!" 1645 IF (W>H) AND (D>1) PRINT "tant pis,vous n'aurez rien!":GOTO 1670 1650 IF W*Z>A PRINT "vous n'avez que";A;"$.":W=A/Z:PRINT "vous pouvez prendre";W;"kg." 1655 C=C+W:A=A-(W*Z):PRINT "prix à payer=";W*Z;é$é 1660 IF V1=99 LET V=Z 1663 IF V<>B PRINT "vous auriez pu l'avoir à";B;"$":A$="q" 1665 IF (A<=0) AND (A$<>"q") PRINT "cours du charbon:";B;"$." 1670 IF C<=0 THEN 1144 1673 A$="":P1=0:WAIT 0:C=C-10:CURSOR 0:PRINT "km = : kg; $" 1680 IF C>=100 CURSOR 15:PRINT STR$ C:GOTO 1695 1685 IF C>=10 CURSOR 15:PRINT " "+STR$ C:GOTO 1695 1690 CURSOR 15:PRINT " "+STR$ C 1695 IF A>=1000 CURSOR 21:PRINT STR$ A:GOTO 1715 1700 IF A>=100 CURSOR 21:PRINT " "+STR$ A:GOTO 1715 1705 IF A>=10 CURSOR 21:PRINT " "+STR$ A:GOTO 1715 1710 CURSOR 21:PRINT " "+STR$ A 1715 IF K1=99 RETURN 1717 IF C<=40 THEN (1800+MIN) 1718 GOTO (1815+MIN) 1719 REM "réserve argent épuisée (cf ligne 1650)" 1720 N$="":A$="q":PRINT "d'accord?(o/n)" 1725 N$=INKEY$:IF N$="" THEN 1725 1730 IF N$="n" THEN 1625 1735 IF N$="o" LET W=INT W:A=W*Z:GOTO 1655 1740 GOTO 1725 1742 REM "test beep on/off" 1745 PRINT " beep ? (off=0/on=1)" 1750 A$="":A$=INKEY$:IF A$="" THEN 1750 1755 IF A$="1" BEEP ON:RETURN 1760 IF A$="0" BEEP OFF:RETURN 1765 GOTO 1750 1800 REM "test indicateurs |, ||, ||| et small" 1815 POKE 28750,73:GOTO 1080 1820 POKE 28750,41:GOTO 1080 1825 POKE 28750,25:GOTO 1080 1830 POKE 28750,65:GOTO 1080 1835 POKE 28750,33:GOTO 1080 1840 POKE 28750,17:GOTO 1080 1850 MIN=RND 3:ON MIN GOTO 1855,1860,1865 1855 MIN=15:IF C<=40 POKE 28750,73:RETURN 1857 POKE 28750,65:RETURN 1860 MIN=20:IF C<=40 POKE 28750,41:RETURN 1862 POKE 28750,33:RETURN 1865 MIN=25:IF C<=40 POKE 28750,25:RETURN 1867 POKE 28750,17:RETURN 1900 REM "graphisme panneau kilométrique" 1905 PA$(0)="081422414141":K$=STR$ K 1910 FOR I=1 TO LEN K$:I$=MID$(K$,I,1):PA$(0)=PA$(0)+CH$(VAL I$)+"41":NEXT I 1915 PA$(0)=PA$(0)+"41417F4D5361714971497141417F":RETURN 1950 REM "recherche adresse du record dans prgm" 1952 I=&38D5 1955 A=PEEK I*256+PEEK(I+1):IF A=1060 THEN 1965 1957 IF A>1060 THEN WAIT:PRINT "erreur, pas de ligne 1060!":END 1960 I=I+PEEK(I+2)+3:GOTO 1955 1965 I=I+2 1970 I=I+1:IF PEEK I=61 LET ADD=I+2:RETURN 1975 IF PEEK I<>13 THEN 1970 1980 WAIT:PRINT "erreur contenu ligne 1060!":END 1985 FOR I=1 TO 2:BEEP I,105,80:BEEP I,82,80:BEEP I,68,80:NEXT I 1990 BEEP 1,105,80:BEEP 1,82,80:BEEP 1,68,600:RETURN