| Autor |
Beitrag |
01Detlef
      
Beiträge: 85
|
Verfasst: Mo 09.12.02 19:19
hallo,
ich bin dabei, ein kleines quiz zu proggen und nun möchte ich, dass man zwei versuche hat, wie kann ich das machen?
mein programm ist mit 4Labels, einem Button und einem editfeld ausgestattet! in das editfeld kann man a-d eingeben und wenn edit1.text gleich z.B a ist und das richtig ist, kommt die nächste frage!
Jetzt soll man halt zwei versuche haben und erst beim 3 von neu anfangen!
Mein Vorschlag:(wahrscheinlich vollkommen falsch*G*)
Quelltext 1: 2: 3: 4: 5: 6: 7:
| Versuche:=2 REPEAT form1.show UNTIL versuche:=2; IF versuche>2 then form1.close; IF versuche<=2 then showmessage('toll'); |
Das Problem ist jetzt nur, wie mache ich das, dass er "Versuche" gebraucht, um form1 nochmal anzuziegen? Was ist alles falsch an meiner Idee?
|
|
Christian S.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: Mo 09.12.02 22:37
Ich muss Dir leider bestätigen, dass Dein Ansatz vollkommen falsch ist.
| Zitat: | Quelltext 1: 2:
| REPEAT form1.show UNTIL versuche:=2; | |
Hier stecken schon zwei Fehler drin:
1. Da wird gar keine Benutzereingabe erwartet.
2. (Ich gehe davon aus, dass es "=" und nicht ":=" heissen sollte.) Die Variable "Versuche" wird überhaupt nicht geändert, eine Überprüfung ist sinnlos. Da Du "Versuche" vorher auf 2 setzt, wird sie jedesmal genau einmal ausgeführt.
Nun zu den IF-Abfragen.
Allgemein:
Da Du "Versuche" gar nicht änderst ist es nicht sinnvoll eine Abfrage zu machen.
speziell zu 2: Es ist vielleicht nicht wirklich gut, das Programm zu beenden, wenn jemand zwei falsche Antworten gegeben hat.
So, nun eine kleine Anleitung, wie Du es richtig machen kannst:
1. Sobald eine neue Frage angezeigt wird, setzt Du in einem Rutsch direkt auch mal die Variable Versuche auf 0. Denn der Benutzer hat ja noch keine Antwort auf diese (neue) Frage gegeben, hatte also Null Versuche. Die Variable sollte global deklariert sein, damit alle Prozeduren / Funktionen Zugriff darauf haben.
2. Du möchtest, jedes mal wenn der Benutzer einen Eingabe getätigt hat, abfragen, ob diese richtig ist oder nicht, und entsprechende Aktionen ausführen. Geben wir dem Benutzer die Chance, seine Eingabe so oft zu ändern wie er will, bis er sie abschickt und stellen ihm eine Button "OK" zu verfügung, den er drücken soll, wenn er meint die Antwort wäre richtig.
3. Wenn er also "OK" drückt (OnClick), überprüfst du den Inhalt von edit1. Dieser ist entweder falsch oder richtig.
Ist er richtig, wird die neue Frage angezeigt, "Versuche" wieder (in einem Rutsch) auf Null gesetzt usw.
Ist die Antwort falsch, wird "Versuche" um eins erhöht und eine Meldung ausgegeben.
Dann musst Du noch prüfen, ob das vielleicht schon sein zweiter Versuch war, dann müsste "Versuche" nun den Wert 2 beinhalten. War das schon sein zweiter Versuch, kannst Du das Spiel beenden (fände ich nicht so toll), ihm Punkte abziehen oder was Du auch immer für richtig hälst.
So, dass sollte als Anleitung erst einmal genügen. Hoffe ich.
MfG,
Peter
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
Wolff68
      
