Einzelnen Beitrag anzeigen

Nuclear-Ping
(Gast)

n/a Beiträge
 
#4

Re: Some questions

  Alt 21. Feb 2008, 12:50
Zitat:
Ich will aber, dass die Fragen zufällig auftretten und die beantworteten Fragen sollen nicht wieder erscheinen.
Dazu brauchst du eine Liste, die alle Fragen beinhaltet und jeder Eintrag ein entsprechendes Flag hat, der sagt, ob sie schon erschienen ist oder nicht.
Zum Bleistift:
Delphi-Quellcode:
type
  TQuestion = record
                Id: Integer; // << Kann nicht schaden, 'ne Id zu haben
                Question: String; // << Die Frage
                Answers: TStringList; // << Musst du jedesmal per Answers:= TStringList.Create instanzieren!
                CorrectAnswer: Integer; // << Musst du vorgeben
                AlreadyAsked: Boolean; // << TRUE, wenn schon vorgekommen, FALSE wenn nicht
              end;
  PQuestion = ^TQuestion;

var
  AvailableQuestions: TList;
  Question: PQuestions;
  a: Integer;

begin
  AvailableQuestions := TList.Create;
  try
    New (Question);
    with Question^ do
      begin
        Id := 1; // nächste 2, 3, ... usw
        Question := 'Wo liegt Deutschland?';
        Answers := TStringList.Create;
        Answers.Add ('Asien');
        Answers.Add ('Europa');
        // ...
        CorrectAnswer := 1; // von 0 beginnend
        AlreadyAsked := FALSE;
      end;
    AvailableQuestions.Add (Question);

    New (Question);
    with Question^ do
      begin
        Id := 2; // nächste 3, 4, ... usw
        Question := 'Wie spät ist es?';
        Answers := TStringList.Create;
        Answers.Add ('Fünf vor um');
        Answers.Add ('Immer jetzt');
        // ...
        CorrectAnswer := 1; // von 0 beginnend
        AlreadyAsked := FALSE;
      end;
    AvailableQuestions.Add (Question);

    // ...
end;
Das könnte der Pool deiner verfügbaren Fragen sein. Du weißt die Anzahl der Fragen (AvailableQuestions.Count) und kannst darauf ein Random ausführen, um aus diesem Bereich eine zufällige zu ziehen. Das kannst du auch in eine Schleife packen und mit AlreadyAsked prüfen, ob die Frage schon vorgekommen ist und wenn ja, weitermachen.
Delphi-Quellcode:
var
  RndIdx: Integer;
  Question: PQuestion;
begin
  Randomize;

  while TRUE do
    begin
      RndIdx := Random (AvailableQuestions.Count);
      Question := PQuestion (AvailableQuestions[RndIdx]);
      if Questions.AlreadyAsked then
        Continue
      else Break;
    end;
end;
Und am Ende nicht vergessen, den ganzen Spaß wieder freizugeben!
Delphi-Quellcode:
var
  Idx: Integer;
  Question: PQuestion;
begin
  for Idx := AvailableQuestions.Count - 1 downto 0
    begin
      Question := PQuestion (AvailableQuestions[Idx]);
      FreeAndNil (Question.Answers);
      Dispose (Question);
    end;
  AvailableQuestions.Clear;
  FreeAndNil (AvailableQuestions);
end;
  Mit Zitat antworten Zitat