![]() |
case und if-Abfragen Problem: code wird nicht abgearbeitet
Ich hab wiedermal Probleme mit meinem Pong :duck:
Und zwar hab ich die KI für mein Pong jetzt angepasst, sodass sie auf beide Bälle reagieren kann, wobei sie nun immer auf den Ball reagieren soll, der näher dran ist. Folgender Code:
Delphi-Quellcode:
Nur irgendwie bewegt sich der Schlaeger2 nicht mehr :-?
case KI_LVL of
1: if (Ball.Top) or (Ball2.Top) <= KI_LVL1 then // wenn einer der Beiden Bälle die vordefinierter Höhe erreicht hat begin if Ball.Top < Ball2.Top then begin // der Ball ist höher als der Ball2, dann wird auf Ball reagiert if Ball.Left + Ball.Width / 2 <= Schlaeger2.Left + Schlaeger2.Width / 2 then // wenn mitte vom Ball links von der Mitte vom Schläger ist begin Schlaeger2.Left := Schlaeger2.Left - 15; // Schläger wird bewegt end; if Ball.Left + Ball.Width / 2 >= Schlaeger2.Left + Schlaeger2.Width / 2 then // Wenn die Mitte vom Ball rechts von der Mitte vom Schläger ist begin Schlaeger2.Left := Schlaeger2.Left + 15; // schläger wird bewegt end; end else begin // wenn Ball nicht höher ist als Ball2 if Ball2.Left + Ball2.Width / 2 <= Schlaeger2.Left + Schlaeger2.Width / 2 then // das gleiche oben mit Ball2 begin Schlaeger2.Left := Schlaeger2.Left - 15; // schläger wird bewegt end; if Ball2.Left + Ball2.Width / 2 >= Schlaeger2.Left + Schlaeger2.Width / 2 then // s.o. begin Schlaeger2.Left := Schlaeger2.Left + 15; // schläger wird bewegt end; end; end; Ich hab irgendwie das Gefühl, dass der Fehler in der zweiten Zeile liegt, aber wo genau? :gruebel: oder findet jemand einen anderen Fehler? Zur kleinen Erläuterung dazu: Der Code hat vorher ja wunderbar funktioniert, als ich halt noch keine Abfragen mit Ball2 drin hatte. Es muss also im Grunde irgendwie daran liegen... ;) //edit: und sry für den Titel, aber ich wusste nicht, wie ich das Problem so kurz zusammenfassen konnte :( |
Re: case und if-Abfragen Problem: code wird nicht abgearbeit
Das hier
Delphi-Quellcode:
wirst du wohl kaum so machen dürfen, sondern so:
case KI_LVL of
1: if (Ball.Top) or (Ball2.Top) <= KI_LVL1 then // wenn einer der Beiden Bälle die vordefinierter Höhe erreicht hat
Delphi-Quellcode:
case KI_LVL of
1: if (Ball.Top <= KI_LVL1) or (Ball2.Top <= KI_LVL1) then // wenn einer der Beiden Bälle ... |
Re: case und if-Abfragen Problem: code wird nicht abgearbeit
:wall:
Danke! Daran hab ich auch schon gedacht gehabt, nur kam da irgend 'ne Fehlermeldung bei einem end; "Operator nicht anwendbar" oder so... keine Ahnung, was ich da für murks gemacht hab :mrgreen: Aber jetzt geht's, danke! :) //edit: wann würde der Code denn bei der anderen Version abgearbeitet werden? :gruebel: |
Re: case und if-Abfragen Problem: code wird nicht abgearbeit
Zitat:
In C/C++ könntest du das schon schreiben:
Code:
Die Bedingung würde immer ausgeführt werden, solange Ball.Top nicht 0 und KI_LVL <= 0 wäre.
if(Ball.Top | Ball.Top <= KI_LVL1) {
... } |
Re: case und if-Abfragen Problem: code wird nicht abgearbeit
Zitat:
|
Re: case und if-Abfragen Problem: code wird nicht abgearbeit
Prinzipiell geht es ja: Die beiden Zahlen werden binär OR verknüpft. Nur ist das Ergebnis kein boolscher Wert, und somit für eine if-Abfrage ungeeignet. Da aber prinzipiell boolsche Operatoren auf nich-Booleans in if-Abfragen vorkommen könnten, kann Delphi das ja nicht kategorisch als Fehler markieren. Es könnte ja so gemeint sein wie es da steht ;).
|
Re: case und if-Abfragen Problem: code wird nicht abgearbeit
Was redet ihr da??? :gruebel: (dizzy meint übrigens sinngemäß das richtige)
Die then-Anweisung
Delphi-Quellcode:
wurde in Abhängigkeit der Werte von Ball.Top, Ball2.Top und KI_LVL1 ausgeführt, oder nicht. Die beiden Ball-Werte wurden einfach ODER-verknüpft. Das ist rechnerisch (und delphi-technisch) möglich. Es wurde somit einfach nur eine Zahl mit einer anderen verglichen.
case KI_LVL of
1: if (Ball.Top) or (Ball2.Top) <= KI_LVL1 then ... Bei Ball.Top = 2 Ball2.Top = 4 KI_LVL1 = 5 würde then nicht ausgeführt, weil 2 OR 4 gleich 6 ist --> 6 größer 5 ==> nicht ausführen. Das war auch der Fehler, dass wenn sogar beide Ball-Werte (oder auch nur einer) eigentlich unter dem Vergleichswert KI_LVL1 lagen, die Anweisung trotzdem nicht immer ausgeführt werden konnte, weil das Ergebnis der ODER-Verknüpfung über dem Vergleichswert lag. Dass Delphi sich hier nicht beschwert, ist völlig korrekt. Es war legaler Code, nur eben für den angedachten Zweck logisch falsch. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:04 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz