Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Quiz erstellen (https://www.delphipraxis.net/1758-quiz-erstellen.html)

01Detlef 21. Dez 2002 15:13


Quiz erstellen
 
Quiz erstellen
hallo,
ich möchte ein quiz proggen und möchte dazu arrays benutzen!
ich habe jetzt schon eine procedure, wodurch jeder spieler zwei versuche bekommt für eine frage! ich hatte ein quiz, bei dem jede frage in einem neuen form gespeichert wurde, es entstanden aber viele fehler. Außerdem verwende ich einen Button, vier Labels und ein editfeld.

Also ich möchte jetzt ein Array, in dem alle 15 Antworten gespeichert sind und den jeweils vier Labels ein Text zugewiesen wird! Außerdem soll die Antwort nicht immer z.B a sein, deshalb muss das auch variabel sein!


Code:
var a array[1..15] of integer;
Begin for i:=1 to 15 do
begin.....;

Ich weiss jetzt nicht, wie ich das alles verbinden kann,
vier mögliche Antworten, verschiedene Reihenfolge der richtigen Antworten und das nachdem die erste richtig beantwortet wurde die nächste erscheint???


Danke Detlef

Christian Seehase 21. Dez 2002 15:29

Moin Detlef,

erst einmal herzlich willkommen.

Ich denke mal als erstes solltest Du Dir mal Gedanken über die Daten (Struktur) machen.

Eine Möglichkeit wäre es, die Fragen, inclusive der Antwortmöglichkeiten, und der Kennung der korrekten Antwort in einer Ini Datei zu speichern.

z.B. in diesem Stile
[Frage1]
text=Hier die Frage
A1=Erste Antwortmöglichkeit
A2=Zweite Antwortmöglichkeit
...
korrekt=A1

Die könntest Du dann mit Hilfe eines TIniFile auslesen, auf die Label verteilen, und Dir merken welche der vier die richtige Antwort wäre.

Die Daten kannst Du dann natürlich auch in Arrays einlesen.

(Soll wohl eine WWM Variante werden ;-))

01Detlef 21. Dez 2002 17:19

danke,

ich verstehe das mit der ini-datei nicht, was soll ich machen?

Welche Möglichkeit gibt es denn noch die Daten zu speichern?
Deinen Vorschlag kann ich doch auch mit if-anweisungen machen, oder?

Danke Detlef

Christian Seehase 21. Dez 2002 17:34

Moin Detlef,

schau Dir doch mal die Hilfe zu TIniFile an.

Dabei speziell die Methode ReadString.

Du kannst natürlich auch die ganzen Fragen und Antworten fest in das Programm schreiben, aber das wäre doch recht unflexibel.

Das mit dem if hab' ich jetzt nicht verstanden.

ssach 21. Dez 2002 19:05

Zusatz variable
 
y,

zunachst wuerde ich an deien stelle mal ein array of string nutzen, aber du kannst ja a,b,.. durch 1,2..ersetzen!
also mein vorschlag ist du benutzt einfach eine hilfsvariable, bei der du nach jeder antworteinfach zb. zusatvariable = i
Delphi-Quellcode:
a[i] := Antwort;
i := i +1
dann hast du bei a immer die position der frage die gerade dranist,hoffe konnte di rhelfen!
cu[/b]

01Detlef 22. Dez 2002 13:07

vielen dank,

aber ehrlich gesagt, weiss ich nicht wie ich jetzt anfangen soll! Also habe ich das jetzt richtig verstanden, die richtigen Antworten in einem Array speichern, die gesamten Fragen in einem speichern und wie ist das mit der Reihenfolge?

Danke Detlef

Christian Seehase 22. Dez 2002 13:14

Moin Detlef,

wie willst Du es denn mit den erforderlichen Daten, halten:
Sollen die aus einer externen Datei eingelesen werden, oder willst Du die fest im Programm einbauen?

