Autor Beitrag
01Detlef
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 85



BeitragVerfasst: 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*)


ausblenden 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.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Mo 09.12.02 22:37 
Ich muss Dir leider bestätigen, dass Dein Ansatz vollkommen falsch ist.
Zitat:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 302
Erhaltene Danke: 1

WinXP home
D6 Prof
BeitragVerfasst: Mo 09.12.02 22:46 
Ich wusste ja, daß der Monitor das Bild immer wieder neu aufgebauen muß, aber ein Formular? :wink:

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.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 302
Erhaltene Danke: 1

WinXP home
D6 Prof
BeitragVerfasst: Mo 09.12.02 22:50 
Aber vielleicht besser zu verstehen als meine,...
:beer:

_________________
"Der Mensch ist nicht was er sich vorstellt oder wünscht zu sein, sondern das was andere in ihm sehen."
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Mo 09.12.02 22:51 
:beer:

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
01Detlef Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 85



BeitragVerfasst: 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?


ausblenden 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.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 93

WIN 2000
Delphi 6 Enterprise ; Delphi 7 Studio
BeitragVerfasst: 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:
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 85



BeitragVerfasst: 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.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 85



BeitragVerfasst: 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.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 85



BeitragVerfasst: 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.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Di 10.12.02 20:46 
So sieht's bei mir aus und es funktioniert:

ausblenden volle Höhe Quelltext
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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 85



BeitragVerfasst: 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
ausblenden 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..

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 93

WIN 2000
Delphi 6 Enterprise ; Delphi 7 Studio
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 85



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 93

WIN 2000
Delphi 6 Enterprise ; Delphi 7 Studio
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 85



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

ausblenden volle Höhe Quelltext
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