User Tools

Site Tools


en:lokomotive

LOKOMOTIVE

Info

Author Eberhard Fischer
Compatibility Amstrad PCW 8256 / 8512 / 9512
Year ????
Gender Board game
Controls Keyboard
Language Spanish - German
Status Preserved

Screenshots

Description

Entertaining mathematical game, where our mission will be to take a locomotive along the rails of the track to box number 70, where the game ends. The movements on the board will be through mathematical combinations that we will have to calculate using the four signs of addition, subtraction, multiplication and division. The multiplication and division signs have priority when doing operations.

Numbers will be drawn randomly and set by our PCW. We will make the combinations of the signs to get the highest number, which will make us advance the squares of the track. But if we make a mistake when solving the operation that we have described before, we will lose our turn and it will be the turn of the opposing player.

If our locomotive lands on the squares marked with “XX” it will make us advance 10 squares, but otherwise if we land on the square of another locomotive, it will go back 20 squares.

We can save and load the game and start it at another time. See the highest score achieved by any two players on the board.

Listing

  • Listing - 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

Controls

       + = ADD
       - = SUBTRACT
       * = MULTIPLY
       / = DIVIDE
   ENTER = SELECT
   

Loading the program

 1.- Insert the CP/M disc on side 2
 2.- Write BASIC and wait for it to load
 3.- Remove the CP/M disk and insert the disk containing the Lokomotive game
 4.- Type run "Lok" and press the "ENTER" key

Download

en/lokomotive.txt · Last modified: 2022/06/30 12:11 by jevicac