Wie versteht man die < > "Operatoren" Besser

Anfängerfragen zum Programmieren mit PureBasic.
Coder Pinhead
Beiträge: 234
Registriert: 27.02.2007 10:54
Wohnort: Germany

Wie versteht man die < > "Operatoren" Besser

Beitrag von Coder Pinhead »

Hi, also ich habe ein Problem ich Arbeite gerade ja das ein oder andere Tutorial ab um PureBasic endlich zu können <) . Und jetzt stecke ich bei einer stelle fest und zwar bei der --->

Code: Alles auswählen

If FassExist(x) = 1 And MouseX() > FassX(x) And MouseX() < FassX(x) + 20 And MouseY() > FassY(x) And MouseY() < FassY(x) + 20
Also das ">" bedeutet ja größer oder gleich und das bedeutet "<" kleiner oder gleich ne? So und jetzt frage ich mich wen ich später selber mal ein Game oder ein Programm Coden möchte woher ich selber weis in welche richtung die "<", ">" zeigen müssen. Weil wen man den Code da oben mal als Satz sich vorstellt dan ergibt das irgend wie keinen sin: Wen FassExist() existiert setze auf 1 und MausX() "Größer"?... Hoffe mir kann das jemand erklären das ich das besser verstehe...

Ach das Tutorial womit ich noch übe ist von www.purebasic.de

Der Komplette Source Code:

Code: Alles auswählen

