Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi case und if-Abfragen Problem: code wird nicht abgearbeitet (https://www.delphipraxis.net/37785-case-und-if-abfragen-problem-code-wird-nicht-abgearbeitet.html)

malo 10. Jan 2005 15:37


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:
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;
Nur irgendwie bewegt sich der Schlaeger2 nicht mehr :-?

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 :(

IngoD7 10. Jan 2005 15:43

Re: case und if-Abfragen Problem: code wird nicht abgearbeit
 
Das hier
Delphi-Quellcode:
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
wirst du wohl kaum so machen dürfen, sondern so:
Delphi-Quellcode:
case KI_LVL of
      1: if (Ball.Top <= KI_LVL1) or (Ball2.Top <= KI_LVL1) then // wenn einer der Beiden Bälle ...

malo 10. Jan 2005 15:46

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:

Oxmyx 10. Jan 2005 16:21

Re: case und if-Abfragen Problem: code wird nicht abgearbeit
 
Zitat:

Zitat von malo
: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:

Geht nicht, denn in Delphi akzeptiert die if-Anweisung ausschließlich Bool-Werte, keine Zahlen (wie Ball.Top).
In C/C++ könntest du das schon schreiben:
Code:
if(Ball.Top | Ball.Top <= KI_LVL1) {
  ...
}
Die Bedingung würde immer ausgeführt werden, solange Ball.Top nicht 0 und KI_LVL <= 0 wäre.

malo 10. Jan 2005 16:26

Re: case und if-Abfragen Problem: code wird nicht abgearbeit
 
Zitat:

Zitat von Oxmyx
Geht nicht, denn in Delphi akzeptiert die if-Anweisung ausschließlich Bool-Werte, keine Zahlen (wie Ball.Top).

ist aber blöd, dass Delphi da nichtmal 'ne Fehlermeldung ausspuckt, wenn es sowieso nicht geht :wall:

dizzy 10. Jan 2005 16:34

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 ;).

IngoD7 10. Jan 2005 16:53

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:
case KI_LVL of
      1: if (Ball.Top) or (Ball2.Top) <= KI_LVL1 then ...
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.


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 06:49 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz