MOB SET/Reaktionstest

Aus C64-Wiki
Zur Navigation springenZur Suche springen

Beispiel 2 zu MOB SET:

  10 los!
  20 REPEAT :
       n4=0:                             ; Zähler für Sprite-Wechsel
       bildschirm:
       anzeige
  30   REPEAT :
         n4=n4+1:
         wahl:                           ; Sprite-Form und -Position 
         setzen:                         ; auswählen und anzeigen
         warte:                          ; auf Reaktion warten
         anzeige:                        ; Ergebnis anzeigen
       UNTIL r=1 OR en
  40   IF r<>1 THEN treffer
  50   aus:
       n3=n3+1:                          ; Durchgänge zählen (à 1 Minute)
       en=0
  60 UNTIL r=1 OR (n3=3)                 ; nach 3 Durchgängen ist Schluss
  70 anzeige:
     PRINT "{home}"
  80 END 

1000 PROC los!                           ; Variablen-Initialisierung
1010   b0=14:
       b1=13:
       b2=15:
       m=0:                              ; Spritenummer
       ms=0:                             ; Anzahl der Fehler des Getesteten
       n1=0:                             ; Anzahl der Treffer
       n2=0:
       n3=0:
       n4=0:
       en=0:                             ; Flags
       first=-1:
       an=-1
1020   zl=12:
       sp=19:
       x=0:
       y=122
1030   r$="{C=a}{Sh*}{C=s}{C=-} {C=-}{C=z}{Sh*}{C=x}":
       zt=3:                             ; schnellste Reaktionszeit
       z0=0:
       z1=-1
1040   DIM mo(2),fa(3),sp(3),zl(3)
1045   fa(0)=6
1050   mo(1)=b0:
       fa(1)=5:                          ; Spritefarben
       sp(1)=7:                          ; Spritepositionen
       zl(1)=9
1055   mo(2)=b1:
       fa(2)=14:
       sp(2)=17:
       zl(2)=9
1060   fa(3)=10:
       sp(3)=27:
       zl(3)=9:
       PRINT "{CTRL n}{CRTL h}"          ; Kleinschrift fixieren
1070   COLOUR 0,0,fa(0):
       sprites:
       ti$="000000":
       t0=0:                             ; Zeitnahme-Variablen
       t1=0
1080 END PROC 

1100 PROC setzen
1110   MOB SET m,mo(nr),fa(f),0,0
1115   x=sp(z)*8+24
1120   MMOB m,x,y,x,y,3,0
1130 END PROC 

1300 PROC aus
1310   MOB OFF m
1320 END PROC 

1400 PROC zufall
1410   z=INT(RND(1)*3)+1
1420 END PROC 

1500 PROC wahl
1510   zufall:
       f=z
1520   zufall:
       nr=z-1:
       IF nr<1 THEN CALL wahl
1530   zufall:
       t0=time
1540 END PROC 

1600 PROC bildschirm
1605   aus:
       INSERT r$,0,0,40,25,fa(0)
1610   PRINT AT(0,2)"{C=q}"DUP("{Sh*}",38)"{C=w}"
1615   PRINT AT(0,20)"{C=q}"DUP("{Sh*}",38)"{C=w}"
1620   PRINT AT(0,22)"{C=q}"DUP("{Sh*}",38)"{C=w}"
1625   COLOUR ,12:
       PRINT AT(6,1)"R E A K T I O N S - T E S T"
1630   INSERT r$,8,6,7,7,fa(0)
1635   INSERT r$,8,16,7,7,fa(0)
1640   INSERT r$,8,26,7,7,fa(0)
1645   COLOUR ,fa(1):
       PRINT AT(1,6)"Den roten Ball im rotem Kasten treffen"
1650   COLOUR ,fa(0)
1655   zufall:
       INSERT r$,zl(z)-1,sp(z)-1,7,7,fa(3):
       ka=sp(z)
1660   PRINT AT(4,16)"Schusstaste ist die Taste  : ";:
       COLOUR ,fa(3):
       PRINT "F7"
1665   COLOUR ,fa(0)
1670   PRINT AT(4,18)"Vorzeitig Test beenden mit : ";:
       COLOUR ,fa(3):
       PRINT "F1"
1675   COLOUR ,fa(0)
1680   IF an THEN DO
1682     COLOUR ,fa(3):                ; Dieser DO-Abschnitt nur beim allerersten Mal
         PRINT AT(12,21)"Starten mit F7":
         besser:
         m=1:
         nr=1:
         f=3:
         setzen
1684     REPEAT :
           r=INKEY :
         UNTIL r=7
1686     PRINT AT(12,21)DUP(" ",14):
         COLOUR ,fa(0):
         an=0:
         besser:
         besser
1688   DOne
1690 END PROC 

1700 PROC warte
1710   fl=0:
       t1=0:
       re=0:
       IF sp(z)=ka THEN fl=1           ; Flag: Sprite im roten Kasten? 
1720   FOR i=1 TO 100
1730     r=INKEY :                     ; Welche F-Taste gedrückt?
         re=time:                      ; Zeitnahme für "verpasst"
         IF fl THEN IF r=7 THEN IF f=3 THEN IF nr=1 THEN t1=re:
           treffer:                    ; Treffer wenn Kasten, Taste, Farbe und Sprite-Form richtig
           re=0
1735     IF r THEN i=100
1740   NEXT :
       IF r=1 THEN re=0:               ; F1 gedrückt (vorzeitig Beenden)
         END PROC 
