Denkerfehler ? oder warum funktioniert die IF Then Schaltung nicht

Es gibt 8 Antworten in diesem Thema, welches 1.064 mal aufgerufen wurde. Der letzte Beitrag (4. Februar 2024 um 10:51) ist von Drachen.

  • Hallo Leute,

    Dank von Snoopy Basicerweiterung, möchte ich ein kleines Game programmieren.

    Ich stoße jetzt schon auf eine kleine Nuss, ich ich nicht ganz verstehe.

    Also mein Sprite soll sich bis max 300 Pixeln sich bewegen können und nicht weiter.

    Also schieb ich folgenden Code für die Bewegung nach rechts:

    Code
    ## RICHTUNG OSTEN
    120 IF XP%>20 OR XP%<300 THEN BEGIN
    121    MOVSPR 0,90#0.5:REM SPRITE 0
    122    MOVSPR 1,90#0.5:REM SPRITE 1
    123    IF XP%>300 THEN XP%=XP%-1:MOVSPR 0,0#0:MOVSPR 1,0#0
    
    124    INK 8:CURSOR 1,2:PRINT "XP%=";XP%;"{LEFT}  "
    125 BEND
    126 RETURN

    Und irgendwie kümmert ihn die Zeile 123 überhaupt nicht. Der Sprite hält an aber man icht ihn trotzdem immer weiter nach rechts bewegen.

    Zwar nur stückenchen Weise, aber er bewegt sich

    Bitte melde dich an, um diesen Anhang zu sehen.

    Wo ist da mein Denkfehler :gruebel

    Ich habe immer geglaubt ich verstehe die If Then Schaltung. :nixwiss:

  • Ich kenne den Basic-Dialekt nicht, aber Zeile 123 kann nicht ausgeführt werden, weil sie sich innerhalb der Bedingung aus Zeile 120 befindet, welche ja nur Code ausführt, wenn XP%<300. Deine Kondition in 123 trifft also niemals zu. Vermutlich meinst Du in Zeile 120 zusätzlich ein AND statt eines ORs? Also nur bewegen, wenn größer als 20 UND kleiner als 300?

  • Hast du dran gedacht, dass beim Bewegen der beiden Sprites nach rechts x% vergrößert werden muss?

    Ich kenne das Basic nicht und sehe nur einen kleinen Teil deines Programms.

    Aber so wie ich das verstehe, bewegst du in den Zeilen 121 und 122 die Sprites nach rechts ohne x% anzupassen.

    Die Zeile 123 brauchst du gar nicht, weil die Bewegung nur ausgeführt wird, solange sich x% im Bereich von 21-299 befindet.

  • Code
    120 IF XP%>20 OR XP%<300 THEN BEGIN

    Das ist bestimmt nicht das, was du eigentlich meinst. Vermutlich willst du auf 20-300 begrenzen, aber das macht das hier nicht. Diese Bedingung ist auch wahr für XP%=0 (weil <300) oder XP%=9999 (weil >20)

    Vermutlich meinst du AND...aber dann macht Zeile 123 keinen Sinn, weil diese Bedingung dann nie wahr sein kann.

    Bitte melde dich an, um diesen Link zu sehen.

    Bitte melde dich an, um diesen Link zu sehen.

    Bitte melde dich an, um diesen Link zu sehen.

  • Ah

    darin bin ich wirklich nie sehr Gut in Sachen Logik. :platsch:

    Aber ja das wird mir helfen. Danke euch allen. :dance

    Und der Befehlsyntax stammt von Mega65

    Um einen Sprite zu bewegen beim Mega65 gibt es den Befehl MOVSPR

    Zuerst wird der Sprite auf die Position gesetzt mit MOVSPR Spritenr, xpos,ypos.

    Um ihn dann zu bewegen gibt es jetzt 3 Möglichkeiten

    1. Möglichkeit man Erhöht die xpos oder ypos um die Pixelanzahl der Schrittweite

    2. Möglichkeit man benutz den Befehl MOVSPR mit folgender Einstellung MOVSPR Spritenr, WinkelBitte melde dich an, um diesen Link zu sehen. (Pixel pro Frame)

    3. Möglichkeit man nehme wieder den Befehl MOVSPR Spritenr, Anfangpos-X, Anfangpos-Y to Endpos-X, Endpos-Y, Geschwindigkeit und schon bewegt sich der Sprite Automatisch

    In meinen Programm benutze ich die 2 Möglichkeit.

    So ich hoffe ich konnte es ein wenig gut erklären, ansonsten kann es noch einmal Snoopy versuchen euch zu erklären.

  • Bei OR Verknüpfungen gilt übrigens, sobald EINE Bedingung erfüllt ist, wird nicht mehr weiter evaluiert und der Block ausgeführt.

    Wenn also XP = 500 ist dann wird ausgeführt:

    XP > 20? Ja, -> BEGIN...

    Die Abfrage auf < 300 braucht nicht mehr ausgeführt zu werden, da sie am Ergebnis nichts mehr ändert weil schon klar ist dass in den Block reingesrpungen werden muss.

    Bei einer AND Verknüpfung müssen dagegen alle Bedingungen erfüllt sein.

    Wäre XP = 19 dann würde folgendes Ausgeführt:

    XP > 20? Nein -> XP < 300? Ja -> BEGIN

    Dein Block wird also IMMER ausgeführt, weill IMMER eine der beiden Bedingungen erfüllt ist. Egal welchen Wert XP hat.

  • Lösungsvorschlag: Nimm Zeile 123 heraus und füge sie zwischen 125 und 126 ein. Selbstverständlich musst du dann die Zeilennummerierung ändern.