AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Multiple Choice Quiz--> Antwort-Positionen zufällig auswählen

Multiple Choice Quiz--> Antwort-Positionen zufällig auswählen

Ein Thema von AquaMari · begonnen am 23. Apr 2015 · letzter Beitrag vom 1. Mai 2015
Antwort Antwort
Seite 1 von 2  1 2   
AquaMari

Registriert seit: 23. Apr 2015
7 Beiträge
 
Delphi 4 Standard
 
#1

Multiple Choice Quiz--> Antwort-Positionen zufällig auswählen

  Alt 23. Apr 2015, 19:18
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;
Miniaturansicht angehängter Grafiken
unbenannt.jpg  
  Mit Zitat antworten Zitat
Bjoerk

Registriert seit: 28. Feb 2011
Ort: Mannheim
1.384 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: Multiple Choice Quiz--> Antwort-Positionen zufällig auswählen

  Alt 24. Apr 2015, 00:21
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;
  Mit Zitat antworten Zitat
AquaMari

Registriert seit: 23. Apr 2015
7 Beiträge
 
Delphi 4 Standard
 
#3

AW: Multiple Choice Quiz--> Antwort-Positionen zufällig auswählen

  Alt 24. Apr 2015, 16:19
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
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.151 Beiträge
 
Delphi 12 Athens
 
#4

AW: Multiple Choice Quiz--> Antwort-Positionen zufällig auswählen

  Alt 24. Apr 2015, 17:28
A ist eine Variable, wo 4 Integer reinpassen, für die 4 möglichen Antworten.


Selber Vorschlag, nur bissl Anders.
  • du erstellst dir eine Liste (oder ein Array)
  • füllst das mit den 4 Werten (Indize derLösungen), also mit 1 bis 4
  • dann vermischst du diese Liste (es gibt massig Tutorials bezüglich Sortieren oder Mischen ... ist ja grundsätzlich das Selbe ... nur Andersrum)
  • und am Ende gehst du diese Liste durch und holst mit den darin stehenden Indize dir nacheinandere eine der 4 Lösungen

oder
  • du nimmst ein Boolean-Array und füllst das mit False (für die Indize 1 bis 4)
  • holst dir eine Zufallszahl
  • schaust in das Array, ob der Index noch auf False steht
  • wenn nein, dann wirder hoch zum Zufallszahlenholen
  • wenn ja, dann wird diese Antwort ausgegeben
  • und das Ganze wird 4 Mal wiederholt, also wieder hoch zu Zufallszahlenholen, wenn noch nicht alle antworten ausgegeben sind (also zwei Schleifen)

oder
  • stringliste mit antworten füllen
  • zufallszahl holen (siehe Anzahl in der Liste)
  • diese Antwort auslesen, ausgeben und aus der liste löschen
  • wiederholen bis Liste leer ist

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)
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PosEx im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
AquaMari

Registriert seit: 23. Apr 2015
7 Beiträge
 
Delphi 4 Standard
 
#5

AW: Multiple Choice Quiz--> Antwort-Positionen zufällig auswählen

  Alt 24. Apr 2015, 20:16
Ich habe das mit A schon verstanden und habe es dann probiert und es hat geklappt

Vielen Dank an Bjoerk !

Danke dir auch Himitsu
  Mit Zitat antworten Zitat
AquaMari

Registriert seit: 23. Apr 2015
7 Beiträge
 
Delphi 4 Standard
 
#6

AW: Multiple Choice Quiz--> Antwort-Positionen zufällig auswählen

  Alt 25. Apr 2015, 12:28
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;
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.624 Beiträge
 
Delphi 12 Athens
 
#7

AW: Multiple Choice Quiz--> Antwort-Positionen zufällig auswählen

  Alt 25. Apr 2015, 12:46
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.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
BadenPower

Registriert seit: 17. Jun 2009
616 Beiträge
 
#8

AW: Multiple Choice Quiz--> Antwort-Positionen zufällig auswählen

  Alt 25. Apr 2015, 15:08
(da auch mehrere Antworten richtig sein können)
Da ich davon ausgehe, dass es je Frage nur eine richtige Antwort gibt, sind Checkboxen nicht die optimale Wahl.
@DeddyH
Deine Vermutung widerspricht der Aussage von AquaMari im Post über Deinem.
Programmieren ist die Kunst aus Nullen und Einsen etwas sinnvollen zu gestalten.
Der bessere Künstler ist allerdings der Anwender, denn dieser findet Fehler, welche sich der Programmierer nicht vorstellen konnte.
  Mit Zitat antworten Zitat
BadenPower

Registriert seit: 17. Jun 2009
616 Beiträge
 
#9

AW: Multiple Choice Quiz--> Antwort-Positionen zufällig auswählen

  Alt 25. Apr 2015, 15:16
Delphi-Quellcode:

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;
Schau Dir einmal diese Zeile an:
if (check[i].caption=r_antworten[6]) and (check[i].caption=r_antworten[7]) then Das kann nicht funktionieren, da check[i] nicht gleichzeitig zwei verschiedene Antworten haben kann.

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.
Programmieren ist die Kunst aus Nullen und Einsen etwas sinnvollen zu gestalten.
Der bessere Künstler ist allerdings der Anwender, denn dieser findet Fehler, welche sich der Programmierer nicht vorstellen konnte.
  Mit Zitat antworten Zitat
AquaMari

Registriert seit: 23. Apr 2015
7 Beiträge
 
Delphi 4 Standard
 
#10

AW: Multiple Choice Quiz--> Antwort-Positionen zufällig auswählen

  Alt 1. Mai 2015, 10:18
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.
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:37 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz