Laden...

Quiz

Erstellt von Tremon vor 8 Jahren Letzter Beitrag vor 8 Jahren 2.521 Views
T
Tremon Themenstarter:in
1 Beiträge seit 2015
vor 8 Jahren
Quiz

Hallo!

Ich besuche eine Höhere Technische Lehranstalt (HTL) in Österreich.

Als Projekt müssen wir ein Quiz erstellen, wo jeweils ein Punkt immer zu der Punkteanzahl addiert wird.

Die Fragen sollen zufällig aus der Liste ausgewählt werden, diese sollten jedoch nicht doppelt vorkommen (die Fragen) und das ist mein Problem.

Falls mir jemand paar Tipps geben könnte, wäre ich sehr erfreut 🙂

Hier mein Code welchen ich bis jetzt geschreiben habe:

public partial class MainWindow : Window
{
private List<string> fragen;
private List<bool> antworten;
private int aktuelleFrage;
int RichtigeAntworten = 0;

    //Methode FrageHinzufuegen  

    public void FrageHinzufuegen(string Fr,bool An)  
    {  
        fragen.Add(Fr);  
        antworten.Add(An);  
    }  

    public void FrageStellen()  
    {  
        Random r = new Random();  
        aktuelleFrage = r.Next(0, fragen.Count);  
       // Labelfrage.Content = fragen.ElementAt(0);  
        Labelfrage.Content = fragen.ElementAt(aktuelleFrage);  
    }  

    public MainWindow()  
    {  
        InitializeComponent();  
        fragen = new List&lt;string&gt;();  
        antworten = new List&lt;bool&gt;();  
          
          


        FrageHinzufuegen(&quot;Skyrim ist der dritte Teil der \&quot;The Elder Scrolls Reihe\&quot;.&quot;, false);  
        FrageHinzufuegen(&quot;Skyrim kam am 11.11.11 herraus&quot;, true);  
        FrageHinzufuegen(&quot;Fast jedr Sturmäntel ist ein Nord.&quot;, true);  
        FrageHinzufuegen(&quot;In Tamriel herrscht Krieg zwischen den Gilden&quot;, false);  
        FrageHinzufuegen(&quot;Skeever sind riesige Ratten&quot;, true);  
        FrageHinzufuegen(&quot;Merunus Dagon ist der mächtigste dedra Prinz&quot;, true);  
        FrageHinzufuegen(&quot;Ein Schrei ist ein Thu´m&quot;, true);  
        FrageHinzufuegen(&quot;Drachenpriester tragen eine Maske und ein Schwert&quot;, false);  
        FrageHinzufuegen(&quot;Die Dwemerruinen sind die leichtesten Ruinen&quot;, false);  
        FrageHinzufuegen(&quot;Der ältere Bruder von Skyrim ist Oblivion&quot;, true);  




          

    }  

    public void Antwort_Click(object sender, RoutedEventArgs e)  
    {  
        //Frage mit der Antwort vergleichen und eine neue Frage stellen  
        bool loesung = antworten[aktuelleFrage];  
       
        RAZaehler.Content = Convert.ToInt32(RichtigeAntworten);  
          

        if (loesung == RB1.IsChecked)  
        {  
         MessageBox.Show(&quot;Richtig&quot;);  
         RichtigeAntworten++;  

          FrageStellen();  
              
               
           
        }  
        else {MessageBox.Show(&quot;Falsch&quot;);  
         
        }  
              
          


    }  
      

}  

Ich danke sehr schön für die Tipps 👍 8) 🙂 🙂

82 Beiträge seit 2014
vor 8 Jahren
  1. verwende die richtigen Tags für den Beispielcode, ist besser zu lesen.

  2. mach Dir eine Klasse mit Fragen und merk Dir welche schon gestellt wurde. oder nhem wenigstens eine Liste dafür, welche Fragen gestellt wurden.

schnelleHelga

J
251 Beiträge seit 2012
vor 8 Jahren

Ich würde, mir den Spaß machen und ein Objekt "Frage" o.ä. kreieren mit Properties,

  • ob sie schon gestellt wurde,
  • ob die Antwort richtig war,
  • exakte Antwort
  • usw. was man so will
B
50 Beiträge seit 2015
vor 8 Jahren

Ich frage mich, ob es nicht sinnvoll wäre, die Fragen in einer DB zu hinterlegen.

Dann könntest du der Tabelle direkt einen Wert hinzufügen, der bestimmt, ob die Frage schon gestellt wurde, oder nicht.

T
34 Beiträge seit 2014
vor 8 Jahren

Das wäre auch, wie es so schön genannt wird, mit Kanonen auf Spatzen geschossen. So wie ich das sehe wird das nur ein kleines Projekt werden, ausserdem setzt eine DB schon ein gewisses Wissen voraus.

Ich schliesse mich den anderen an, ein Objekt für jede Frage wäre extrem nützlich.

So als Tipp, die Fragen kannst du dann auch ganz leicht als XML speichern und laden.

        public void Save(QuestionContainer obj, string path)
        {
            XmlSerializer serializer = new XmlSerializer(typeof(QuestionContainer));

            using(FileStream stream = new FileStream(path, FileMode.Create))
                serializer.Serialize(stream, obj);
        }

        public QuestionContainer Load(string path)
        {
            QuestionContainer data = null;
            XmlSerializer serializer = new XmlSerializer(typeof(QuestionContainer));

            using(XmlReader reader = XmlReader.Create(path))
                data = serializer.Deserialize(reader) as QuestionContainer ;

            return data;
        }
2.078 Beiträge seit 2012
vor 8 Jahren

Was TTopsecret schreibt, ist in meinen Augen die beste Variante.

Ein Projekt mit diesem Umfang auf eine Datenbank zu setzen, ist wie als würde ich einen Trabbi mit einer Flugzeug-Turbine ausstatten. Der bloße Umfang nur für die Datenbank-Anbindung würde den bisherigen Umfang abdecken, während weit über das Ziel hinaus geschossen wurde.

Ich würde die Fragen und Antworten wie TTopsecret in eine XML-Datei speichern. Dort lassen sich alle nötigen Infos einfach strukturiert unterbringen. Pro Frage gibt es dann ein Objekt mit der Frage, einer Liste an Antworten und einer Index-Liste, welche Antworten richtig sind. Diese Fragen kommen alle in eine Liste.
Mit Random und der Anzahl der Liste kann dann immer ein Index zufällig gewählt werden.
Die gewählte Frage wird gestellt und dann aus der Liste entfernt. Die Random-Klasse bekommt die Größe der Liste als Maximal-Wert, weshalb die entfernte Frage keine Probleme verursacht.

Auf diese Weise steht die einfachste Möglichkeit, eine zufällige Auswahl ohne Wiederholungen zu erreichen. Zusätzlich kann an jeder bereits gestellten Frage noch eine boolean-Property gesetzt werden, ob die Frage gestellt wird. Wenn es dann noch eine zweite Liste mit der Gesamtheit aller Fragen existiert, lässt sich der aktuelle Stand im Quiz wieder abspeichern und später fortsetzen.

Wenn man Fragen und Antworten nicht einfach in der XML-Datei lesen können soll, kannst Du binäre Serialisierung nutzen. Funktioniert genauso, wie TTopsecret das mit XML zeigt, allerdings kann das kein Mensch danach lesen, da es eben binär geschrieben wurde. Verschlüsselt ist das dann noch nicht, aber das wäre auch wieder überflüssig.