Entwickler-Ecke

Sonstiges (Delphi) - Quiz erstellen


supermann - Di 09.01.07 09:09
Titel: Quiz erstellen
Hallo!

Ich wollte aus Spass mal anfangen zu programmieren,
da ich aber bis jetzt noch gar keine Erfahrung mit Delphi habe,
wollte ich fragen, ob ihr mir da ein bissl helfen könnt...

Mein Ziel ist es ein Quiz zu erstellen (multiple choice o.ä.),
bei dem man mehrere Auswahlmöglichkeiten hat und es im Hintergrund
die richtigen Antworten zählt.

Wäre nett, wenn ihr mir helfen könntet..
Danke schon mal im vorraus!!


freedy - Di 09.01.07 10:49

Hallo!

Gute Entscheidung, dann mit Delphi anzufangen ;-).

Hier im Forum wirst du mit etwas Suchen bestimmt auf einige Ansätze stoßen. Wenn du gar keine Ahnung hast, solltest du dich vielleicht erstmal mit den Delphi-Grundlagen beschäftigen. Ohne die geht's leider nicht. Ein guter Anlaufpunkt ist da Christians Delphi Crashkurs [http://www.delphi-forum.de/viewtopic.php?t=37446].

Solltest du dann konkrete Fragen haben, kannst du sie hier gerne stellen.

Gruß


wurzel - Di 09.01.07 11:30

En Raetsdel hab ich auch schon gemacht, da kannste net viel falsch machen. Ich uppe mal meins. Man muss immer einen Level höher kommen, bei Lvl 1 ist das Zeichen "1", dann sit "2" die Antwort, dann kommt "III" und "IV" ist die antwort etc etc. Also immer das nächst höhere in der Schreibweise der Frage.

Der Link zu den Fragen ist http://www.hackme.wi-ing.net/index.php. Ich habe nur diese Fragen in ein programm zusammengefasst.


supermann - Di 09.01.07 21:10

Eigentlich wollt ich eher so etwas mit multiple choice machen..
Ich hab aber leider keine Ahnung, wie ich das anstellen soll
(ihr müsst ja kein komplettes programm reinschreiben, sondern
nur einen Ausschnitt, damit ich weiß, wie ich das mit mehreren Antwortmöglichkeiten
anstellen;))

Danke!


Shorty - Di 09.01.07 21:19

Das macht man mit einer Radiogroup, bei der du dann mit einer if-Abfrage überprüfst, ob die gegebene Antwort richtig ist, wenn du das noch nicht hinbekommst, solltest du wirklich erstmal weiter Grundlagen paucken :wink:


supermann - Mi 10.01.07 01:05

und wie mach ich das, dass der die richtigen Antworten im
Hintergrund zählt?

Muss ich dann für jede Frage ne neue Form erstellen?


Saubäär - Mi 10.01.07 01:18

Hi superman,

für jede richtige Antwort inkrmentierst (erhöhst) du eine Variable z.b.


Delphi-Quelltext
1:
2:
3:
4:
5:
var RichtigeAntworten: Integer;
begin
  IF Antwort = richtig THEN // Da muss natürlich eine gültige Bedingung rein.
   INC(RichtigeAntworten);
end;


wurzel - Mi 10.01.07 13:15

Hab mal was geschrieben, hoffe du blickst durch.