Beiträge: 302
Erhaltene Danke: 1
WinXP home
D6 Prof
|
Verfasst: Mo 09.12.02 22:46
Ich wusste ja, daß der Monitor das Bild immer wieder neu aufgebauen muß, aber ein Formular?
Mit Form1.Show zeigst Du das Formular an. Und das bleibt solange da bis Du es zumachst. (Mit Form.Close zB)
Alles was Du in Delphi machen musst, ist auf Aktionen reagieren.
Der Benutzer schreibt seine Lösung in das Edit und klickt der Einfachheit halber danach auf Button1.
Dann prüfst Du im Onclick-Ereignis des Buttons, ob das richtig war oder nicht. Soweit so gut.
Jetzt solltest Du Dir noch irgendwo merken wie oft er daneben gelegen hat. Also oben eine Globale Variable definieren und diese möglichst noch vor der ersten Frage auf 2 setzen.
Wenn die Frage richtig war gehst Du die nächste Frage anzeigen und setzt den Zähler wieder auf 2.
War sie falsch ziehst Du von der 2 eins ab und prüfst danach ob sie jetzt 0 ist. Wenn sie 0 ist, dann 'Game Over', sonst weiter. Von mir aus kannst bei 'Game Over' dann auch Dein Programm beenden, wobei es netter wäre den Benutzer zumindest mit einem ShowMessage('GAME OVER'); darauf hinzuweisen.
Probier mal ob Du das hinbekommst.
_________________ "Der Mensch ist nicht was er sich vorstellt oder wünscht zu sein, sondern das was andere in ihm sehen."
|
|
Christian S.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: Mo 09.12.02 22:49
Okay, okay, ich gebe zu: meine Antwort war ein bisschen zu ausführlich ...
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
Wolff68
      
Beiträge: 302
Erhaltene Danke: 1
WinXP home
D6 Prof
|
Verfasst: Mo 09.12.02 22:50
Aber vielleicht besser zu verstehen als meine,...

_________________ "Der Mensch ist nicht was er sich vorstellt oder wünscht zu sein, sondern das was andere in ihm sehen."
|
|
Christian S.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: Mo 09.12.02 22:51
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
01Detlef 
      
Beiträge: 85
|
Verfasst: Di 10.12.02 16:13
Vielen Dank, aber ich komme nicht weiter, wenn ich versuche+1 habe, ich muss doch irgendwie eine Schleife aufbauen oder?
Quelltext 1: 2: 3: 4: 5: 6: 7:
| Versuche:=0; IF edit1.text='a' THEN form2.show ELSE showmessage('falsch, noch ein Versuch'); versuche:=versuche+1; END; |
Ich muss das ganze doch nochmal durchlaufen lassen, wenn edit1.text nicht a ist!! Solange bis versuche gleich 2 ist und dann soll alles von vorne anfangen! Vielleicht mit einer For-Schleife, so dass Versuche+1 bespeichert wird und nochmal der Versuch gestartet wird? Oder geht das auch anders? (repeat-schleife, weil edit1.text doch die Eingabe ist und dieses wiederholen bis versuche gleich 2 ist oder so??)
Danke Detlef
Danke Detlef
|
|
Christian S.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: Di 10.12.02 16:27
Im Grunde genommen hast Du ja eine versteckte Schleife: das OnClick-Ereignis des Buttons, den der Benutzer drückt, wenn er seine Antwort abgibt. Denn das, was in diesem Ereignis an Code drin steht, wird ja mehrmals ausgeführt (jedesmal, wenn der Button gedrückt wird).
Bis auf das "versuche:=0" kommt der von die gepostete Code in das OnClick-Ereignis. Am Ende musst Du allerdings dann noch prüfen, ob versuche=2 ist, damit Du das Spiel beenden kannst, wenn zwei falsche Antworten gegeben worden sind.
Das "versuche:=0" solltest Du immer nur dann aufrufen, wenn eine neue Frage gezeigt wird.
MfG,
Peter
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
a.C.k
      
