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: !
DonnieYen hat folgendes geschrieben : |
| Dabei habe ich zwei globale Variablen deklariert. |
Was das Problem sein könnte...
Wozu globale Variablen?
DonnieYen hat folgendes geschrieben : |
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.
DonnieYen hat folgendes geschrieben : |
| 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 ((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
DonnieYen hat folgendes geschrieben : |
Delphi-Quelltext 1: 2: 3: 4: 5: 6:
| if ((a=b) and (a=c) and (a=d) and (a=e)) or ((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...
DonnieYen hat folgendes geschrieben : |
| 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
DELPHI CRASHKURS von TUFKAPL [Christian S.]
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!