Hello, Guest the thread was viewed393 times and contains 8 replies

last post from Drachen at the

Denkerfehler ? oder warum funktioniert die IF Then Schaltung nicht

  • 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
    1. ## RICHTUNG OSTEN
    2. 120 IF XP%>20 OR XP%<300 THEN BEGIN
    3. 121 MOVSPR 0,90#0.5:REM SPRITE 0
    4. 122 MOVSPR 1,90#0.5:REM SPRITE 1
    5. 123 IF XP%>300 THEN XP%=XP%-1:MOVSPR 0,0#0:MOVSPR 1,0#0
    6. 124 INK 8:CURSOR 1,2:PRINT "XP%=";XP%;"{LEFT} "
    7. 125 BEND
    8. 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


    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
    1. 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.

  • 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, Winkel#Geschwindigkeit (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.