01Detlef 22. Dez 2002 15:51

Als ich weiss nicht, welche Vorteile oder Nachteile die beiden Möglichkeiten haben!
Du meintest ja, das die externe Variante besser flexibler sei, also könnte ich das so versuchen!

Detlef

Christian Seehase 22. Dez 2002 16:50

Moin Detlef,

mal so überlegt:
Willst Du die Fragen und Antworten ändern, müsstest Du bei fest im Programm hinterlegten Daten jedesmal das Programm ändern.
Sind die Daten in einer Datei ausgelagert, muss nur diese geändert/ergänzt werden, damit Du neue Fragen und Antworten zur Verfügung hast.

Zugegeben, die Idee diese Daten in eine INI Datei zu schreiben, ist natürlich nicht das Optimum, da ja jeder problemlos da reinschauen und mogeln kann, aber für den Einstieg, ist es eine recht leicht zu handhabende Lösung.

Damit's für den Anfang nicht zu kompliziert wird, würde ich mal vorschlagen, von nur einem einzigen Satz von 15 Fragen auszugehen, die in der Datei stehen sollen.
Eine Erweiterung auf mehrere Sätze kann dann ja immer noch kommen.

Dazu mal kurz der grundlegende Aufbau einer INI Datei:
Diese Dateien sind unterteilt in Sections Idents, und Values
Sections sind die zusammengehörigen Blöcke, Idents dann die einzelnen Einträge innerhalb der Blöcke.

Das könnte dann z.b. so aussehen:

[Frage1] <= Dies wäre eine Section
Frage=Das ist hier die Frage <= Frage wäre hier der Ident, Das ist hier die Frage der Value

Die Fragendatei hätte dann also beispielsweise so einen Aufbau:

[Frage1]
Frage=Hier der Text der ersten Frage
Antwort1=1. Antwortmöglichkeit
Antwort2=2. Antwortmöglichkeit
Antwort3=3. Antwortmöglichkeit
Antwort4=4. Antwortmöglichkeit
Korrekt=3

Hierbei habe ich dann angenommen, dass die Antwort3 die richtige Antwort ist.

Um diese Daten jetzt zu benutzen bräuchtest Du eigentlich noch nicht einmal mehr Arrays, da Du die Daten direkt aus der Datei heraus auslesen könntest.

Sollen die Daten vorab komplett eingelesen werden (in Arrays eben), sehe ich, was die Übersichtlichkeit angeht, zwei Lösungen:
  1. Sechs Arrays mit jeweils 15 Einträgen, davon eines für die Fragen, vier für die Antwortmöglichkeiten, und eines für korrekte Antwort
  2. Ein Array mit 15 Einträgen, wobei dann ein eigener Datentyp als Typ benutzt wird, der alle Daten je Frage enthält.

Beide Varianten wären leicht einzubauen, und recht übersichtlich, die 1. wäre allerdings recht umständlich zu schreiben.