Delphi-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:
41:
42:
43:
44:
45:
46:
47:
48:
49:
procedure TForm1.Button1Click(Sender: TObject);
begin
  if (counter_btn = 0and (Radiobutton_a.Checked = True)  then    //Wenn Buttoncounter 0 und RadioButton_a aktiv ist, dann...
    begin
          counter := counter + 100;             //Geldcounter wird um 100 erhöht
          counter_btn := counter_btn + 1;       //Buttoncounter wird um 1 erhöht
    end;


  if (counter_btn = 1then
    begin
      question.Lines.Add('Sehr gut, ' + IntToStr(counter_btn) + '. Frage richtig beantwortet');
      question.Lines.Add('Frage ' + IntToStr(counter_btn) +':');
      question.Lines.Add('Blubb blubb bluber?');
      Radiobutton_a.Caption := 'A: ';
      Radiobutton_b.Caption := 'B: ';
      Radiobutton_c.Caption := 'C: ';
      Radiobutton_d.Caption := 'D: ';
      counter_btn := counter_btn + 1;
    end;

  if (counter_btn = 2and (Radiobutton_b.Checked = True)  then
    begin
          counter := counter + 100;
          counter_btn := counter_btn + 1;
    end;

{Ab hier Copy&Paste, du musst nur die Fragen und Antworten verändern}

  if (counter_btn = 3then
    begin
      question.Clear;
      question.Lines.Add('Sehr gut, ' + IntToStr(counter_btn -1) + '. Frage richtig beantwortet');
      question.Lines.Add('Frage ' + IntToStr(counter_btn) +':');
      question.Lines.Add('Blubb blubb bluber?');
      Radiobutton_a.Caption := 'A: ';
      Radiobutton_b.Caption := 'B: ';
      Radiobutton_c.Caption := 'C: ';
      Radiobutton_d.Caption := 'D: ';
      counter_btn := counter_btn + 1;
    end;

  if (counter_btn = 4and (Radiobutton_c.Checked = True)  then
    begin
          counter := counter + 100;
          counter_btn := counter_btn + 1;
    end;
{Bis hier Copy&Paste}
end;


In folgenden Zeilen musst du den Code immer deier Frage anpassen:


Delphi-Quelltext
1:
  if (counter_btn = 0and (Radiobutton_a.Checked = True)  then                    



Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
      question.Lines.Add('Sehr gut, ' + IntToStr(counter_btn) + '. Frage richtig beantwortet');
      question.Lines.Add('Frage ' + IntToStr(counter_btn) +':');
      question.Lines.Add('Blubb blubb bluber?');
      Radiobutton_a.Caption := 'A: ';
      Radiobutton_b.Caption := 'B: ';
      Radiobutton_c.Caption := 'C: ';
      Radiobutton_d.Caption := 'D: ';


jaenicke - Mi 10.01.07 13:41

Hier etwas ähnliches... http://www.delphi-forum.de/viewtopic.php?t=67142#403690
Das Beispiel macht es auch mit vielen Fragen nicht mit sehr vielen Zeilen Quelltext, weil die Fragen und Antworten als Konstanten angegeben werden.

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
type
  TQuestion = record
    Question: string;
    Answers: string;
  end;

const
  Questions: array[0..1of TQuestion = (
    (Question: 'Frage 1'; Answers: 'Antwort 1.1'#13#10'Antwort 1.2'#13#10'Antwort 1.3'),
    (Question: 'Frage 2'; Answers: 'Antwort 2.1'#13#10'Antwort 2.2'#13#10'Antwort 2.3'));


Delphi-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:
procedure TForm44.FormCreate(Sender: TObject);
begin
  UpdateDisplay;
end;

procedure TForm44.UpdateDisplay;
begin
  rgQuestion.Caption := Questions[rgQuestion.Tag].Question;
  rgQuestion.Items.Text := Questions[rgQuestion.Tag].Answers;
end;

procedure TForm44.btnBackClick(Sender: TObject);
begin
  if rgQuestion.Tag > 0 then
  begin
    rgQuestion.Tag := rgQuestion.Tag - 1;
    UpdateDisplay;
  end;
end;

procedure TForm44.btnNextClick(Sender: TObject);
begin
  if rgQuestion.Tag < High(Questions) then
  begin
    rgQuestion.Tag := rgQuestion.Tag + 1;
    UpdateDisplay;
  end;
end;

Eine variable Anzahl von Antworten geht natürlich auch.


supermann - Do 11.01.07 21:09

Danke erst einmal für die Antworten, aber ich hab jetzt ein Problem:
Ich hab schon bevor ihr geantwortet habt, angefangen zu schreiben
und hab jetzt eine form, wo 3 radiobuttons drauf sind und wenn man
die jeweils Richtige angeglickt hat, erscheint in einer
neuen Form "Richtig", ansonsten falsch.

Dann kann man auf einen "weiter" button klicken und es öffnet sich eine neue
Form, wo die nä Frage drinsteht.

Da ich bei ein haufen Fragen, dann auch ein Haufen Formen machen müsste, würde das
ewig dauern..

Da ich aber leider durch den ersten Quelltext nich so richtig durchsehe (ka,
was mit question.Lines.Add gemeint ist, zeigt mir nen fehler an)

und bei dem zweiten müsste ich ja das ganze mit den Radio Buttons ändern..

Wie kann ich also am besten mein Prog ändern, ohne dass ich ein haufen
Formen nehme und nich mein ganzes geschriebenes löschen muss?

Danke!!


jaenicke - Do 11.01.07 21:23

user profile iconsupermann hat folgendes geschrieben:
Wie kann ich also am besten mein Prog ändern, ohne dass ich ein haufen
Formen nehme und nich mein ganzes geschriebenes löschen muss?

Naja, dazu müsstest du dein aktuelles Programm mal hier als Anhang posten, sonst können wir solch eine Frage nicht beantworten...

Am einfachsten wäre allerdings mein Vorschlag. Das sind ja nur die paar Zeilen, die ich in meinem Beitrag auch gepostet habe! Da fehlt ja eigentlich nur noch die Auswertung, ob eine Frage richtig oder falsch beantwortet wurde.
Dazu müsstest du ja nur den record um die korrekte Antwort erweitern:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
type 
  TQuestion = record 
    Question: string
    Answers: string
    CorrectAnswer: byte;
  end;

CorrectAnswer müsstest du dann natürlich auch bei den Konstanten korrekt initialisieren.

Und damit der User nicht dauernd "Ok" klicken muss, könntest du die Auswertung der jeweils letzten Frage ja ganz oben im Formular über der nächsten anzeigen... ;-)


wurzel - Do 11.01.07 21:42

user profile iconsupermann hat folgendes geschrieben:

Da ich aber leider durch den ersten Quelltext nich so richtig durchsehe (ka,
was mit question.Lines.Add gemeint ist, zeigt mir nen fehler an)


question.Lines.Add --> Das Memo-Feld heißt question. In diesem Schritt wird einfach nur eine neue Zeile im Memofeld geschrieben