InitSprite()     ; Iniziert DirectX
InitKeyboard()   ; Die Tastatur befehle sollen verwendet werden
InitMouse()      ; Die Maus Befehle sollen verwendet werden
OpenScreen(640,480,16,"Beispiel 10_1") ; Öffnet ein Fenster im Vollbild Modus
#Max_Fass = 20               ; Eine Konstante die die Anzahl der Maximalen Fässer speichert
Dim FassX.w(#Max_Fass)       ; Die X Position der Fässer
Dim FassY.w(#Max_Fass)       ; Die Y Position der Fässer
Dim FassExist.w(#Max_Fass)   ; Gibt es das Fass oder nicht ?
Dim FassAnim.w(#Max_Fass)    ; Die Animationsphase in der sich das Fass befindet
Global Level.w              ; Das Level in dem sich der Spieler befindet
Global Maus_Knopf.w         ; Speichert nach einem Schuss ab, das die Maustaste bereits gedrückt wurde
Global Punkte.w             ; Die Anzahl der Punkte die der Spieler errungen hat
Global FassCount.w          ; Zählt die Fässer um prüfen zu können ob für das Level genug da sind
Global Durchgefallen.w      ; Zählt die Anzahl der Fässer die bereits durchgefallen sind.
Level = 1 ; Setzt das Anfangslevel

LoadSprite(0,"GFX\NeuKreuz.bmp",0)  ; Lädt unsere neue und schönere Kreuzgrafik
TransparentSpriteColor(0,255+256*0+256*256*255) ; Setzt die transparent Farbe für das Kreuz
LoadSprite(1,"GFX\Back.bmp" ,0)     ; Lädt Den Hintergrund
For x = 1 To 10 ; Schleife für das laden der Fassanimation
 LoadSprite(10+x,"GFX\Fass" + Str(x) + ".bmp",0) ; Alle 10 Animationsstufen des Fasses laden
 TransparentSpriteColor(10+x,255+256*0+256*256*255)          ; Und die Transparentsfarbe setzen
Next

Repeat
 ExamineMouse()    ; Neue Mausdaten einlesen
 ExamineKeyboard() ; Neue Tastaturdaten einlesen
 If MouseButton(1) And Maus_Knopf = 0 ; Wenn die Maustaste gedrückt wurde
  Maus_Knopf = 1 ; Jetzt kann nicht mehr gefeuert werden, bis die Taste losgelassen wird
  For x = 1 To #Max_Fass ; Für alle Fässer
   If FassExist(x) = 1 And MouseX() > FassX(x) And MouseX() < FassX(x) + 20 And MouseY() > FassY(x) And MouseY() < FassY(x) + 20
   ; Check ob das Fass existiert und man mit der Maus drauf zeigt.
   FassExist(x) = 2 ; Exist 2 bedeutet, das Fass ist gerade am auseinanderfallen
   Punkte = Punkte + 10 ; Punkt dazurechnen
   EndIf
  Next
 EndIf
 If MouseButton(1) = 0 ; Wenn die nicht Maustaste gedrückt ist
  Maus_Knopf = 0       ; darf man wieder feuern
 EndIf

 DisplaySprite(1,0,0)  ; den Hintergrund setzen (ohne MaskColor, er soll ja alles abdecken)
 For x = 1 To #Max_Fass ; Für alle Fässer (mal wieder)
  If FassExist(x) > 0 ; Wenn das Fass existiert
   DisplayTransparentSprite(10+FassAnim(x)/3,FassX(x),FassY(x)) ; setze die aktuelle Animationphase auf den Bildschirm
  EndIf
 Next
 DisplayTransparentSprite(0,MouseX()-32,MouseY()-32) ; Das Ziel Kreuz setzen
 StartDrawing(ScreenOutput()) ; Für Schrift brauchen wir dann doch nocht 2D Drawing 
 DrawingMode(1)               ; Den Hintergrund der Schrift auf durchsichtig stellen
 FrontColor(0+256*0+256*256*255)          ; In blau
 DrawText(0,0,"Punkte:" + Str(Punkte)) ; Und da sind Sie auch schon
 FrontColor(255+256*0+256*256*0)          ; In rot
 DrawText(530,0,"Durchgefallen:" + Str(Durchgefallen)) ; ...
 StopDrawing()                ; Damit ist der 2D Kram erledigt
 FlipBuffers()                ; Bildschirmseiten tauschen

 FassCount = 0                ; Die gezählten Fässer sind am Anfang Null
 For x = 1 To #Max_Fass      ; Mal wieder für alle Fässer
  If FassExist(x) > 0         ; gibt es das Fass
   FassCount = FassCount + 1   ; Dann die gezählten Fässer um 1 erhöhen
   If FassExist(x) < 3         ; Wenn das Fass nicht gerade auf dem Boden zerschellt
    FassY(x) = FassY(x) + 1    ; Es weiter nach unten bewegen
   EndIf
   If FassExist(x) > 1        ; Nur Für FassExist 2 und 3, da diese Animatier sind
    FassAnim(x) = FassAnim(x) + 1 ; Die Animation um 1 erhöhen
    If FassAnim(x) > 30           ; Wenn die Animation beim Ende Angekommen
     FassExist(x) = 0             ; dann existiert das Fass ab jetzt nicht mehr
    EndIf
   EndIf
   If FassExist(x) = 1 And FassY(x) > 460 ; Wenn das Fass Existiert (nicht gerade kaputt geht) und auf den Boden fällt
    Durchgefallen = Durchgefallen + 1     ; Ist eins mehr durchgefallen
    FassExist(x) = 3                      ; Und das Fass zerschellt am Boden
   EndIf
  EndIf
 Next
 
 If FassCount < Level  ; Wenn es weniger Fässer im Bild gibt 
  For x = 1 To #Max_Fass ; Für alle Fässer
   If FassExist(x) = 0 ; Wenn es das Fass nicht gibt
    FassExist(x) = 1   ; Wird aus Ihm ein neues
    FassAnim(x) = 3    ; Die Animation wird auf den Anfang zurück geschaubt
    FassY(x) = -40     ; Das Fass kommt ganz nach oben
    FassX(x) = Random(620) ; Auf eine zufällige X Position
    x = #Max_Fass+1 ; Und die Schleife wird beendet
   EndIf
  Next
 EndIf
 If (Punkte / 100) + 1 > Level ; Alle 100 Punkte
  Level = Level + 1            ; Wird das Level um 1 erhöht
 EndIf

Until KeyboardPushed(1) Or Durchgefallen > 9 ; Und es wird solange gespielt bis 10 Fässer durchgefallen sind oder Escape gedrückt wird
Delay(1000) ; Kurze Pause
CloseScreen() ; Das Fenster schliessen
MessageRequester("Game Over", "Du hast " + Str(Punkte) + " Punkte erreicht",0) ; Und noch einmal die Punkte anzeigen
Man warum ist aller Anfang so schwer? :( :cry:
Windows 8.1 x64 | PureBasic v5.x x86/x64

Sämtliche Syntax, Tipp und Rechtschreibfehler unterliegen dem Copyright des Verfassers.
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

>> Also das ">" bedeutet ja größer oder gleich und das bedeutet "<" kleiner oder gleich ne?
Nein, ">" bedeutet grösser, ">=" bedeutet grösser oder gleich
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Coder Pinhead
Beiträge: 234
Registriert: 27.02.2007 10:54
Wohnort: Germany

Beitrag von Coder Pinhead »

ts-soft hat geschrieben:>> Also das ">" bedeutet ja größer oder gleich und das bedeutet "<" kleiner oder gleich ne?
Nein, ">" bedeutet grösser, ">=" bedeutet grösser oder gleich
Danke,

So aber wie bastel ich mir selber später den Code damit zusammen?
Kannst mir das so erklären das ich das verstehe oder mir daraus weningstens sinnvolle Sätze im Kopf zusammen reimen kann (Wen TasteX gedrückt wird gleich PengBoom)? Weil man kan ja schlecht Rätselraten und hier kommt mal ein < hin und dort mal ein > und hier dan ein <= und dort wieder ein < nur weil ich so lustig bin.... :(
Windows 8.1 x64 | PureBasic v5.x x86/x64

Sämtliche Syntax, Tipp und Rechtschreibfehler unterliegen dem Copyright des Verfassers.
Benutzeravatar
Zaphod
Beiträge: 2875
Registriert: 29.08.2004 00:40

Beitrag von Zaphod »

Da gibt es eine ganz einfache Eselsbrücke... da wo die klammer Spitz ist, steht das kleinere, da wo sie breit ist steht das größere.
also kleiner<größer und größer>kleiner.

Bei kleiner gleich und größer gleich funktioniert es natürlich genauso:
kleiner<=größer und größer>=kleiner.

Wann was sinnvoll ist, bekommt man natürlich nur mit gesundem Menschenverstand raus. Mein Tip dazu: versuche dir mit Stift und Zettel das Problem zu visualisieren und Programmiere nicht einfach darauf los, sondern versuche das Problem so komplett wie möglich vorher zu verstehen (manchmal wirft die Implementierung neue Probleme auf, das ist aber ok).

edit:
Ich bin mir nicht sicher ob das genau dein Problem ist aber betrachten wir mal folgenden ausschnitt:

Code: Alles auswählen

If FassExist(x) = 1 And MouseX() > FassX(x) And MouseX() < FassX(x) + 20 And MouseY() > FassY(x) And MouseY() < FassY(x) + 20 
Das schaut nach, ob sich die Maus über dem bereich befindet in dem "Fass ist" und das ist ganz einfach:
Die xkoordinaten haben ihren ursprung links im bild, also da ist 0.
Ist die Maus über dem Fass, muss also logischerweise die x-Position der Maus größer als die x Position des Fasses sein (weil die Zeichnung des Fasses nach dem Selben koordinaten system Funktioniert, also der Ursprung des Fasses ist links oben im Fass bei (0,0)).
Nun könnte die Maus ja auch rechts neben dem Fass sein. Also musst du überprüfen, ob die x Position der Maus größer ist als die x Position des Fasses und kleiner als die x Position des Fasses plus dessen breite... dann weißt du, dass die Maus auf der x-Achse über dem Fass ist. Jetzt könnte die Maus auch über oder unter dem Fass sein, also machst du genau das selbe nochmal für die y-koordinaten.
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

> Wen FassExist() existiert setze auf 1 und MausX() "Größer"?

ja nee, das is ja komplett falsch...

das "=" ist hier nur ein vergleich, keine zuweisung.

also:

Code: Alles auswählen

If FassExist(x) = 1 And MouseX() > FassX(x) And MouseX() < FassX(x) + 20 And MouseY() > FassY(x) And MouseY() < FassY(x) + 20
wenn
- die die Variable "Fass existiert" für Fass Nummer X =1 ist, also True, also das fass existiert,
UND
die Maus-X-Koordinate größer ist als die Fass-X-Koordinate,
UND
die Maus-X-Koordinate kleiner ist als die Fass-X-Koordinate plus 20,
UND
die Maus-Y-Koordinate größer ist als die Fass-Y-Koordinate,
UND
die Maus-Y-Koordinate kleiner ist als die Fass-Y-Koordinate plus 20,
DANN
tue was auch immer danach im code steht, bis zum EndIf.

die letzten 4 bedingungen prüfen, ob sich der mauszeiger auf dem fass befindet.
das fass ist 20x20 groß, deshalb die +20 beim "hinteren" bzw. "unteren" ende.
das Fass wird positioniert über seine obere linke ecke, d.h.
Fass-X-Koordinate ist die linke kante und Fass-Y-Koordinate ist die obere kante.

diese Bedingung fragt also, ob das fass existiert und sich die maus darüber befindet.
da ist keine zuweisung, keine anweisung und nix enthalten, nur die reine Bedingung.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Coder Pinhead
Beiträge: 234
Registriert: 27.02.2007 10:54
Wohnort: Germany

Beitrag von Coder Pinhead »

Zaphod hat geschrieben:Ich bin mir nicht sicher ob das genau dein Problem ist aber betrachten wir mal folgenden ausschnitt:

Code: Alles auswählen

If FassExist(x) = 1 And MouseX() > FassX(x) And MouseX() < FassX(x) + 20 And MouseY() > FassY(x) And MouseY() < FassY(x) + 20 
Das schaut nach, ob sich die Maus über dem bereich befindet in dem "Fass ist" und das ist ganz einfach:
Die xkoordinaten haben ihren ursprung links im bild, also da ist 0.
Ist die Maus über dem Fass, muss also logischerweise die x-Position der Maus größer als die x Position des Fasses sein (weil die Zeichnung des Fasses nach dem Selben koordinaten system Funktioniert, also der Ursprung des Fasses ist links oben im Fass bei (0,0)).
Nun könnte die Maus ja auch rechts neben dem Fass sein. Also musst du überprüfen, ob die x Position der Maus größer ist als die x Position des Fasses und kleiner als die x Position des Fasses plus dessen breite... dann weißt du, dass die Maus auf der x-Achse über dem Fass ist. Jetzt könnte die Maus auch über oder unter dem Fass sein, also machst du genau das selbe nochmal für die y-koordinaten.
Jap genau das ist mein Problem. Also ich weis noch nicht so recht wie ich mir das mit < > als Satz vorstellen kann damit selbständig so ein Code schreiben kann. Aber die Erklärung von dir Hilft schon mal etwas :)

Danke

Auch dank an Kaeru Gaman für seine gute erklärung ;) <)
Windows 8.1 x64 | PureBasic v5.x x86/x64

Sämtliche Syntax, Tipp und Rechtschreibfehler unterliegen dem Copyright des Verfassers.
Benutzeravatar
ZeHa
Beiträge: 4760
Registriert: 15.09.2004 23:57
Wohnort: Friedrichshafen
Kontaktdaten:

Beitrag von ZeHa »

Wichtig ist auch, daß zu solch einem Operator immer zwei Werte gehören. Du kannst den komischen "Satz" auch erstmal mit Klammern ausdrücken, vielleicht ist das dann klarer:

Code: Alles auswählen

If (FassExist(x) = 1) And (MouseX() > FassX(x)) And (MouseX() < FassX(x) + 20) And (MouseY() > FassY(x)) And (MouseY() < FassY(x) + 20)
Und man kann es sogar noch in mehrere Ifs aufteilen, das sieht dann normalerweise nochmal ein bißchen schöner aus:

Code: Alles auswählen

If (FassExist(x) = 1)
  If (MouseX() > FassX(x)) And (MouseX() < FassX(x) + 20)
    If (MouseY() > FassY(x)) And (MouseY() < FassY(x) + 20)

    EndIf
  EndIf
EndIf
Dann gibt's noch mehr, was man tun kann, um das alles etwas übersichtlicher zu machen. Um einen Wert auf " = 1" zu prüfen, muß man das " = 1" gar nicht angeben, denn wenn kein Operator kommt, prüft er automatisch, ob der Wert 0 ist oder ungleich 0. In diesem Fall kann man das also komplett weglassen.
Dann kann man noch das x durch ein i ersetzen, da x meiner Meinung nach immer für eine x-Koordinate verwendet werden sollte, und nicht als Index. Hierfür ist das i gedacht.
Zuletzt kann man noch die vielen Funktionsaufrufe durch Variablen ersetzen, denn wenn man die mehrmals benötigt, ist es sinnlos, dauernd die Funktion zu verwenden - nicht nur aus optischen, sondern auch aus Performance-Gründen.

Code: Alles auswählen

mouseX = MouseX()
mouseY = MouseY()
fassX = FassX(i)
fassY = FassY(i)

If (FassExist(i))
  If (mouseX > fassX) And (mouseX < fassX + 20)
    If (mouseY > fassY) And (mouseY < fassY + 20)

    EndIf
  EndIf
EndIf
Nun sollte man die 20 noch durch eine Konstante ersetzen, oder zumindest eine Variable (je nachdem, wie flexibel man seine Engine plant), und der Übersicht halber kann man hierbei wieder Klammern setzen:

Code: Alles auswählen

mouseX = MouseX()
mouseY = MouseY()
fassX = FassX(i)
fassY = FassY(i)

If (FassExist(i))
  If (mouseX > fassX) And (mouseX < (fassX + fassWidth))
    If (mouseY > fassY) And (mouseY < (fassY + fassHeight))

    EndIf
  EndIf
EndIf
Jetzt dürfte es eigentlich übersichtlich genug sein, und die Operatoren sind auch viel einfacher zu lesen. Bei so einem ewig langen If-Konstrukt wie ursprünglich angegeben kann man nämlich selbst dann Fehler machen, wenn man die Funktionsweise der Operatoren kennt. Grundsätzlich würde ich daher raten, kompliziertere Ifs in mehrere aufzuteilen und ein paar Klammern zu setzen. Wenn Du Dir den Code nach ein paar Tagen/Wochen anschaust, wirst Du froh drüber sein ;)
Bild     Bild

ZeHa hat bisher kein Danke erhalten.
Klicke hier, wenn Du wissen möchtest, woran ihm das vorbeigeht.
Benutzeravatar
ZeHa
Beiträge: 4760
Registriert: 15.09.2004 23:57
Wohnort: Friedrichshafen
Kontaktdaten:

Beitrag von ZeHa »

Noch ein Hinweis... je nach Zusammenhang ist es natürlich so richtiger:

Code: Alles auswählen

If (FassExist(i)) 
  mouseX = MouseX()
  mouseY = MouseY() 
  fassX = FassX(i) 
  fassY = FassY(i) 

  If (mouseX > fassX) And (mouseX < (fassX + fassWidth)) 
    If (mouseY > fassY) And (mouseY < (fassY + fassHeight)) 

    EndIf 
  EndIf 
EndIf
Denn wenn Du die Variablen später NICHT mehr brauchen solltest, sondern nur für dieses If-Konstrukt, bzw. genauer gesagt nur dann, wenn das Faß auch existiert, dann ist es sinnvoller, diese auch nur im Falle der Existenz anzulegen bzw. zuzuweisen. Hat mit Deinem eigentlichen Problem nicht mehr viel zu tun, ich weiß :mrgreen: aber dennoch denke ich, ist es nicht falsch, das hier zu erwähnen...
Bild     Bild

ZeHa hat bisher kein Danke erhalten.
Klicke hier, wenn Du wissen möchtest, woran ihm das vorbeigeht.
Benutzeravatar
Zaphod
Beiträge: 2875
Registriert: 29.08.2004 00:40

Beitrag von Zaphod »

Am besten nimmst du dir ein Blatt Papier. Darauf zeichnest du ein Rechteck. Dieses Rechteck repräsentiert den Bildschirm. Darin zeichnest du ein weiteres Rechteck, dass repräsentiert das Fass. Jetzt zeichnest du einen Punkt in das Fass hinein, der repräsentiert die Position der Maus.

Jetzt siehst du dir das ganze genau an und überlegst, welche Bedingungen erfüllt sind, wenn die Maus über dem Fass ist und du wirst genau auf diesen Ausdruck kommen.
Coder Pinhead
Beiträge: 234
Registriert: 27.02.2007 10:54
Wohnort: Germany

Beitrag von Coder Pinhead »

So langsam verstehe ich es <) :mrgreen:

Danke noch mal an alle für die Hilfe :)
Windows 8.1 x64 | PureBasic v5.x x86/x64

Sämtliche Syntax, Tipp und Rechtschreibfehler unterliegen dem Copyright des Verfassers.
Antworten