AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi case und if-Abfragen Problem: code wird nicht abgearbeitet
Thema durchsuchen
Ansicht
Themen-Optionen

case und if-Abfragen Problem: code wird nicht abgearbeitet

Ein Thema von malo · begonnen am 10. Jan 2005 · letzter Beitrag vom 10. Jan 2005
Antwort Antwort
Benutzerbild von malo
malo

Registriert seit: 19. Sep 2004
2.115 Beiträge
 
#1

case und if-Abfragen Problem: code wird nicht abgearbeitet

  Alt 10. Jan 2005, 15:37
Ich hab wiedermal Probleme mit meinem Pong

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?

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
  Mit Zitat antworten Zitat
IngoD7

Registriert seit: 16. Feb 2004
464 Beiträge
 
Delphi 7 Enterprise
 
#2

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

  Alt 10. Jan 2005, 15:43
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 ...
  Mit Zitat antworten Zitat
Benutzerbild von malo
malo

Registriert seit: 19. Sep 2004
2.115 Beiträge
 
#3

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

  Alt 10. Jan 2005, 15:46


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

Aber jetzt geht's, danke!

//edit: wann würde der Code denn bei der anderen Version abgearbeitet werden?
  Mit Zitat antworten Zitat
Oxmyx

Registriert seit: 21. Sep 2004
499 Beiträge
 
#4

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

  Alt 10. Jan 2005, 16:21
Zitat von malo:


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

Aber jetzt geht's, danke!

//edit: wann würde der Code denn bei der anderen Version abgearbeitet werden?
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.
  Mit Zitat antworten Zitat
Benutzerbild von malo
malo

Registriert seit: 19. Sep 2004
2.115 Beiträge
 
#5

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

  Alt 10. Jan 2005, 16:26
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
  Mit Zitat antworten Zitat
Benutzerbild von dizzy
dizzy

Registriert seit: 26. Nov 2003
Ort: Lünen
1.932 Beiträge
 
Delphi 7 Enterprise
 
#6

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

  Alt 10. Jan 2005, 16:34
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 .
Fabian K.
INSERT INTO HandVonFreundin SELECT * FROM Himmel
  Mit Zitat antworten Zitat
IngoD7

Registriert seit: 16. Feb 2004
464 Beiträge
 
Delphi 7 Enterprise
 
#7

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

  Alt 10. Jan 2005, 16:53
Was redet ihr da??? (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.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:15 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