1745   IF r THEN IF fl=0 THEN schlecht ; falscher Kasten
1750   IF f<>3 THEN t1=0:              ; falsche Farbe
         re=0:
         IF r THEN schlecht
1755   IF nr<>1 THEN t1=0:             ; falsche Sprite-Form
         re=0:
         IF r THEN schlecht
1760   IF re THEN IF fl=0 THEN re=0    ; Zeit bei falschem Kasten zurücksetzen
1770 END PROC 

1800 PROC schlecht                     ; tiefer Ton
1810   aus:
       VOL 15:
       ENVELOPE 1,1,5,15,15:
       WAVE 1,00100001:
       MUSIC 6,"{clr}1c3{F2}":
       PLAY 1
1820   WAVE 1,00100000 
       VOL 0:
1825   ms=ms+1
1830 END PROC 

1900 PROC gut                          ; Fanfare
1910   aus:
       VOL 15:
       ENVELOPE 1,1,5,15,15:
       WAVE 1,00100001:
       MUSIC 8,"{clr}1a4{F1}{clr}ga4{F1}{clr}1b4{F1}{clr}gb4{F1}{clr}1c5{F2}":
       PLAY 1
1920   WAVE 1,00100000:
       VOL 0  
1930 END PROC 

1950 PROC besser                       ; hohe Töne anhängen
1960   aus:
       VOL 15:
       ENVELOPE 1,1,5,15,15:
       WAVE 1,00100001:
       MUSIC 8,"{clr}1a4{F1}{clr}ga4{F1}{clr}1d5{F2}":
       PLAY 1
1920   WAVE 1,00100000:
       VOL 0  
1980 END PROC 

2000 PROC sprites                      ; Spriteform definieren
2010   DESIGN 0,mo(1)*64
2020   @........bbbbb...........
2021   @.....bbbbbbbbbbb........
2022   @....bbbbbbbbbbbbb.......
2023   @...bbbbbbbbbbbbbbb......
2024   @..bbbbbbbbbbbbbbbbb.....
2025   @..bbbbbbbbbbbbbbbbb.....
2026   @.bbbbbbbbbbbbbbbbbbb....
2027   @.bbbbbbbbbbbbbbbbbbb....
2028   @bbbbbbbbbbbbbbbbbbbbb...
2029   @bbbbbbbbbbbbbbbbbbbbb...
2030   @bbbbbbbbbbbbbbbbbbbbb...
2031   @bbbbbbbbbbbbbbbbbbbbb...
2032   @bbbbbbbbbbbbbbbbbbbbb...
2033   @.bbbbbbbbbbbbbbbbbbb....
2034   @.bbbbbbbbbbbbbbbbbbb....
2035   @..bbbbbbbbbbbbbbbbb.....
2036   @..bbbbbbbbbbbbbbbbb.....
2037   @...bbbbbbbbbbbbbbb......
2038   @....bbbbbbbbbbbbb.......
2039   @.....bbbbbbbbbbb........
2040   @........bbbbb...........
2050   DESIGN 0,mo(2)*64
2060   @..........b.............
2061   @.........bbb............
2062   @........bbbbb...........
2063   @.......bbbbbbb..........
2064   @......bbbbbbbbb.........
2065   @.....bbbbbbbbbbb........
2066   @....bbbbbbbbbbbbb.......
2067   @...bbbbbbbbbbbbbbb......
2068   @..bbbbbbbbbbbbbbbbb.....
2069   @.bbbbbbbbbbbbbbbbbbb....
2070   @bbbbbbbbbbbbbbbbbbbbb...
2071   @.bbbbbbbbbbbbbbbbbbb....
2072   @..bbbbbbbbbbbbbbbbb.....
2073   @...bbbbbbbbbbbbbbb......
2074   @....bbbbbbbbbbbbb.......
2075   @.....bbbbbbbbbbb........
2076   @......bbbbbbbbb.........
2077   @.......bbbbbbb..........
2078   @........bbbbb...........
2079   @.........bbb............
2080   @..........b.............
2090 END PROC 

2100 PROC anzeige                      ; Ergebnisse 
2110   COLOUR ,12:
       PRINT AT(19,21)"";:             ; Anzahl der Fehler
       USE "F=##",ms;
2115   PRINT AT(27,21)MID$(time$,4,1)":"RIGHT$(time$,2)" m";
2120   USE " (###)",n4:                ; Anzeige der Laufdauer
       IF re THEN vf=vf+1:             ; Anzahl der verpassten richtigen Kombinationen
         schlecht:
         ms=ms-1
2125   z0=VAL(MID$(time$,4,1)):
       IF z1<>z0 THEN z1=z0:
         en=1
2130   PRINT AT(1,23)"";:
       USE "Treffer=##:verpasst=##:Bestzeit:#,## s",n1,vf,zt
2135   COLOUR ,fa(0):
       IF first THEN en=0:
         first=0
2140 END PROC 

2200 PROC treffer
2210   IF t1=0 THEN END PROC 
2220   z=(t1-t0)/60-.38
2230   PRINT AT(1,21)"Zeit:";:
       USE "###,## s",z
2240   IF z<.01 THEN z=zt
2250   gut
2260   n1=n1+1:
       IF z<zt THEN zt=z:              ; Bestzeit merken
         IF n1>1 THEN besser
2270 END PROC