Beiträge: 93
WIN 2000
Delphi 6 Enterprise ; Delphi 7 Studio
|
Verfasst: Di 10.12.02 16:44
Wenn ich dein Problem richtig verstehe, dann brauchst du keine Schleife.
Du möchtest doch abwarte, was der Benutzer antwortet, oder?
Also, einen Wert eingibt.
Dann reagierst du auf den Wert...
Wenn du eine Schleife nimmst, und erhöhst bei jeder falschen antwort versuche um 1, dann hat der Benutzer ja gar keine Zeit zu antworten.
#Delphi ist (wie schon gesagt wurde) eine ereignisorientierte Sprache.
Die Ereignisse einer Komponente findest du im Objektinspektor neben den Eigenschafften auf der rechten seite.
Also wenn der Benutzer eine Antwort schreibt, reicht es z.B. bei einem Buton Click einmal nachzuschauen, ob es die Richtige Antort war...
Also:
Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| IF Antwort = richtig THEN begin Versuche := 0; nächste Frage; end ELSE begin IF Versuche <3 THEN begin showmesage('leider Falsch....') Versuche := Versuche +1 ; //bzw. INC(Versuche) end ELSE begin showmessage('Game Over.....'); Close; end; end; |
Du fragst ja immer nur ab, ob er dieses eine mal die richtige Antwort gegeben hat, nicht permanent. Deshalb benötigst du uch keine Schleife.
diese ganze Prozedure wird ja jedesmal durchlaufen, wenn du den Button drückst.
_________________ Wer nicht gerne denkt, sollte wenigstens von Zeit zu Zeit seine Vorurteile neu gruppieren.
|
|
01Detlef 
      
Beiträge: 85
|
Verfasst: Di 10.12.02 19:20
Also vielen Dank, ich hatte den fehler gemacht, dass der Button eine Schleife ist!
Aber der Quelltext von a.C.K ermöglicht mir nur eine Antwort, das gleiche Problem hatte ich auch! Nach dem ersten Versuch zeigt er showmessage('Game Over') und das Programm beginnt von vorne!!!
Wieso????
Danke Detlef
|
|
Christian S.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: Di 10.12.02 19:25
In a.C.k.'s Quelltext kann ich da nichts erkennen. Poste doch mal Deinen Quelltext. Der vom Button sollte reichen.
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
01Detlef 
      
Beiträge: 85
|
Verfasst: Di 10.12.02 20:16
Ich meine ja, a.c.k's Quelltext, wenn ich das compiliere, habe ich nur einen Versuch, nicht zwei! Wieso ist das so, der soll doch solange wiederholen, wie <3 gilt????
Meinen Quelltext, brauch ich nicht texten, weil das gleiche Problem ist und ein wenig unstrukturierter aufgebaut ist!!
Danke Detlef
|
|
Christian S.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: Di 10.12.02 20:21
Der hier gepostete Quelltext kann ja aber nicht der komplette sein. Folgende Fragen:
1. Wie initialisierst Du "versuche" (bevor der Nutzer das erste Mal auf den Button gedrückt hat)?
2. Wie ermittelst Du, was "antwort" für einen Wert hat?
3. fällt mir nicht ein
MfG,
Peter
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
01Detlef 
      
Beiträge: 85
|
Verfasst: Di 10.12.02 20:26
also
1) versuche hab ich als Integer deklariert und sonst so wie in dem Code!
2)für Antwort habe ich edit1.text eingesetzt!
Detlef
|
|
Christian S.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: Di 10.12.02 20:46
So sieht's bei mir aus und es funktioniert:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34:
| var Form1: TForm1; versuche: Integer;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject); begin versuche:=0; end;
procedure TForm1.Button1Click(Sender: TObject); VAR antwort : STRING; begin Antwort:=edit1.text; IF Antwort = 'a' THEN begin Versuche := 0; ShowMessage('Jetzt käme die nächste Frage'); end ELSE begin IF Versuche <3 THEN begin showmessage('leider Falsch....'); Versuche := Versuche +1 ; //bzw. INC(Versuche) end ELSE begin showmessage('Game Over.....'); Close; end; end; end; |
MfG,
Peter
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
01Detlef 
      