(Ich hatte auch noch die Idee das Ganze über ein mehrdimensionales Array mit Standardtypen zu machen, aber ich finde, dass man da leicht die Übersicht verlieren kann, auch wenn's nur drei Dimensionen geworden wären).

Der erste Fall sähe dann so aus (Datendeklaration):

Delphi-Quellcode:
var
  asQuestions : array [1..15] of string;
  asAnswer1   : array [1..15] of string;
  asAnswer2   : array [1..15] of string;
  asAnswer3   : array [1..15] of string;
  asAnswer4   : array [1..15] of string;
  aiCorrect  : array [1..15] of integer;
und der zweite so:

Delphi-Quellcode:
type
  TcsQuiz =
  record
    sQuestion : string;
    sAnswers : array [1..4] of string;
    iCorrect : integer;
  end;

var
  aqQuiz : array [1..15] of TcsQuiz;
Das Einlesen von Daten aus einer INI Datei sähe, allgemein, so aus:
(unter uses muss noch inifiles hinzugefügt werden)

Ein Beispiel für den Umgang mit TIniFile, keine Komplettlösung für Dein Programm:

Delphi-Quellcode:
var
  iniQuiz   : TIniFile;
  sTextValue : string;
  iIntValue : integer;

begin
  // Ini Datei 'Quiz.ini' öffnen
  // paramstr(0) enthält den Pfad des Programmes (incl. Dateiname)
  iniQuiz := TIniFile.Create(ExtractFilePath(paramstr(0))+'Quiz.ini');
  try
    sTextValue := iniQuiz.ReadString('Frage1','Frage','');
    iIntValue := iniQuiz.ReadInteger('Frage1','Korrekt',0);
  finally // Belegte Resourcen wieder freigeben
    FreeAndNil(iniQuiz);
  end;
end;
Versuch doch mal, ob Du damit erst einmal klarkommst.

01Detlef 23. Dez 2002 09:13

Code:
type
  TcsQuiz =
  record
    sQuestion : string;
    sAnswers : array [1..4] of string;
    iCorrect : integer;
  end;

var
  aqQuiz : array [1..15] of TcsQuiz;
Wenn ich nach diesem vorgehen möchte, dann muss ich doch eine For-Schleife für den array [1..15] aufbauen und darin die anderen Infos speichern? Meine Frage ist, wie rufe ich den Array answers jetzt darin aus? ( aqQuiz[1]:= sanswer[1]:= ??).
Den Quelltext schreibe ich doch in die Button.click-prozedur?

Code:
PROCEDURE Button.klick...
var i : Integer;
BEGIN
  FOR j:=1 TO 15 Do BEGIN
     aqQuiz[1]:= // hier kommen jetzt die Zuweisungen für die erste    
                    Frage hin, sQuestion, sAnswers, sCorrect
     aqQuiz[2]:= // zweite Frage
  end;
END;
Detlef

Christian Seehase 23. Dez 2002 13:07

Moin Detlef,

Du wirst in jedem Falle eine Schleife über die 15 Positionen benötigen, ausser Du möchtest das Einlesen für alle 15 von in einzelnen Zeilen Codieren. Das ginge natürlich auch, würde aber wohl kaum jemand machen.

Delphi-Quellcode:
var
 aqQuiz  : array [1..15] of TcsQuiz;
 i       : integer;
 j       : integer;
 sSection : string;

begin
  for i := 1 to 15 do
  begin
    sSection := 'Frage'+IntToStr(i);
    aqQuiz[i].sQuestion := iniQuiz.ReadString(sSection,'Frage','');
    for j := 1 to 4 do
    begin
      aqQuiz[i].sAnswer[j] := iniQuiz.ReadString(sSection,'Antwort'+IntToStr(j),'');
    end;
    aqQuiz[i].iCorrect := iniQuiz.ReadInteger(sSection,'Korrekt',0);
  end;
end;
Das ist jetzt nur ein Codefragment, wie man dann die Daten einlesen kann. Da für jede Position die gleiche Section benötigt wird, habe ich die mal in einer Variable zusammengefasst.

Sollten da noch Fehler drin sein:
Ich hab's hier direkt reingetippt.

01Detlef 8. Jan 2003 17:24

hallo, ich war im urlaub, deshalb jetzt noch ein frohes neues jahr!!

ich habe jetzt mal ein wenig herumgeproggt(mit ein wenig hilfe) und:
Code:
procedure TForm1.FormCreate(Sender: TObject);
begin
  Versuche:=0;
  // hier muss jetzt noch das array hinein, welches aus einer datei eingelesen werden soll
  nummer:=0;
  Label_Frage.Caption:=Frage[nummer].Frage;
end;

procedure TForm1.Button1Click(Sender: TObject);
var antwort: STRING;
begin
  Antwort:=edit1.text[1];
  IF Antwort = Frage[nummer].Antwort THEN
  begin
    Versuche := 0;
     inc(nummer);
     Label_Frage.Caption:=Frage[nummer].Frage;
  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;
also ich habe jetzt zwei versuche für jede Frage!

Mein Problem besteht darin, das array zu füllen, die Schleife ist ja der button, der die nummer von mal zu mal um eins erhöht! Zu der erhöhung müssen sich die zuweisungen ändern!Also so:
Nummer=1 Frage= hauptstadt von Deutschland?
1)Bonn
2)Berlin
3)Hamburg
4)..
und außerdem muss noch in einem array die richtigen zahlen oder buchstaben geseichert seien, damit die nächste frage erscheint!
Code:
IF Antwort = Frage[nummer].Antwort THEN
Ich weiss nur nicht, wie ich das jetzt alles zusammenpacken muss!

