Semesterprojekt



  • Hallo Leute,
    2 Kollegen und ich mache gerade ein Projekt im Fach Informatik. Wir sollen ein Spiel entwickeln, wir haben uns für ein Quiz/ Lernspiel entschieden. Wir dachten uns das wir die Fragen 5 mal richtig beantworten müssen bis sie endgültig gelöscht werden können bzw. man sie kann. Wir dachten uns das wir sie dann durch 5 Kategorien laufen lassen. Diese 5 Kategorien müssen dann zunehmend seltener vorkommen. Zum Beispiel kommen die Fragen die man noch gar nicht richtig beantworte hat bzw. in der 1. Kategorie sind zu 40% vorkommen, die in der 2. zu 25%, die in der 3. zu 20% usw. Bis sie dann endgültig nach der 5. Kategorie gelöscht werden.

    Unser Problem ist es jetzt die Fragen in die jeweiligen Kategorien zuverschieben und dann durch einen Zufallsgenerator auszusuchen. Den Zufallsgenerator haben wir. Wir bräuchten jetzt einen Idee wie wir die Fragen verschieben.

    Ich hoffe das ist etwas zu verstehen 🙂

    PS. Wir sind nichts Könner 😉

    Vielen Dank



  • Ich würde vorschlagen, pro Kategorie einen Vector zu nehmen und dann die Fragen einfach von einem Vector in den anderen zu verschieben. Hört sich nicht so kompliziert an.



  • Vielen Dank schon mal.
    Wie sieht das denn ungefähr aus?



  • dariusrobert schrieb:

    Vielen Dank schon mal.
    Wie sieht das denn ungefähr aus?

    Du legst z.B. Vectoren von Strings an die die Fragen speichern z.B. so

    std::vector<std::string> Kategorie1;
    Kategorie1.emplace_back("Was ist die Hauptstadt von Deutschland?");
    

    Wenn es wirklich kompfortabel sein soll, lest ihr die Fragen am besten aus einer Datei ein. Zum stellen der Fragen itteriert ihr mit einem Iterator über einen vector. Damit könnt ihr dann das aktuelle Element gegebenenfalls in einen andern Vector verschieben.

    Ich habe allerdings den Eindruck, ihr solltet euch noch mal dringend mit den Grundlagen von C++ beschäftigen.



  • Wobei mir gerade einfällt. Ihr speichert am besten ein Pair von Strings, da ihr ja auch die zugehörige Antwort braucht.



  • Da stimmen wir dir alle zu!!! Nur ist dafür keine Zeit mehr 😃

    Vielen Dank



  • dariusrobert schrieb:

    Da stimmen wir dir alle zu!!! Nur ist dafür keine Zeit mehr 😃

    lol, das ganze programm sollte einen weniger als einen tag kosten, nicht zu dritt ein semester.



  • TNA schrieb:

    Wobei mir gerade einfällt. Ihr speichert am besten ein Pair von Strings, da ihr ja auch die zugehörige Antwort braucht.

    Hab irgendwo mal gehört, dass man in C++ sowas wie OOP einigermaßen umsetzen kann. 😉



  • Jo also um euch etwas zu motivieren, das ist auf jeden Fall schaffbar, wenn ihr das dann habt, könnt ihr versuchen das mit einer Grafikbibliothek (Bsp: SFML) grafisch umzusetzen, macht bestimmt auch Spaß und ist ein bisschen mehr zu tun 😉

    LG



  • Wie wäre es mit enum? ( c++11 )

    #include <iostream>
    #include <string>
    #include <vector>
    
    class Question
    {
    public:
        enum progress { stage1, stage2, stage3, stage4, stage5 };
    
        explicit Question( const std::string& q, const std::string& a, progress p) : questionText(a), answerText(a), currentStage(p)
        {}
    
        std::string question() const { return questionText; }
    
        std::string answer() const { return answerText; }
    
        progress stage() const { return currentStage; }
    
        void changeStage( progress p ) { currentStage = p; }
    
    private:
        const std::string questionText;
    
        const std::string answerText;
    
        progress currentStage;
    };
    
    int main()
    {
        std::vector< Question > questions =
        {
            Question( "foo", "bar",     Question::progress::stage1 ),
            Question( "blabla", "lala", Question::progress::stage1 ),
            Question( "tata", "blub",   Question::progress::stage1 )
        };
    }
    


  • dariusrobert schrieb:

    2 Kollegen und ich mache gerade ein Projekt im Fach Informatik.

    Finde ich jetzt ehrlich gesagt etwas anspruchslos. Was sind denn da für Anforderungen? Ich hoff mal, ihr wollt das nicht als Studienarbeit verkaufen. Was wir damals als Studienarbeit hatten, war wahrscheinlich paar hundert mal mehr Aufwand.


  • Mod

    exploit126 schrieb:

    Wie wäre es mit enum? ( c++11 )

    Gefällt mir nicht. Wir wissen zwar nicht genau, wie das Programm aussehen soll, aber vermutlich möchte man doch die Fragekategorie als Eigenschaft eines Containers (und damit indirekt der da drin enthaltenen Fragen) haben, nicht als Eigenschaft der Frage selbst. Denn dann kann man leicht alle Fragen einer Kategorie erhalten, was in diesem Beispiel hingegen mit sehr viel Sucharbeit verbunden wäre.



  • SeppJ schrieb:

    exploit126 schrieb:

    Wie wäre es mit enum? ( c++11 )

    Gefällt mir nicht. Wir wissen zwar nicht genau, wie das Programm aussehen soll, aber vermutlich möchte man doch die Fragekategorie als Eigenschaft eines Containers (und damit indirekt der da drin enthaltenen Fragen) haben, nicht als Eigenschaft der Frage selbst. Denn dann kann man leicht alle Fragen einer Kategorie erhalten, was in diesem Beispiel hingegen mit sehr viel Sucharbeit verbunden wäre.

    Um genau zu sein sind die Kategorien nicht sinnig: Es bildet nur die "Karteikastenmethode" nach, eine gute Methode, wenn man keinen PC hat. Aber mit PC kann man die 5 Kästen ersetzen durch einen double pro Vokabelsatz die Kästen fließend gestalten, bei Nichtwissen einen Punkt Abzug oder Punkte halbieren oder so und bei Wissen einen Punkt dazu, noch kleinen Rinbuffer dazu, damit zwischen dem Wiederholen einer Frage mindestens 7 (hängt von der Person ab) andere sind, und das Prog schlägt jeden einfachen Karteikasten, was den Spaß und den Lernerfolg angeht.



  • Erstmal vielen Dank,
    wir sind angehende Wirtschaftsingenieure :)das erklärt glaub ich schon einiges...

    Wenn das so schnell für euch geht könntet ihr ja eins Schreiben 😉
    da kann man sich bestimmt auch iwie auf eine Aufwandsentschädigung enigen.

    wir sind hier nämlich am verzweifeln 😃



  • Von Karteikästchen und Kategorien mal abgesehen. Angenommen ihr habt alle Frgen in einem vector und jede Frage hat ein Gewicht:

    Hier http://www.electricmonk.nl/log/2009/12/23/weighted-random-distribution/ sind ein paar Vorschläge, wie man dann gewichtete Stichproben nehmen kann.

    Mit C++11 bietet sich - wenn mich nicht alles täuscht - die discrete_distribution an.

    Z.B.

    #include <iostream>
    #include <vector>
    #include <random>
    #include <map>
    #include <algorithm>
    
    // aus N3551:
    std::default_random_engine& global_urng(){
      static std::default_random_engine u{};
      return u;
    }
    // dto.
    void randomize(){
      static std::random_device rd{};
      global_urng().seed(rd());
    }
    
    struct question{
      int id_;
      int w_; // weight
    };
    
    using qvec = std::vector<question>;
    
    qvec::iterator get_next_question(qvec& v){
      // alle mit 0 gewichtet oder v.empty()?
      if(std::all_of(begin(v), end(v), [](const question& q){
    	return q.w_==0;
          }))
        return end(v);
      // ein Vektor mit den Gewichten der einzelnen Fragen
      std::vector<double> weights(v.size());
      std::transform(begin(v), end(v), begin(weights), [](const question& q){
          return static_cast<double>(q.w_);
        });
      std::discrete_distribution<int> dist{begin(weights), end(weights)};
      // jetzt eine Ziehung machen und den entsprechenden Iterator zurueckgeben
      return next(begin(v),(dist(global_urng())));
    }
    
    int main(){
      randomize();
      qvec questions = {
        {0,  0},
        {1,  5},
        {2, 20},
        {3, 20},
        {4, 50},
        {5, 50},
        {6, 20},
        {7, 20},
        {8,  5},
        {9,  0}
      };
      std::map<int,int> m;
      for(int i=0; i< 10000; ++i){
        auto q = get_next_question(questions);
        if(q!=end(questions))
          m[q->id_]++;
      }
      for(const auto& mm : m)
        std::cout << mm.first << ": " << mm.second << '\n';
    }
    

    Zeit um wenigstens ein wenig C++ zu lernen muss noch sein... 🙂

    dariusrobert schrieb:

    wir sind angehende Wirtschaftsingenieure :)das erklärt glaub ich schon einiges...

    Nee, was soll das erklären?



  • Furble Wurble schrieb:

    dariusrobert schrieb:

    wir sind angehende Wirtschaftsingenieure :)das erklärt glaub ich schon einiges...

    Nee, was soll das erklären?

    halb Wirtschaftler, halb Ingenieur, aber nichts richtig *duckundweg*



  • daddy_felix schrieb:

    Furble Wurble schrieb:

    dariusrobert schrieb:

    wir sind angehende Wirtschaftsingenieure :)das erklärt glaub ich schon einiges...

    Nee, was soll das erklären?

    halb Wirtschaftler, halb Ingenieur, aber nichts richtig *duckundweg*

    Zu kniestig, um Geld fürs Egineering auszugeben, aber zu ungenau, um ordentlich Wirtschaft zu betreiben 😃 *duckundhinterherrenn*


Anmelden zum Antworten