And und Or Verknüpfung funktioniert nicht richtig
Übersicht

bruce85Betreff: And und Or Verknüpfung funktioniert nicht richtig |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Benutz Klammern dann geht es.
a=b and b or c ist was anderes als (a=b) and (B or c) ![]() 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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group