Danke detlef

01Detlef 10. Jan 2003 15:14

hallo,
könnt ihr mir nicht helfen, es ist wirklich wichtig!
Ich weiss wirklich nicht, wie ich das array fülle und die labelzuweisungen mache??

Bitte detlef

Christian Seehase 10. Jan 2003 15:43

Moin Detlef,

wie das Array gefüllt wird steht doch in meinem letzen Posting?

01Detlef 10. Jan 2003 17:45

ja, aber wie macht man die ganzen label-Zuweisungen, in die ich meine fragen schreiben kann?

Danke detlef

Christian Seehase 10. Jan 2003 18:02

Liste der Anhänge anzeigen (Anzahl: 1)
Moin Detlef,

ich hab' Dir hier mal ein kleines Muster angehängt wie man's machen könnte. (funktioniert sogar ;-) )

Christian Seehase 18. Mär 2009 20:06

Re: Quiz erstellen
 
Hallo Zusammen,

da ich nach eine Dokumentation zu dem Programm gefragt wurde, möchte ich diese hiermit nachholen:
Die Daten werden in einer INI-Datei (Quiz.ini) im Programmverzeichnis gespeichert.

Die Datei hat folgenden Aufbau:

[FrageX]
Frage=<Text Frage>
Antwort1=<1. Antwortmöglichkeit>
Antwort2=<2. Antwortmöglichkeit>
Antwort3=<3. Antwortmöglichkeit>
Antwort4=<4. Antwortmöglichkeit>
Korrekt=<Angabe, welche Antwort die richtige ist (1-4)>

wobei X für einen Wert von 1-15 steht, da das Programm für 15 Fragen ausgelegt ist.

Roxana 23. Mär 2009 18:39

Re: Quiz erstellen
 
ich versuche gerade mit dieser vorlage ein eigenes quiz zu erstellen...aus spaß ;)
jedoch finde ich die stelle im quelltext nicht, wo ich meine fragen und antworten einfügen kann.ich hoff ich bekomme hilfe ;)

lieben Gruß Roxi

Christian Seehase 23. Mär 2009 20:55

Re: Quiz erstellen
 
Moin Roxi,

für die Anzahl der Fragen sind folgende Zeilen wichtig:

Delphi-Quellcode:
  aqQuiz : array [1..15] of TcsQuiz; // Im Interface-Abschnitt

  if FiCountQuestion = 15 then // In NextQuestion

  for i := 1 to 15 do // In FormCreate
Als Vereinfachung (Verbesserung) könnte man auch einfach eine Konstante mit der Anzahl belegen, und diese an diesen drei Stellen einbauen.

Wie in meinem letzten Post schon geschrieben kommen die Fragen und Antworten in eine Ini-Datei.

Mal ein Konkretes Beispiel für einen Eintrag:

Code:
[Frage1]
Frage=Wieviel ist 3 mal 3
Antwort1=9
Antwort2=12
Antwort3=15
Antwort4=18
Korrekt=1


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:00 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-2025 by Thomas Breitkreuz