![]() |
Multiple Choice Quiz--> Antwort-Positionen zufällig auswählen
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo Forum,
ich versuche einen Multiple Choice-Quiz mit Delphi 4 zu programmieren. Ich habe schon die Fragen, die Antwortmöglichkeiten und die richtigen Antworten mit Hilfe von Feldern hingeschrieben und wenn man auf den 'weiter' Button drauf klickt kommt man zur nächsten Frage mit die jeweiligen Antwortmöglichkeiten (4), die ich im laufendem Programm mit Checkboxen erzeugt habe. Diese Antworten haben bei jeder Frage aber immer die selbe Position. Zum Beispiel der richtige Antwort ist immer bei der ersten Checkbox zu sehen und das möchte ich ändern. Ich möchte also,dass jedes mal wenn man auf den 'weiter' Button klickt die Antworten ihre Positionen ändern. Wie kann ich das nun anstellen? Im Anhang befindet sich ein Bild wie das Programm ausschaut ! Danke im Voraus! Lg, AquaMari und unten ist der Quell-Code:
Delphi-Quellcode:
unit Unit1;
interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls; type TForm1 = class(TForm) GroupBox1: TGroupBox; Button1: TButton; Button2: TButton; Panel1: TPanel; Label1: TLabel; ListBox1: TListBox; procedure FormCreate(Sender: TObject); procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure GroupBox1Click(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; check:array[1..4] of Tcheckbox; fragen : array [1..4] of string; antworten : array [1..16] of string; r_antworten : array [1..7] of string; i,frage:integer; implementation {$R *.DFM} procedure TForm1.FormCreate(Sender: TObject); var i,b:integer; begin b:=0; frage:=0; fragen[1]:='1. Zu welchem großen Reich gehörte Österreich ab dem Jahre Null fast 500 Jahre lang?'; fragen[2]:='2. Die Staatsgebiete welcher heutigen Staaten geho¨rten im Laufe der Geschichte zeitweise zum Kaiserreich Österreich?'; fragen[3]:='3. Welche der Religionen waren 1918 (Ende der Monarchie) in Österreich-Ungarn offiziell anerkannt?'; fragen[4]:='4. Wer wurde nach dem "Anschluss" von Österreich an Hitler-Deutschland verfolgt?'; antworten[1]:='Zum Römischen Reich'; antworten[2]:='Zum Ägyptischen Reich'; antworten[3]:='Zum Chinesischen Reich'; antworten[4]:='Zum Persischen Reich'; antworten[5]:='Slowakei'; antworten[6]:='Kroatien'; antworten[7]:='Ungarn'; antworten[8]:='Finnland'; antworten[9]:='Konfuzianismus'; antworten[10]:='Islam'; antworten[11]:='Judentum'; antworten[12]:='Buddhismus'; antworten[13]:='Juden'; antworten[14]:='Roma und Sinti'; antworten[15]:='Menschen mit Behinderung'; antworten[16]:='Nationalsozialisten'; r_antworten[1]:='Zum Römischen Reich'; r_antworten[2]:='Slowakei'; r_antworten[3]:='Kroatien'; r_antworten[4]:='Ungarn'; r_antworten[5]:='Islam'; r_antworten[6]:='Juden'; r_antworten[7]:='Menschen mit Behinderung'; groupbox1.caption:=fragen[1]; For i:=1 to 4 do begin check[i]:=Tcheckbox.Create(self); check[i].left:=40; check[i].top:=35+b; check[i].width:=450; check[i].height:=40; check[i].font.size:= 12; check[i].parent:=groupbox1; b:=b+60; end; check[1].caption:=antworten[1]; check[2].caption:=antworten[2]; check[3].caption:=antworten[3]; check[4].caption:=antworten[4]; end; procedure TForm1.Button1Click(Sender: TObject); begin button2.visible:=false; for i:=1 to 4 do begin check[i].color:=clwhite; check[i].checked:=false; end; frage:=frage+1; panel1.caption:=inttostr(frage)+' / 4'; case frage of 1: groupbox1.caption:=fragen[2]; 2: groupbox1.caption:=fragen[3]; 3: groupbox1.caption:=fragen[4]; end; case frage of 1: begin check[1].caption:=antworten[5]; check[2].caption:=antworten[6]; check[3].caption:=antworten[7]; check[4].caption:=antworten[8]; end; 2: begin check[1].caption:=antworten[9]; check[2].caption:=antworten[10]; check[3].caption:=antworten[11]; check[4].caption:=antworten[12]; end; 3: begin check[1].caption:=antworten[13]; check[2].caption:=antworten[14]; check[3].caption:=antworten[15]; check[4].caption:=antworten[16]; end; end; end; procedure TForm1.Button2Click(Sender: TObject); var i:integer; begin if groupbox1.caption=fragen[1] then begin for i:=1 to 4 do if check[i].caption=r_antworten[1] then check[i].color:=clgreen; end; if groupbox1.caption=fragen[2] then begin for i:=1 to 4 do if (check[i].caption=r_antworten[2]) or (check[i].caption=r_antworten[3]) or (check[i].caption=r_antworten[4])then check[i].color:=clgreen; end; if groupbox1.caption=fragen[3] then begin for i:=1 to 4 do if check[i].caption=r_antworten[5] then check[i].color:=clgreen; end; if groupbox1.caption=fragen[4] then begin for i:=1 to 4 do if (check[i].caption=r_antworten[6]) or (check[i].caption=r_antworten[7]) then check[i].color:=clgreen; end; end; procedure TForm1.GroupBox1Click(Sender: TObject); begin button2.visible:=true; end; |
AW: Multiple Choice Quiz--> Antwort-Positionen zufällig auswählen
Dazu braucht man eine Routine die 4 Zufallszahlen berechnet, zum Beispiel so:
Delphi-Quellcode:
type
TFourIntegers = array [1..4] of integer; function GetFourRandoms: TFourIntegers; var List: TList; I, Index: integer; begin List := TList.Create; try for I := 1 to 4 do List.Add(Pointer(I)); for I := 1 to 4 do begin Index := Random(List.Count); Result[I] := Integer(List[Index]); List.Delete(Index); end; finally List.Free end; end; procedure TForm1.Button4Click(Sender: TObject); var A: TFourIntegers; begin A := GetFourRandoms; ShowMessage(Format('%d %d %d %d', [A[1], A[2], A[3], A[4]])); end; procedure TForm1.FormCreate(Sender: TObject); begin Randomize; end; |
AW: Multiple Choice Quiz--> Antwort-Positionen zufällig auswählen
ok aber ich verstehe diesen Teil nicht ganz :
procedure TForm1.Button4Click(Sender: TObject); var A: TFourIntegers; begin A := GetFourRandoms; ShowMessage(Format('%d %d %d %d', [A[1], A[2], A[3], A[4]])); end; Ich habe nämlich ein Feld von Checkboxen und bei die muss ich eben die Captions zu die jeweiligen Antworten ändern. Was ist also mit A hier gemeint und mit die Zahlen in eckigen Klammern ? Wie muss ich das jetzt mit meinen Checkboxen hinschreiben?? Lg, AquaMari |
AW: Multiple Choice Quiz--> Antwort-Positionen zufällig auswählen
A ist eine Variable, wo 4 Integer reinpassen, für die 4 möglichen Antworten.
Selber Vorschlag, nur bissl Anders.
oder
oder
oder oder oder eine der tausend anderen Lösungen, welche am Ende alle auf eine der beiden Lösungswege hinausgehen (liste mischen und abarbeiten /// liste per zufall auslesen und merken was schon weg ist) |
AW: Multiple Choice Quiz--> Antwort-Positionen zufällig auswählen
Ich habe das mit A schon verstanden und habe es dann probiert und es hat geklappt :D
Vielen Dank an Bjoerk ! :D Danke dir auch Himitsu :thumb: :D |
AW: Multiple Choice Quiz--> Antwort-Positionen zufällig auswählen
Wo wir aber schon dabei sind habe ich jetzt eine andere Frage.
Ich möchte ja zum Schluss ein Ergebnis von diesem Quiz zeigen. Also dass ich dann zum Schluss angebe wie viele Fragen man richtig beantwortet hat. Und ich möchte also, dass nur wenn man die richtige Antwort oder die richtige Antworten angekreuzt (checked) hat (da auch mehrere Antworten richtig sein können) und die falschen eben nicht angekreuzt hat, einen Punkt bekommt und ansonsten nicht. Also ich habe hier ein Procedure mit druecken (checkbox[i].onclick) und da habe ich schon was hingeschrieben(da werden bei mir eben die richtigen Antworten nicht richtig zusammengezählt): unten seht ihr den Quell-Code Wie kann ich das jetzt hinbekommen ? Danke im Voraus Lg, AquaMari
Delphi-Quellcode:
procedure Tform1.druecken; var i:integer; begin if groupbox1.caption=fragen[1] then for i:=1 to 4 do if check[i].caption=r_antworten[1] then richtige_A:=richtige_a+1 else richtige_a:=richtige_a; if groupbox1.caption=fragen[2] then for i:=1 to 4 do if (check[i].caption=r_antworten[2]) and (check[i].caption=r_antworten[3]) and (check[i].caption=r_antworten[4]) then richtige_A:=richtige_a+1 else richtige_a:=richtige_a; if groupbox1.caption=fragen[3] then for i:=1 to 4 do if check[i].caption=r_antworten[5] then richtige_A:=richtige_a+1 else richtige_a:=richtige_a; if groupbox1.caption=fragen[4] then for i:=1 to 4 do if (check[i].caption=r_antworten[6]) and (check[i].caption=r_antworten[7]) then richtige_A:=richtige_a+1 else richtige_a:=richtige_a; |
AW: Multiple Choice Quiz--> Antwort-Positionen zufällig auswählen
Wenn man solche Abfrage-Orgien schreiben muss, sollte man sich vielleicht eine alternative Lösung ausdenken. So könnte man eine Liste von Strukturen (Records oder Klassen) verwalten, die
- die Frage - die möglichen Antworten - den Index der richtigen Antwort beinhalten. Da ich davon ausgehe, dass es je Frage nur eine richtige Antwort gibt, sind Checkboxen nicht die optimale Wahl. Besser wäre eine Radiogroup, die über die Items-Eigenschaft befüllt und über die ItemIndex-Eigenschaft ausgewertet wird. Dann kann man nämlich den ItemIndex mit dem "richtige Antwort"-Index der o.a. Struktur vergleichen. Beispiele sollten sich im Forum unter "Wer wird Millionär" oder ähnlichen Suchbegriffen finden lassen. |
AW: Multiple Choice Quiz--> Antwort-Positionen zufällig auswählen
Zitat:
Zitat:
Deine Vermutung widerspricht der Aussage von AquaMari im Post über Deinem. |
AW: Multiple Choice Quiz--> Antwort-Positionen zufällig auswählen
Delphi-Quellcode:
Schau Dir einmal diese Zeile an:if groupbox1.caption=fragen[4] then for i:=1 to 4 do if (check[i].caption=r_antworten[6]) and (check[i].caption=r_antworten[7]) then richtige_A:=richtige_a+1 else richtige_a:=richtige_a;
Delphi-Quellcode:
Das kann nicht funktionieren, da check[i] nicht gleichzeitig zwei verschiedene Antworten haben kann.
if (check[i].caption=r_antworten[6]) and (check[i].caption=r_antworten[7]) then
Aussedem kannst Du den else-Teil weglassen. Wenn Du dieses System beibehalten wolltest, dann müsstest Du für jede richtige Antwortmöglichkeit eine Schleife durchlaufen. |
AW: Multiple Choice Quiz--> Antwort-Positionen zufällig auswählen
Und wie kann ich das hinkriegen wenn ich das außerhalb der Procedure checkbox.onclick hinschreibe??
Wie löse ich nun die Aufgabe?? nochmal zur info: ich möchte das nur wenn man die richtige Antwort oder Antworten angekreuzt hat einen Punkt bekommt. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:32 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz