And und Or Verknüpfung funktioniert nicht richtig

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

 

bruce85

Betreff: And und Or Verknüpfung funktioniert nicht richtig

BeitragMo, Jun 30, 2008 15:12
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,
ich möchte auf einer Tilemap nach gleiche Frames und Frames+5 prüfen, ob diese nebeneinander sind.

Hier ist mal mein Code:
Code: [AUSKLAPPEN]
For y=0 To 11
  For x=0 To 11
    If Spielfeld(x,y) > 1 Then
      If x+1 > 10 Then Exit ;Schleife verlassen
      If x+2 > 10 Then Exit ;Schleife verlassen
      If y+1 > 10 Then Exit ;Schleife verlassen
      If y+2 > 10 Then Exit ;Schleife verlassen

      If Spielfeld(x+1,y) = Spielfeld(x,y) And Spielfeld(x+2,y) = Spielfeld(x,y) Or Spielfeld(x+1,y)+5 = Spielfeld(x,y) And Spielfeld(x+2,y) = Spielfeld(x,y) Then
        xx = 1
        While Spielfeld(x,y) = Spielfeld(x+xx,y)
          Spielfeld(x+xx,y) = 1
          xx = xx + 1
        Wend
        Spielfeld(x,y) = 1
        Exit ;Schleife verlassen
      EndIf
    EndIf
  Next
Next


Alles funktioniert soweit, bis ich noch Frames+5 prüfen möchte, ob diese auch nebendran ist.

Irgendwie funktioniert es nicht richtig wenn ich in einer If anweisung And und Or Verknüpfung verwende.

Habt ihr vieleicht eine ahnung an was es liegen könnte?
Oder kennt ihr bessere Methode wie ich das lösen kann?

Ich bedanke mich schonmal im Voraus.

MfG
AMD Athlon(tm) II X2 250, 8 GB DDR, MSI MSI 770-C45, GeForce GTS 250

BladeRunner

Moderator

BeitragMo, Jun 30, 2008 15:19
Antworten mit Zitat
Benutzer-Profile anzeigen
Benutz Klammern dann geht es.
a=b and b or c ist was anderes als (a=b) and (B or c) Wink
also überleg genau welche Bedingung in welche Klammer gehört.
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92
 

Düsi

BeitragMo, Jun 30, 2008 15:19
Antworten mit Zitat
Benutzer-Profile anzeigen
Code: [AUSKLAPPEN]
If Spielfeld(x+1,y) = Spielfeld(x,y) And Spielfeld(x+2,y) = Spielfeld(x,y) Or Spielfeld(x+1,y)+5 = Spielfeld(x,y) And Spielfeld(x+2,y) = Spielfeld(x,y) Then

Meinst Du das?

Ich würde mal sagen, es sollte eher so lauten:
Code: [AUSKLAPPEN]
If ((Spielfeld(x+1,y) = Spielfeld(x,y)) And (Spielfeld(x+2,y) = Spielfeld(x,y))) Or ((Spielfeld(x+1,y)+5 = Spielfeld(x,y)) And (Spielfeld(x+2,y) = Spielfeld(x,y))) Then


So kenn ich es aus anderen Sprachen.

Edit:
Mist, zu langsam :/.
 

bruce85

BeitragMo, Jun 30, 2008 15:28
Antworten mit Zitat
Benutzer-Profile anzeigen
Achso, ist mir garnicht aufgefallen das ich sie weggelassen habe, bei C++ ist mir das noch nie passiert.

Vielen Dank.

MfG
AMD Athlon(tm) II X2 250, 8 GB DDR, MSI MSI 770-C45, GeForce GTS 250
 

Dreamora

BeitragMo, Jun 30, 2008 16:03
Antworten mit Zitat
Benutzer-Profile anzeigen
Ein wichtiger Punkt noch: Blitz3D / Plus hat kein early break.

Das heisst wenn du a and b and c hast und a ist false, dann werden b und c dennoch evaluiert.

Checke also niemals if type <> null and type\fieldname ... denn dann wirst du direkt in einen MAV rennen wenn type = null ist.
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.
 

bruce85

BeitragMo, Jun 30, 2008 17:02
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke für den Tip.

