====== LOKOMOTIVE ====== {{:otros:Lokomotive_p1.jpg?690|}} ===== Ficha ===== ^ Autor | Eberhard Fischer | ^ Compatibilidad | Amstrad PCW 8256 / 8512 / 9512 | ^ Año | ???? | ^ Género | Juego de mesa | ^ Controles | Teclado | ^ Idioma | Español - Alemán | ^ Estado | [[preservado|Preservado]] | ===== Capturas ===== {{:otros:Lokomotive_screenshot01.png?220}} {{:otros:Lokomotive_screenshot02.png?220}} {{:otros:Lokomotive_screenshot03.png?220}} {{:otros:Lokomotive_screenshot04.png?220}} ===== Descripción ===== Entretenido juego matemático, donde nuestra misión, será llevar una locomotora por los raíles de la vía hasta la casilla número 70, donde acaba el juego. Los movimientos en el tablero serán a través de combinaciones matemáticas que tendremos que calcular mediante los cuatro signos de sumar, restar, multiplicar y dividir. Los sígnos de multiplicar y dividir tienen prioridad a la hora de hacer las operaciones. Los números se extraerán al azar y serán establecidos por nuestro PCW. Las combinaciones de los signos las haremos nosotros para conseguir el mayor número, que nos hará avanzar las casillas de la vía. Pero si nos equivocamos al resolver la operación que hayamos descrito antes, perderemos nuestro turno y tocará al jugador contrario. Si nuestra locomotora cae en las casillas macadas con "XX" nos hará avanzar 10 casillas pero de lo contrario si caemos en la casilla de otra locomotora, ésta retrocederá 20 casillas. Podremos guardar y cargar la partida y comenzarla en otro momento. Ver la puntuación más alta conseguida por cualquiera de los dos jugadores en el tablero. ===== Listado ===== * **__Listado - LOK.BAS__** 10 '########################################################################## 20 '##### L O K O M O T I V E ##### 30 '##### ##### 40 '##### ##### 50 '##### Joyce Adaption by Eberhard Fischer ##### 60 '##### ##### 70 '##### (c) by DMV ##### 80 '##### ##### 90 '########################################################################## 100 ' 110 '###################### Benutzerfunktionen definieren #################### 120 ' 130 escape$ = CHR$(27) 140 home$ = escape$ + "H" 150 cls$ = escape$ + "E" + home$ 160 DEF FNloc$(x,y) = escape$ + "Y" + CHR$(32 + y) + CHR$(32 + x) 170 window$ = escape$ + "X" + CHR$(32 + n)+CHR$(32 + n) + CHR$(32 + n)+ CHR$(32 + n) 180 inkan$ = escape$ + "p" 190 inkaus$ = escape$ + "q" 200 ' 210 '------------------------- Bildschirm - Anweisungen ---------------------- 220 ' 230 B1$ = escape$ + "1" :'Statuszeile an 240 B2$ = escape$ + "0" :'statuszeile aus 250 B3$ = escape$ + "K" :' Zeile L|schen 260 B4$ = escape$ + "A" :' Cursor hoch 270 B5$ = escape$ + "B" :' Cursor runter 280 B6$ = escape$ + "f" :' Cursor unsichtbar 290 B7$ = escape$ + "e" :' Cursor sichtbar 300 B8$ = escape$ + "C" :' Cursor um 1 nach Rechts 310 B9$ = escape$ + "D" :' Cursor um 1 nach Links 320 B10$ = escape$ + "c" + CHR$(0) + escape$ + "b" + CHR$(63):' Bildschirm hell 330 B11$ = escape$ + "c" + CHR$(63) + escape$ + "b" + CHR$(0):' Bildschirm dunkel 340 B12$ = escape$ + "y" :' Bildschirm normal Modus 350 ' 360 '####################### Zeichen {ndern ######################### 370 ' 380 PRINT cls$ 390 GOSUB 4810:GOSUB 4410 400 ' 410 '############################## Initialisieren ################################ 420 ' 430 DEFINT a - y 440 DIM strecke(70):posi(1) = 0:posi(2) = 0:strecke(70) = 1 450 zurueck = 20:' gegnerische Lok zur}cksetzen 460 rz$ = "+-*/" 470 RANDOMIZE Time 480 GOSUB 4280 490 ' 500 '--------------------------------- Titelbild ---------------------------------- 510 ' 520 x$ = lokl$ + " L O K O M O T I V E " + b4$ + lokl$ 530 x = 4 540 FOR sz = 1 TO 150:OUT 248,11:NEXT:OUT 248,12 550 FOR sz = 80 TO 32 STEP - 1 560 PRINT FNLOC$(sz,3);LEFT$(x$,x) 570 PRINT FNLOC$(sz+2,3);" ";FNloc$(sz+25,3);" ";FNloc$(sz+25,4);" " 580 x = x + 1 :IF x > 29 THEN x = 37 590 FOR sx = 1 TO 100:NEXT 600 FOR sx = 1 TO 20:OUT 248,11:OUT 248,12:NEXT 610 NEXT 620 ' 630 PRINT FNLOC$(30,15);" Tabelle sehen.....< J - N >" 640 t$ = INKEY$ 650 IF UPPER$(t$) ="J" THEN GOSUB 2970:GOSUB 2250:GOTO 680 660 IF UPPER$(t$) ="N" THEN PRINT FNLOC$(1,15);b3$:GOTO 740 670 IF t$ ="" THEN GOTO 640 680 PRINT FNLOC$(30,25);" Spiel weiterspielen.....<1>" 690 PRINT FNLOC$(30,27);" Neues Spiel.............<2>" 700 t$ = INKEY$ 710 t = VAL(t$):IF t < 1 OR t > 2 THEN 700 720 IF t = 1 AND name$(1)<>"" THEN zei = 30:rei = 23:FOR sz = 23 TO 27 STEP 2:PRINT FNLOC$(1,sz);b3$:NEXT:name1$ = name$(1):name2$ = name$(2):punkte1 = punkte(1):punkte2 = punkte(2):GOTO 1120 ELSE PRINT cls$ 730 IF t = 2 THEN PRINT cls$ 740 '######################### Namen Eingeben ################################## 750 ' 760 PRINT FNLOC$(10,7);" Den Namen bitte f}r Spieler 1 " 770 PRINT FNLOC$(10,9);prb$:xp = 12:yp = 9:lang = 15:lasc = 32:hasc = 122:GOSUB 3700 780 name1$ = UPPER$(LEFT$(tx$,1)) + LOWER$(MID$(tx$,2)) 790 IF name1$="" THEN name1$ = "Spieler 1" 800 PRINT FNLOC$(10,11);" Den Namen bitte f}r Spieler 2 " 810 PRINT FNLOC$(10,13);prb$:yp = 13:GOSUB 3700 820 name2$ = UPPER$(LEFT$(tx$,1)) + LOWER$(MID$(tx$,2)) 830 IF name2$="" THEN name2$ = "Spieler 2" 840 PRINT FNloc$(15,15);" Braucht Ihr Spielregeln ? "; 850 PRINT " J - N ? "; 860 xp = 37:yp$ = CHR$(27)+"j":yp = ASC(yp$)-10:lang = 1:lasc = 74:hasc = 110:GOSUB 3700 870 IF LOWER$(tx$) = "n" THEN zei = 25:rei = 21:GOTO 1120 880 IF LOWER$(tx$) <>"j" THEN 860 890 ' 900 '########################### Spielregeln ################################## 910 ' 920 PRINT cls$:PRINT FNLOC$(30,5);lokl$;" S P I E L R E G E L N ";b4$;lokl$ 930 PRINT:PRINT " Eure Aufgabe besteht darin, eine Lokomotive }ber Schinen bis auf " 940 PRINT " die Zahl 70 zu fahren.":PRINT 950 PRINT " Die Lokomotive bewegt sich, wenn Ihr die Rechenzeichen ' + - * / ' zwischen " 960 PRINT " die drei zuf{llig gezogenen Zahlen setzt. ":PRINT 970 PRINT " Die ";inkan$;" invers ";inkaus$;" dargestellten Zahlen m}~en genau erreicht werden.!":PRINT 980 PRINT " Ist das Ergebniss der Rechnung keine ganze Zahl, dann bleibt" 990 PRINT" die Lok stehen und der andere Spieler ist an der Reihe." 1000 PRINT " Ist die Zahl negativ, dann f{hrt die Lok zur}ck. " 1010 PRINT " Wenn die Lok auf das ";inkan$;" XX ";inkaus$;" kommt, dann f{hrt sie automatisch 10 Felder in " 1020 PRINT " Richtung Ziel. ":PRINT:PRINT 1030 PRINT" Kommt eine Lok auf ein Feld, auf dem bereits die andere Lok steht, so" 1040 PRINT" mu~ die letztere 20 Felder zur}ck. 1050 PRINT FNLOC$(25,26);" > Starten mit SPACE - Taste < " 1060 x$ = INKEY$:IF x$ ="" THEN 1060 1070 IF ASC(x$)<> 32 THEN 1060 1080 PRINT cls$:zei = 25:rei = 10 1090 ' 1100 '############################ Level ################################# 1110 ' 1120 FOR x = 0 TO 69:strecke(x) = 0:NEXT 1130 PRINT FNLOC$(zei,rei);" Welcher Schwierigkeitsgrad ? 1140 PRINT FNLOC$(zei,rei+2);" 1 = LEICHT":PRINT FNLOC$(zei,rei+4);" 2 = MITTEL":PRINT FNLOC$(zei,rei+6);" 3 = SCHWER" 1150 x$ = INKEY$:IF x$ ="" THEN 1150 1160 x = ASC(x$):IF x < 49 OR x > 51 THEN 1150 1170 IF x = 49 THEN level = 1:strecke(20) = 1:strecke(28) = 2:strecke(41) = 2:strecke(50) = 1 1180 IF x = 50 THEN level = 2:strecke(20) = 1:strecke(26) = 2:strecke(35) = 1:strecke(38) = 2:strecke(50) = 1:strecke(60) = 1 1190 IF x = 51 THEN level = 3:strecke(10) = 1:strecke(20) = 1:strecke(40) = 1:strecke(23)=2:strecke(50) = 1:strecke(60) = 1 1200 ' 1210 '############################ Spieler 1 ################################## 1220 ' 1230 PRINT cls$:GOSUB 3830 1240 PRINT FNLOC$(4,4);lokr$ 1250 GOSUB 4200 1260 PRINT FNLOC$(47,21);inkan$;" ";name1$;" ";inkaus$ 1270 PRINT FNloc$(47,26);STRING$(10," ");FNLOC$(47,26);name2$ 1280 GOSUB 3110 1290 GOSUB 3310 1300 GOSUB 3500:IF dezimal THEN dezimal = 0:GOSUB 1660:GOTO 1440 1310 IF falsch THEN falsch = 0:GOSUB 1720:GOTO 1440 1320 FOR x = posi(1) + 1 TO posi(1) + summe-1 1330 IF strecke(x) = 1 THEN merker=-1:GOSUB 1820:x = posi(1) + summe 1340 NEXT x 1350 IF merker THEN merker = 0:GOTO 1440 1360 IF SGN(summe) < 0 THEN st =-1:summe =-MIN(ABS(posi(1)),ABS(summe)) ELSE st = 1 1370 y = posi(1):posi(1) = posi(1) + summe:GOSUB 1940:summe = 0:y = posi(2):GOSUB 1940 1380 PRINT FNLOC$(51,23);USING"####";posi(1) 1390 IF posi(1) = 70 THEN 2050 1400 IF strecke(posi(1)) = 2 THEN GOSUB 1870:summe = 10:GOTO 1360 1410 IF posi(1) <> 0 THEN IF posi(1) = posi(2) THEN GOSUB 1770:summe =-MIN(posi(1),zurueck):y = posi(2):posi(2) = posi(2) + summe:st =-1:GOSUB 1940:PRINT FNLOC$(51,28);USING"####";posi(2) 1420 ' 1430 '######################### Spieler 2 ######################################### 1440 ' 1450 GOSUB 4200 1460 PRINT FNLOC$(47,26);inkan$;" ";name2$;" ";inkaus$ 1470 PRINT FNLOC$(47,21);STRING$(10," ");FNloc$(47,21);name1$ 1480 GOSUB 3110 1490 GOSUB 3310 1500 GOSUB 3500:IF dezimal THEN dezimal = 0:GOSUB 1660:GOTO 1250 1510 IF falsch THEN falsch = 0:GOSUB 1720:GOTO 1250 1520 FOR x = posi(2) + 1 TO posi(2) + summe-1 1530 IF strecke(x)=1 THEN merker =-1:GOSUB 1820:x = posi(2) + summe 1540 NEXT x 1550 IF merker THEN merker = 0:GOTO 1250 1560 IF SGN(summe) < 0 THEN st =-1:summe =-MIN(ABS(posui(2)),ABS(summe)) ELSE st = 1 1570 y = posi(2):posi(2) = posi(2) + summe:GOSUB 1940:summe = 0:y = posi(1):GOSUB 1940 1580 PRINT FNLOC$(51,28);USING"####";posi(2) 1590 IF posi(2) = 70 THEN 2050 1600 IF strecke(posi(2)) = 2 THEN GOSUB 1870:summe = 10:GOTO 1560 1610 IF posi(2)<> 0 THEN IF posi(2) = posi(1) THEN GOSUB 1770:summe =-MIN(posi(2),zurueck):y = posi(1):posi(1) = posi(1) + summe:st =-1:GOSUB 1940:summe = 0:y = posi(2):GOSUB 1940:PRINT FNLOC$(51,23);USING"####";posi(1) 1620 GOTO 1250 1630 ' 1640 '############################## Meldung #################################### 1650 ' 1660 PRINT FNLOC$(65,5);"Das Ergebniss ist nicht ";FNloc$(70,7);"ganzzahlig!!":PRINT FNLOC$(65,10);" Ergebniss = ";USING"##.###";summe 1670 PRINT CHR$(7) 1680 FOR p = 1 TO 5000:NEXT 1690 FOR sz = 5 TO 10:PRINT FNLOC$(65,sz);STRING$(24," "):NEXT 1700 RETURN 1710 ' 1720 PRINT FNLOC$(65,5);" Das Ergebniss ist nicht ";FNloc$(70,7);"Richtig!";FNloc$(65,10);" Ergebniss = ";USING"####";summe:PRINT CHR$(7) 1730 FOR p = 1 TO 5000:NEXT 1740 FOR sz = 5 TO 10:PRINT FNLOC$(65,sz);STRING$(24," "):NEXT 1750 RETURN 1760 ' 1770 PRINT FNLOC$(65,5);zurueck;" Felder zur}ck! ";CHR$(7) 1780 FOR p = 1 TO 3000:NEXT 1790 FOR sz = 5 TO 10:PRINT FNLOC$(65,sz);STRING$(24," "):NEXT 1800 RETURN 1810 ' 1820 PRINT FNLOC$(65,5);"Du willst doch nicht die":PRINT FNLOC$(65,7);"n{chste Haltestelle";FNloc$(70,9);" }berfahren ?";CHR$(7) 1830 FOR p = 1 TO 3000:NEXT 1840 FOR sz = 5 TO 10:PRINT FNLOC$(65,sz);STRING$(24," "):NEXT 1850 RETURN 1860 ' 1870 PRINT FNLOC$(65,5);" 10 Felder vorr}cken!";CHR$(7) 1880 FOR p = 1 TO 3000:NEXT 1890 FOR sz = 5 TO 10:PRINT FNLOC$(65,sz);STRING$(24," "):NEXT 1900 RETURN 1910 ' 1920 '############################## Lok bewegen ##################################### 1930 ' 1940 lok$ = lokr$:FOR x = y TO y + summe STEP st 1950 IF (x > 9 AND x < 20) OR (x>29 AND x < 40) OR (x > 49 AND x < 60) OR x > 69 THEN xp = 31 - VAL(RIGHT$(STR$(x),1))*3:lok$ = lokl$:GOTO 1970 1960 xp = VAL(RIGHT$(STR$(x),1))*3+4:lok$ = lokr$ 1970 yp = INT(x/10)*3+4:PRINT FNLOC$(xp,yp);lok$:FOR p = 1 TO 200:NEXT:PRINT FNLOC$(xp,yp);loesch$ 1980 FOR sz = 1 TO 20:OUT 248,11:OUT 248,12:NEXT 1990 NEXT 2000 PRINT FNLOC$(xp,yp);lok$ 2010 RETURN 2020 ' 2030 '########################## Spiel-Ende ######################################### 2040 ' 2050 punkte1 = punkte1 + posi(1) 2060 punkte2 = punkte2 + posi(2) 2070 punkte(1) = punkte(1) + punkte1:punkte(2) = punkte(2) + punkte2:name$(1) = name1$:name$(2) = name2$:rz = rz + 1 2080 PRINT FNLOC$(51,24);USING"####";punkte1 2090 PRINT FNLOC$(51,29);USING"####";punkte2 2100 IF punkte1 > punkte2 THEN PRINT FNLOC$(65,7);name1$;" hat gewonnen " 2110 IF punkte2 > punkte1 THEN PRINT FNLOC$(65,7);name2$;" hat gewonnen " 2120 FOR p = 1 TO 8000:NEXT 2130 zei = 65:rei = 10 2140 PRINT FNLOC$(zei,rei);" 1 = Spiel fortsetzen " 2150 PRINT FNLOC$(zei,rei + 2);" 2 = Neues Spiel " 2160 PRINT FNLOC$(zei,rei + 4);" 3 = Spiel speichern " 2170 PRINT FNLOC$(zei,rei + 6);" 4 = Ende ";CHR$(7) 2180 x$ = INKEY$:IF x$ = "" THEN 2180 2190 x = ASC(x$):IF x < 49 OR x > 52 THEN 2180 2200 IF x = 50 THEN posi(1) = 0:posi(2) = 0:FOR sz = 1 TO 2:name$(sz)="":punkte(sz)=0:NEXT:rz = 0:GOTO 760 2210 IF x = 51 THEN GOSUB 2250:zei = 35:rei = 23:GOTO 2140 2220 IF x = 52 THEN PRINT cls$:END 2230 posi(1) = 0:posi(2) = 0:punkte1 = 0:punkte2 = 0:rz = rz + 1:GOTO 1230 2240 ' 2250 '##################### Highscore - Tafel ################################### 2260 ' 2270 PRINT cls$ 2280 PRINT FNLOC$(5,5);inkan$;STRING$(81," ") 2290 zei = 6: 2300 FOR sz = 10 TO 14 2310 PRINT FNLOC$(sz,zei);CHR$(197)+CHR$(198) 2320 PRINT FNLOC$(sz+60,zei);CHR$(197)+CHR$(198) 2330 zei = zei + 1 2340 NEXT 2350 ' 2360 zei = 10 2370 FOR sz = 15 TO 19 2380 PRINT FNLOC$(sz,zei);CHR$(196)+CHR$(195) 2390 PRINT FNLOC$(sz+60,zei);CHR$(196)+CHR$(195) 2400 zei = zei - 1 2410 NEXT 2420 ' 2430 FOR sz = 6 TO 20 2440 PRINT FNLOC$(15,sz);" ";FNloc$(75,sz);" " 2450 NEXT 2460 ' 2470 PRINT FNLOC$(1,20);STRING$(88,149) 2480 PRINT inkaus$ 2490 ' 2500 lang = 20 2510 oben$ = CHR$(150)+STRING$(3,CHR$(154))+CHR$(155)+STRING$(lang,CHR$(154))+CHR$(155)+STRING$(3,CHR$(154))+CHR$(156) 2520 mitte$ = CHR$(149) + STRING$(lang+8," ")+CHR$(149) 2530 unten$ = CHR$(147) + STRING$(lang+8,CHR$(154)) + CHR$(153) 2540 zei = 6 2550 PRINT FNLOC$(45-LEN(oben$)/2,zei);oben$ 2560 FOR sz = zei+1 TO zei + 3 2570 PRINT FNLOC$(45-LEN(oben$)/2,sz);mitte$ 2580 NEXT 2590 PRINT FNLOC$(45-LEN(oben$)/2,sz);unten$ 2600 PRINT FNLOC$(39,zei + 1);"HAUPTBAHNHOF" 2610 PRINT FNLOC$(35,zei + 3);"H I G H - S C O R E" 2620 ' 2630 lang = 32 2640 oben$ = CHR$(150) + STRING$(lang+8,CHR$(154)) + CHR$(156) 2650 mitte$ = CHR$(149) + STRING$(lang+8," ")+CHR$(149) 2660 unten$ = CHR$(147)+STRING$(3,CHR$(154))+CHR$(158)+STRING$(lang,CHR$(154))+CHR$(158)+STRING$(3,CHR$(154))+CHR$(153) 2670 zei = 13 2680 PRINT FNLOC$(45-LEN(oben$)/2,zei);oben$ 2690 FOR sz = zei+1 TO zei + 5 2700 PRINT FNLOC$(45-LEN(oben$)/2,sz);mitte$ 2710 NEXT 2720 PRINT FNLOC$(45-LEN(oben$)/2,sz);unten$ 2730 PRINT inkaus$ 2740 PRINT FNLOC$(45-LEN(oben$)/2+4,sz+1);CHR$(149);STRING$(lang," ");CHR$(149) 2750 PRINT FNLOC$(45-8/2,zei+1);"FAHRPLAN" 2760 PRINT FNLOC$(26,zei+3);"Gleis 1 :" 2770 PRINT FNLOC$(36,zei+3);UPPER$(name$(1)) 2780 PRINT FNLOC$(46,zei+3);USING"#### Pkt.";punkte(1) 2790 PRINT FNLOC$(56,zei+3);USING"## Runden";rz 2800 PRINT FNLOC$(26,zei+5);"Gleis 2 :" 2810 PRINT FNLOC$(36,zei+5);UPPER$(name$(2)) 2820 PRINT FNLOC$(46,zei+5);USING"#### Pkt.";punkte(2) 2830 PRINT FNLOC$(56,zei+5);USING"## Runden";rz 2840 RETURN 2850 ' 2860 '######################### Tabelle saven ########################### 2870 ' 2880 OPEN "O",1,"lokomo.dat" 2890 FOR sz = 1 TO 2 2900 WRITE #1,name$(sz) 2910 WRITE #1,punkte(sz) 2920 NEXT 2930 WRITE #1,rz 2940 CLOSE 2950 RETURN 2960 ' 2970 '######################### tabelle laden ########################## 2980 ' 2990 IF FIND$("lokomo.dat") = "" THEN RETURN 3000 OPEN "I",1,"lokomo.dat" 3010 FOR sz = 1 TO 2 3020 INPUT #1,name$(sz) 3030 INPUT #1,punkte(sz) 3040 NEXT 3050 INPUT #1,rz 3060 CLOSE 3070 RETURN 3080 ' 3090 '########################### Zufallszahlen #################################### 3100 ' 3110 zahl(1) = INT(RND*3)+1:zahl(2) = INT(RND*5):zahl(3) = INT(RND*6)+1:lauf = 12:z = lauf-5 3120 FOR y = 1 TO lauf 3130 FOR x = 1 TO 3 3140 PRINT FNLOC$(47+x,7);inkan$;RIGHT$(STR$(x),1);inkaus$:PRINT FNLOC$(47+x,7);:FOR p = 1 TO y*12:NEXT:PRINT RIGHT$(STR$(x),1):IF y > z AND x = zahl(1) THEN x = 3:y = lauf 3150 NEXT x:NEXT y 3160 PRINT FNLOC$(47+zahl(1),7);inkan$;RIGHT$(STR$(zahl(1)),1);inkaus$ 3170 FOR y = 1 TO lauf 3180 FOR x = 0 TO 4 3190 PRINT FNLOC$(48+x,10);inkan$;RIGHT$(STR$(x),1);inkaus$:PRINT FNLOC$(48+x,10);:FOR p = 1 TO y*8:NEXT p:PRINT RIGHT$(STR$(x),1):IF y > z AND x = zahl(2) THEN x = 4:y = lauf 3200 NEXT x:NEXT y 3210 PRINT FNLOC$(48+zahl(2),10);inkan$;RIGHT$(STR$(zahl(2)),1);inkaus$ 3220 FOR y = 1 TO lauf 3230 FOR x = 1 TO 6 3240 PRINT FNLOC$(47+x,13)inkan$;RIGHT$(STR$(x),1);inkaus$:PRINT FNLOC$(47+x,13);:FOR p = 1 TO y*6:NEXT p:PRINT RIGHT$(STR$(x),1):IF y > z AND x = zahl(3) THEN x = 6:y = lauf 3250 NEXT x:NEXT y 3260 PRINT FNLOC$(47+zahl(3),13);inkan$;RIGHT$(STR$(zahl(3)),1);inkaus$ 3270 PRINT FNLOC$(47,17);zahl(1):PRINT FNLOC$(51,17);zahl(2):PRINT FNLOC$(55,17);zahl(3) 3280 PRINT FNLOC$(49,19);"=" 3290 RETURN 3300 ' 3310 '########################## Eingabe Rechenzeichen ############################## 3320 ' 3330 xp = 50:yp = 17:lasc =42:hasc = 47:lang = 1:tx$ = " ":GOSUB 3700 3340 IF INSTR(rz$,tx$) = 0 THEN 3330 3350 IF zahl(2) = 0 AND tx$ ="/" THEN 3330 3360 rz1$ = tx$ 3370 xp = 54:GOSUB 3700 3380 IF INSTR(rz$,tx$) = 0 THEN 3330 3390 rz2$ = tx$ 3400 ' 3410 '############################## Eingabe Ergebniss ############################### 3420 ' 3430 xp = 51:yp = 19:lasc = 45:hasc = 57:lang = 2:GOSUB 3700 3440 IF INSTR(tx$,"/") <> 0 THEN 3430 3450 IF INSTR(tx$,".") <> 0 THEN 3430 3460 ergebnis = VAL(tx$) 3470 ' 3480 '############################## Berechnung #################################### 3490 ' 3500 IF rz2$="/" AND rz1$ ="/" THEN summe = zahl(1)/zahl(2)/zahl(3):GOTO 3640 3510 IF rz2$="/" AND rz1$ <>"*" THEN zwsumme = zahl(2)/zahl(3):GOTO 3610 3520 IF rz2$="*" AND rz1$ ="/" THEN summe = zahl(1)/zahl(2)*zahl(3):GOTO 3640 3530 IF rz2$="*" THEN zwsumme = zahl(2)*zahl(3):GOTO 3610 3540 IF rz1$="+" THEN zwsumme = zahl(1)+zahl(2):GOTO 3580 3550 IF rz1$="-" THEN zwsumme = zahl(1)-zahl(2):GOTO 3580 3560 IF rz1$="*" THEN zwsumme = zahl(1)*zahl(2):GOTO 3580 3570 zwsumme = zahl(1)/zahl(2) 3580 IF rz2$="+" THEN summe = zwsumme + zahl(3):GOTO 3640 3590 IF rz2$="-" THEN summe = zwsumme - zahl(3):GOTO 3640 3600 summe = zwsumme/zahl(3):GOTO 3640 3610 IF rz1$="+" THEN summe = zahl(1)+zwsumme:GOTO 3640 3620 IF rz1$="-" THEN summe = zahl(1)-zwsumme:GOTO 3640 3630 summe = zahl(1)*zwsumme:GOTO 3640 3640 IF INT(summe) <> summe THEN dezimal =-1:GOTO 3660 3650 IF summe <> ergebnis THEN falsch = -1 3660 RETURN 3670 ' 3680 '############################ Eingaberoutine ################################ 3690 ' 3700 WHILE INKEY$ <>"":WEND:PRINT FNLOC$(xp,yp);SPACE$(LEN(tx$)):tx$="":PRINT FNLOC$(xp,yp);: 3710 x$ = INKEY$:IF x$ ="" THEN 3710 3720 x = ASC(x$):IF x = 13 AND tx$ ="" THEN 3790 3730 IF x = 127 AND LEN(tx$) = 0 THEN GOTO 3790 3740 IF x = 13 THEN RETURN 3750 IF x = 127 THEN tx$ = LEFT$(tx$,LEN(tx$)-1):PRINT b9$;" ";b9$;:GOTO 3710 3760 IF LEN(tx$) = lang THEN 3790 3770 IF x < lasc OR x > hasc THEN 3790 3780 tx$ = tx$ + x$:PRINT x$;:GOTO 3710 3790 GOTO 3710 3800 ' 3810 '########################## Bildschirmmaske ################################ 3820 ' 3830 FOR y = 5 TO 29:PRINT FNLOC$(45,y);CHR$(149);:NEXT 3840 FOR y = 15 TO 26 STEP 5:PRINT FNLOC$(45,y);CHR$(151);STRING$(10,CHR$(154)):NEXT 3850 PRINT FNLOC$(33,1);lokl$;" L O K O M O T I V E ";b4$;lokl$ 3860 PRINT FNLOC$(47,5);"LEVEL = ";level 3870 PRINT FNLOC$(47,6);CHR$(185);STRING$(3,CHR$(186));CHR$(187):PRINT FNLOC$(47,7);CHR$(188);"123";CHR$(192):PRINT FNLOC$(47,8);CHR$(189);STRING$(3,190);CHR$(191) 3880 PRINT FNLOC$(47,9);CHR$(185);STRING$(5,186);CHR$(187):PRINT FNLOC$(47,10);CHR$(188);"01234";CHR$(192):PRINT FNLOC$(47,11);CHR$(189);STRING$(5,190);CHR$(191) 3890 PRINT FNLOC$(47,12);CHR$(185);STRING$(6,186);CHR$(187):PRINT FNLOC$(47,13);CHR$(188);"123456";CHR$(192):PRINT FNLOC$(47,14);CHR$(189);STRING$(6,190);CHR$(191) 3900 PRINT FNLOC$(47,16);"+ - * /" 3910 PRINT FNLOC$(47,21);name1$:PRINT FNLOC$(47,23);"Pos:";USING"####";posi(1):PRINT FNLOC$(47,24);"Pkt:";USING"####";punkte1 3920 PRINT FNLOC$(47,26);name2$:PRINT FNLOC$(47,28);"Pos:";USING"####";posi(1):PRINT FNLOC$(47,29);"Pkt:";USING"####";punkte2 3930 PRINT FNLOC$(5,6);"0";:FOR x = 1 TO 9:PRINT CHR$(154);CHR$(154);RIGHT$(STR$(x),1);:NEXT:PRINT vbr$ 3940 PRINT FNLOC$(3,12);vbl$;:PRINT"19";:FOR x = 18 TO 10 STEP -1:PRINT CHR$(154)RIGHT$(STR$(x),2);:NEXT 3950 PRINT FNLOC$(4,12);"20";:FOR x = 21 TO 29:PRINT CHR$(154)RIGHT$(STR$(x),2);:NEXT:PRINT vbr$ 3960 PRINT FNLOC$(3,18);vbl$;:PRINT"39";:FOR x = 38 TO 30 STEP -1:PRINT CHR$(154)RIGHT$(STR$(x),2);:NEXT 3970 PRINT FNLOC$(4,18);"40";:FOR x = 41 TO 49:PRINT CHR$(154)RIGHT$(STR$(x),2);:NEXT:PRINT vbr$ 3980 PRINT FNLOC$(3,24);vbl$;:PRINT"59";:FOR x = 58 TO 50 STEP-1:PRINT CHR$(154)RIGHT$(STR$(x),2);:NEXT 3990 PRINT FNLOC$(4,24);"60";:FOR x = 61 TO 69:PRINT CHR$(154)RIGHT$(STR$(x),2);:NEXT:PRINT vbr$ 4000 PRINT FNLOC$(31,27);"70" 4010 ' 4020 '########################## Bahnh|fe markieren ############################# 4030 ' 4040 fl=0:xp=31:yp=9:PRINT inkan$ 4050 FOR x=10 TO 70 4060 IF fl THEN 4110 4070 PRINT FNLOC$(xp,yp);:IF strecke(x)=1 THEN PRINT USING"##";x 4080 PRINT FNLOC$(xp,yp);:IF strecke(x)=2 THEN PRINT "XX"; 4090 IF RIGHT$(STR$(x),1)="9" THEN fl=NOT fl:yp=yp+3:GOTO 4150 4100 xp=xp-3:GOTO 4150 4110 PRINT FNLOC$(xp,yp);:IF strecke(x)=1 THEN PRINT USING"##";x; 4120 PRINT FNLOC$(xp,yp);:IF strecke(x)=2 THEN PRINT"XX"; 4130 IF RIGHT$(STR$(x),1)="9" THEN fl=NOT fl:yp=yp+3:GOTO 4150 4140 xp=xp+3 4150 NEXT:PRINT inkaus$ 4160 RETURN 4170 ' 4180 '######################## Anzeige l|schen ############################## 4190 ' 4200 PRINT FNLOC$(48,7);"123" 4210 PRINT FNLOC$(48,10);"01234" 4220 PRINT FNLOC$(48,13);"123456" 4230 PRINT FNLOC$(48,17);" " 4240 PRINT FNLOC$(48,19);" " 4250 RETURN 4260 END 4270 ' 4280 '####################### Symbole zusammenstellen ############################# 4290 ' 4300 lokr$=CHR$(176)+CHR$(177)+CHR$(8)+CHR$(8)+CHR$(10)+CHR$(178)+CHR$(179) 4310 lokl$=CHR$(180)+CHR$(181)+CHR$(8)+CHR$(8)+CHR$(10)+CHR$(182)+CHR$(183) 4320 loesch$=CHR$(32)+CHR$(32)+CHR$(8)+CHR$(8)+CHR$(10)+CHR$(32)+CHR$(32) 4330 vbr$=CHR$(156)+CHR$(8)+CHR$(10)+CHR$(149)+CHR$(8)+CHR$(10)+CHR$(149)+CHR$(8)+CHR$(10)+CHR$(153) 4340 vbl$=CHR$(147)+b4$+b9$+CHR$(149)+b4$+b9$+CHR$(149)+b4$+b9$+CHR$(150) 4350 prb$=CHR$(193)+CHR$(194) 4360 RETURN 4370 END 4380 ' 4390 '######################### Symbol - MC ####################################### 4400 ' 4410 RESTORE 4570 4420 READ zeichencode 4430 IF zeichencode<0 OR zeichencode>255 THEN RETURN 4440 FOR i=0 TO 7 4450 READ x:POKE tabstart+i,x 4460 NEXT i 4470 charstart=zeichencode*8+&HB800+2^16 4480 highaddr=INT(charstart/256) 4490 lowaddr=charstart-highaddr*256 4500 POKE &HF510,lowaddr 4510 POKE &HF511,highaddr 4520 CALL codestart 4530 GOTO 4420 4540 ' 4550 '########################### Zeichen definieren ######################## 4560 ' 4570 DATA 176,&h00,&h00,&h00,&h00,&h00,&hFE,&h42,&h5A 4580 DATA 177,&h00,&h00,&h00,&h3e,&h22,&h1c,&h14,&h15 4590 DATA 178,&h5a,&h5b,&h58,&h40,&h4c,&h52,&h73,&h0c 4600 DATA 179,&h97,&hf5,&h04,&h02,&h32,&h49,&hcf,&h30 4610 DATA 180,&h00,&h00,&h00,&h7c,&h44,&h38,&h28,&ha8 4620 DATA 181,&h00,&h00,&h00,&h00,&h00,&h7f,&h42,&h5a 4630 DATA 182,&he9,&haf,&h20,&h40,&h4c,&h92,&hf3,&h0c 4640 DATA 183,&h5a,&hda,&h1a,&h02,&h32,&h4a,&hce,&h30 4650 DATA 185,&h00,&h00,&h3f,&h1f,&h2f,&h17,&h2b,&h14 4660 DATA 186,&h00,&h00,&hff,&hff,&hff,&hff,&hff,&h00 4670 DATA 187,&h00,&h00,&hfc,&hf4,&hec,&hdc,&hbc,&h7c 4680 DATA 188,&h2a,&h14,&h2a,&h14,&h2a,&h14,&h2a,&h14 4690 DATA 189,&h2b,&h16,&h2d,&h1a,&h35,&h00,&h00,&h00 4700 DATA 190,&h55,&haa,&h55,&haa,&h55,&h00,&h00,&h00 4710 DATA 191,&h7c,&hbc,&h5c,&hac,&h54,&h00,&h00,&h00 4720 DATA 192,&h7c,&h7c,&h7c,&h7c,&h7c,&h7c,&h7c,&h7c 4730 DATA 193,&h00,&h00,&h00,&h07,&h0c,&h18,&h30,&hff 4740 DATA 194,&h00,&h00,&h06,&hfe,&h36,&h30,&h30,&hf0 4750 DATA 195,&h01,&h03,&h07,&h0f,&h1f,&h3f,&h7f,&hff 4760 DATA 196,&hff,&hfe,&hfc,&hf8,&hf0,&he0,&hc0,&h80 4770 DATA 198,&hff,&h7f,&h3f,&h1f,&h0f,&h07,&h03,&h01 4780 DATA 197,&h80,&hc0,&he0,&hf0,&hf8,&hfc,&hfe,&hff 4790 DATA -1 4800 ' 4810 MEMORY &HF4FF 4820 RESTORE 4910 4830 codestart = &HF500 4840 tabstart = &HF515 4850 FOR i = 0 TO 20 4860 READ x:POKE codestart+i,x 4870 NEXT i 4880 RETURN 4890 ' 4900 ' 4910 DATA &H01,&H09,&HF5 4920 DATA &HCD,&H5A,&HFC 4930 DATA &HE9,&H00 4940 DATA &HC9 4950 DATA &H21,&H15,&HF5 4960 DATA &H01,&H08,&H00 4970 DATA &H11,&H00,&H00 4980 DATA &HED,&HB0 4990 DATA &HC9 5000 ' 5010 END ===== Controles ===== + = SUMAR - = RESTAR * = MULTIPLICAR / = DIVIDIR INTRO = SELECCIONAR ===== Carga del programa ===== 1.- Introducir el disco CP/M por la cara 2 2.- Escribir BASIC y esperar a que cargue 3.- Retirar el disco CP/M e introducir el disco que contiene el juego Lokomotive 4.- Teclear run "Lok" y pulsar la tecla "ENTER" ===== Descarga ===== * {{:otros:Lokomotive (sp) (Basic).zip|Lokomotive en español }}(juego en formato dsk, comprimido con zip) * {{:otros:Lokomotive (de) (Basic).zip|Lokomotive en alemán }}(juego en formato dsk, comprimido con zip)