Beiträge: 85
|
Verfasst: Mi 11.12.02 16:27
also, meine Fragen:
1)sagen wir mal, ich möchte nur eine Frage machen (*blödsinn,aber mal angenommen*);
dann kann ich doch auch
Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23:
| procedure TForm1.Button1Click(Sender: TObject);
VAR antwort : STRING; versuche:INTEGER; begin Antwort:=edit1.text; IF Antwort = 'a' THEN begin Versuche := 0; ShowMessage('Jetzt käme die nächste Frage'); end ELSE begin IF Versuche <3 THEN begin showmessage('leider Falsch....'); Versuche := Versuche +1 ; //bzw. INC(Versuche) end ELSE begin showmessage('Game Over.....'); Close; end; end; end; |
wieso muss Antort:=edit1.text vorher zugewiesen werden, warum nicht
if edit1.text='' then..
Quelltext 1: 2: 3: 4:
| procedure TForm1.FormCreate(Sender: TObject); begin versuche:=0; end; |
kann ich das weglassen, wenn nur eine Frage sein soll?
Das sagt doch, dass nach formcreate versuche immer 0 ist oder?
Danke Detlef
|
|
a.C.k
      
Beiträge: 93
WIN 2000
Delphi 6 Enterprise ; Delphi 7 Studio
|
Verfasst: Mi 11.12.02 16:38
Weglassen würde ich es nicht, da es ansonsten sein kann, dass Versuch irgendwelche Zufallswerte bekommt.
Muss nicht zwingend im Form.Create Ereignis stehen. Kannst genau so gut woanders uf Null setzten. (z.B. Neues Spiel, oder so..)
zu frage 1.
Die Variable "Antwort" kannst du dir Sparen. Macht das ganze aber übersichtlicher. Natürlich kannst du auch Antwort durch Edit1.text ersetzen...
_________________ Wer nicht gerne denkt, sollte wenigstens von Zeit zu Zeit seine Vorurteile neu gruppieren.
|
|
01Detlef 
      
Beiträge: 85
|
Verfasst: Mi 11.12.02 16:44
also, ich habe deinen quelltext genauso abgeschrieben (nur das form.dreate da nicht) und nun habe ich unendlich viele Versuche!!
Kann das sein, wenn ich einmal falsch klicke versuche+1 im speicher nicht gespeichert wird und nun immer wieder von versuche:=0 begonnen wird? Dadurch habe ich ja unendlich viele versuche!!
Aber wieso hat es bei dir geklappt? Ich möchte zwei Versuche!!
Danke Detlef
|
|
a.C.k
      
Beiträge: 93
WIN 2000
Delphi 6 Enterprise ; Delphi 7 Studio
|
Verfasst: Mi 11.12.02 17:05
Habe das nicht Programmiert sondern nur so aufgeschrieben.
She jetzt den Fehler (glaube ich zumindest...).
Nehme mal versuche aus der Deklaration der Prozdeure raus und mach ne Globale Variable daraus.
dann sollte es klappen.
Form.Create solltest du aber auch noch einbauen.
_________________ Wer nicht gerne denkt, sollte wenigstens von Zeit zu Zeit seine Vorurteile neu gruppieren.
|
|
01Detlef 
      
Beiträge: 85
|
Verfasst: Do 12.12.02 17:12
Also ihr dürft mich nicht fragen wieso, aber nun habe ich ein wenig ausprobiert und getestet und es läuft!!!!!*G* Total seltsam aber es läuft
guck euch das an:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40:
| var Form1: TForm1; Versuche:Integer; implementation
uses Frage2;
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject); begin Versuche:=0; end;
procedure TForm1.Button1Click(Sender: TObject); var antwort: STRING; begin Antwort:=edit1.text; IF Antwort = 'a' THEN begin Versuche := 0; Form2.show; end ELSE begin IF Versuche <1 THEN begin showmessage('leider Falsch....'); Versuche := Versuche +1 ; //bzw. INC(Versuche) end ELSE
IF Versuche >= 1 THEN BEGIN showmessage('Game Over.....'); form1.close; end; end; end;
end. |
Jetzt habe ich zwei versuche!! aber warum versuche >= 1?? Nur so läuft es, dass ich 2 versuche habe!1 Komisch! kann mir das noch einer erklären, dann ist das Thema abgegehakt!!
Danke Detlef
|
|