Entwickler-Ecke

Sonstiges (Delphi) - If Anweisung will nicht - es tritt immer der Else Fall auf


DonnieYen - So 07.02.10 18:33
Titel: If Anweisung will nicht - es tritt immer der Else Fall auf
Hallo,
habe nen kleines Würfelspiel geschrieben.
Dabei habe ich zwei globale Variablen deklariert.
Punkte1 für den Spieler und Punkte2 für den PC-Gegner.
Doch es tritt immer der Else Fall auf obwohl z.B. Punkte1 = 2 und Punkte2 = 0 sind.
Wo liegt hier der Fehlerteufel?


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
 if Punkte1 > Punkte2 then
      showmessage('Du hast gegen den bösen Rechner gewonnen!')
    else if Punkte1 < Punkte2 then
      showmessage('Du hast leider gegen den bösen Rechner verloren!')
        else if Punkte1 = Punkte2 then
          showmessage('Es steht Unentschieden zwischen dir und dem Rechner!')

      end;


Habe die If-Anweisung derselben Prozedur drinnen,in der auch die Würfel generiert werden.
Ist das vielleicht der Fehler?
Wo bzw. wie könnte ich die If Anweisung schöner verstecken/aktiviern lassen?

LG,
DonnieYen

PS.
Der in Sachen Delphi fleißig dazu lernt.


jaenicke - So 07.02.10 18:45

Hallo und :welcome: !

user profile iconDonnieYen hat folgendes geschrieben Zum zitierten Posting springen:
Dabei habe ich zwei globale Variablen deklariert.
Was das Problem sein könnte...
Wozu globale Variablen?

user profile iconDonnieYen hat folgendes geschrieben Zum zitierten Posting springen:
Doch es tritt immer der Else Fall auf obwohl z.B. Punkte1 = 2 und Punkte2 = 0 sind.
Wo liegt hier der Fehlerteufel?
Dass die Variablen andere Werte haben. Lass sie dir vorher ausgeben zum Test oder weise sie vorher direkt zu, dann siehst du es.

user profile iconDonnieYen hat folgendes geschrieben Zum zitierten Posting springen:
Wo bzw. wie könnte ich die If Anweisung schöner verstecken/aktiviern lassen?
Schöner? Indem du sie ordentlich formatierst, außerdem kannst du dir das letzte if im else sparen, denn was könnte es außer > oder < sonst noch sein? :zwinker:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
  if Punkte1 > Punkte2 then
    ShowMessage('Du hast gegen den bösen Rechner gewonnen!')
  else if Punkte1 < Punkte2 then
    ShowMessage('Du hast leider gegen den bösen Rechner verloren!')
  else
    ShowMessage('Es steht Unentschieden zwischen dir und dem Rechner!')
end;


DonnieYen - So 07.02.10 20:14

Hallo,
danke für deine Antwort.
Tatsächlich,den Variablen wird kein Wert zugewiesen.
Dabei ist es egal ob ich sie global oder lokal deklariere.
Muss wohl ein Denkfehler im Algorithmus sein.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
  if ((a=b) and (a=c) and (a=d) and (a=e)) or     //Fünfling
     ((b=a) and (b=c) and (b=d) and (b=e)) or
     ((c=a) and (c=b) and (c=d) and (c=e)) or
     ((d=a) and (d=b) and (d=c) and (d=e)) or
     ((e=a) and (e=b) and (e=c) and (e=d)) then  
    begin
      edSpieler1.Text:= 'Fünfling';
      Punkte1:=7;
    end                                    
  else if ...


Es wird an dieser Stelle kein Wert zugewiesen.
Ich stehe irgendwie auf dem berühmten Schlauch.


Xentar - So 07.02.10 20:15

Haltepunkt setzen (F5) und gucken, was in den Variablen drin steht.


jaenicke - So 07.02.10 20:19

user profile iconDonnieYen hat folgendes geschrieben Zum zitierten Posting springen:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
  if ((a=b) and (a=c) and (a=d) and (a=e)) or     //Fünfling
     ((b=a) and (b=c) and (b=d) and (b=e)) or
     ((c=a) and (c=b) and (c=d) and (c=e)) or
     ((d=a) and (d=b) and (d=c) and (d=e)) or
     ((e=a) and (e=b) and (e=c) and (e=d)) then  
    begin
Überlege einmal was du da tust...
Du fragst auf 5 verschiedene Arten exakt das selbe ab. Wenn alle 5 Werte gleich sind, dann sind sie es, egal wie du sie vergleichst. Deshalb kannst du dir die 4 weiteren Zeilen sparen.


DonnieYen - So 07.02.10 20:25

Ist mir grad selber aufgefallen,
habe den Fünfling als letztes eingebaut und wenn man vorher bei ner Straße alle Möglichkeiten durchgegangen ist dann hat man eine kleine Routine im Kopf.

Wenn ich statt der Variable "Punkte1" "z" verwende funktioniert es.
Dürfen also Variablen nicht lange Namen haben?


jaenicke - So 07.02.10 20:29

Das hört sich danach an als hättest du vergessen den Code in sinnvolle Teile zu unterteilen, so dass jetzt irgendwo deine Variable überschrieben wird ohne dass du es merkst...

Was passiert kann dir nur der Debugger sagen, wir ohne den restlichen Code nicht. Am Variablennamen selbst liegt es 100%ig nicht, nur an der Verwendung der Variable.


DonnieYen - So 07.02.10 20:51

Nachdem es beim Fünfling einzeln geklappt hat,
klappt es jetzt wieder nicht.

Entschuldigt - aber er ist für so ein primitives Ziel ziemlich lang und teilweise unnötig?

Gruß


jaenicke - So 07.02.10 20:56

Du setzt vor deiner if-Abfrage Punkte2 immer auf 0...

user profile iconDonnieYen hat folgendes geschrieben Zum zitierten Posting springen:
Entschuldigt - aber er ist für so ein primitives Ziel ziemlich lang und teilweise unnötig?
Ja, extrem lang, das lässt sich sicher sehr sehr viel kürzer lösen.


DonnieYen - So 07.02.10 21:02

DANKE!
Ich habe die Verbundanweisung vergessen.
Ich glaube,ich muss mir beibringen,den Quelltext vorher Zeile für Zeile genau zu lesen,bevor ich hier mit sowas ankomme.
Danke!

Da machst du mich ganz neugierig.
Doch meine Kenntnisse sind eher bescheiden - wüsste jetzt auf Anhieb nicht,wie ich den Quelltext verkürzen sollte.


jaenicke - So 07.02.10 21:08

Was bei dem sehr langen Quelltext natürlich auch nicht so leicht fällt... (also den Zeile für Zeile zu lesen)

Beispiel Straße: Eigentlich willst du nur wissen, ob a, b, c, d und e eine Permutation von 1 bis 5 bzw, 2 bis 6 enthalten. Das lässt sich in einem Bruchteil deines Codes lösen. Zum Beispiel mit einem Array statt 5 Variablen. Davon kannst du einfach eine sortierte Kopie erstellen und bist bereits quasi fertig. ;-)


DonnieYen - So 07.02.10 22:01

Tja,
Array,
bis dahin reicht mein Kenntnisstand noch nicht.
Aber ich werde mich einlesen,danke für den Tipp.


FinnO - So 07.02.10 22:28

Hier empfiehlt sich der Suche bei Google DELPHI CRASHKURS von TUFKAPL [Christian S.]