Habe noch ein kleines Problem und zwar funktioniert folgendes nicht wenn die Kugeln so nebeneinander sind:
http://www.qpic.ws/viewimage.p...737992.bmp

Hier ist mal die If anweisung:
Code: [AUSKLAPPEN]
If (( Spielfeld(x,y) = Spielfeld(x+1,y) Or Spielfeld(x,y) = Spielfeld(x+1,y)+5 ) And ( Spielfeld(x,y) = Spielfeld(x+2,y) Or Spielfeld(x,y) = Spielfeld(x+2,y)+5 )) Then

EndIf


Die große Kugeln sind Standard und die kleine Kugeln sind immer +5 Frames in der Bilddatei "LoadAnimImage".

Woran könnte der fehler liegen?

Edit: Hier ist mal die Komplette Funktion:
Code: [AUSKLAPPEN]
Function CheckPaare()
  zaehler2 = 1
  For y=0 To 11
    For x=0 To 11
      If spielfeld(x,y) > 1 Then
        If (( Spielfeld(x,y) = Spielfeld(x+1,y) Or Spielfeld(x,y) = Spielfeld(x+1,y)+5 ) And ( Spielfeld(x,y) = Spielfeld(x+2,y) Or Spielfeld(x,y) = Spielfeld(x+2,y)+5 )) Then
          zaehler = 11 - x
          While zaehler2 < zaehler
            Spielfeld(x+zaehler2,y) = 1
            zaehler2 = zaehler2 + 1
          Wend
          Spielfeld(x,y) = 1
        EndIf
      EndIf
    Next
  Next
End Function


MfG
AMD Athlon(tm) II X2 250, 8 GB DDR, MSI MSI 770-C45, GeForce GTS 250
 

Dreamora

BeitragMo, Jun 30, 2008 17:35
Antworten mit Zitat
Benutzer-Profile anzeigen
der zweite block ist falsch da prüfst du 2x gegen x+2 aber nie gegen y.

Sicher auch dass du da +2 wolltest und nicht -1, sonst prüfst du immer nur nach rechts.
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.
  • Zuletzt bearbeitet von Dreamora am Mo, Jun 30, 2008 17:48, insgesamt einmal bearbeitet
 

bruce85

BeitragMo, Jun 30, 2008 17:45
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke Dreamora.

Ich möchte ja nur die X Felder prüfen lassen, das mit Y mache ich noch.

Ich habe mal zum testen das hier geschrieben:

Code: [AUSKLAPPEN]
Function CheckPaare()
  For f_y=0 To 11
    For f_x=0 To 11
      If Spielfeld(f_x,f_y) > 1 Then
        If Spielfeld(f_x,f_y) = Spielfeld(f_x+2,f_y)+5 Then
          Spielfeld(f_x+2,f_y) = 1
        EndIf
      EndIf
    Next
  Next
End Function


Ich prüfe zuerst nach einem vorhandenen Kugel, danach prüfe ich 2 Felder weiter nach einer kleinen Kugel mit der selben Farbe und diese müsste dann gelöscht werden, aber das tut es nicht.

Der fehler liegt nicht an diesem Code, da ich solche funktionen schon öfters geschrieben hatte und immer funktionierten.

Irgendwas ist da faul im Feld, ich habe schon alles abgesucht, leider ohne erfolg.

Edit: Wenn ich nur die Große Kugeln prüfe, dann funktioniert es PERFEKT, wenn ich noch prüfen möchte ob kleine Kugeln dazwischen sind, dann funktioniert der ganze Block nicht:

Code: [AUSKLAPPEN]
Function CheckPaare()
  For f_yy=0 To 11
    For f_xx=0 To 11
      If Spielfeld(f_xx,f_yy) > 1 Then
        If Spielfeld(f_xx,f_yy) = Spielfeld(f_xx+1,f_yy) And Spielfeld(f_xx,f_yy) = Spielfeld(f_xx+2,f_yy) Then
          Spielfeld(f_xx,f_yy) = 1
          Spielfeld(f_xx+1,f_yy) = 1
          Spielfeld(f_xx+2,f_yy) = 1
        EndIf
      EndIf
    Next
  Next
End Function


Ich Danke euch trotzdem für die Hilfe.

MfG
AMD Athlon(tm) II X2 250, 8 GB DDR, MSI MSI 770-C45, GeForce GTS 250

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group