Wer wird Millionär in C++

my1096

Cadet 2nd Year
Registriert
Juni 2018
Beiträge
25
Guten Abend,

ich muss das Quizspiel "Wer wird Millionär" programmieren. Nur leider bin ich ein absoluter Anfänger in C++ und habe ehrlich gesagt auch aktuell Schwierigkeiten es zu lernen.
Das Programm soll folgendes können: Es soll aus einem Pool von 40 Fragen zufällig 15 raussuchen und diese stellen. Wie bei der Show soll man jeweils eine Leiter aufsteigen, wenn man die Frage richtig beantwortet. Des Weiteren soll es zwei Joker geben. 50/50 und den Publikumsjoker. Die Joker werde ich aber ganz am Ende hinzufügen.

Wir dürfen nur das benutzen, was wir gelernt haben. Sprich: Arrays, Strings, Structs, Klassen...

Ich weiß zum Beispiel was mehrdimensionale Arrays sind allerdings klappt die Umsetzung nicht. Dies gilt auch für andere Sachen.

Ich hab mal was versucht aber weiß nicht ob das so klappen wird:


C++:
#include <iostream>
#include "FragenuAntworten.h"
using namespace std;

void Fragen()
{

    Frage f1;
    Frage f2;
    Frage f3;
    Frage f4;
    Frage f5;
    Frage f6;
    Frage f7;
    Frage f8;
    Frage f9;
    Frage f10;
    Frage f11;
    Frage f12;
    Frage f13;
    Frage f14;
    Frage f15;
    Frage f16;
    Frage f17;
    Frage f18;
    Frage f19;
    Frage f20;
    Frage f22;
    Frage f23;
    Frage f23;
    Frage f24;
    Frage f25;
    Frage f26;
    Frage f27;
    Frage f28;
    Frage f29;
    Frage f30;
    Frage f31;
    Frage f32;
    Frage f33;
    Frage f34;
    Frage f35;
    Frage f36;
    Frage f37;
    Frage f38;
    Frage f39;
    Frage f40;



    f1.setValues = ("Wer ist Erstbesteiger des Mount Everest?"
        "Edmund Hillary",
        "Michael Schumacher",
        "Angela Merkel",
        "Danzel Washington", 1 );

}

int main()
{

    cout << "*************************************" << endl;
    cout <<"                                    " << endl;
    cout <<"                                    " << endl;
    cout <<"  Willkommen zu Wer wird Millionaer " << endl;
    cout <<"                                    " << endl;
    cout <<"                                    " << endl;
    cout << "*************************************" << endl;

    cout << " " << endl;
    cout << " Druecke Enter um das Spiel zu starten" << endl;
    cin.get();

    



    return 0;

}


C++:
#include <string>
using namespace std;


class Frage
{
private:

    string Frage_Text;
    string Antwort_1;
    string Antwort_2;
    string Antwort_3;
    string Antwort_4;

    int Richtige_Antwort;
    int Punktestand;

public:

    void setValues(string, string, string, string, string, int, int);
    void Stell_Fragen();



};


Ich denke diese Aufgabe lässt sich wahrscheinlich besser mit Arrays lösen. Aber ich weiß einfach nicht wie ich das umsetzen soll. Würde mich über jede Hilfe freuen! :-)
 
Einen fertigen Code wird dir hier keiner liefern, das mach als Übung schön selbst.
Aber ja, du könntest die Fragen in ein Array packen. Dann könntest du einfach über den Index eine Frage auswählen.
Wie immer kann man so was auch beliebig Komplex machen. Die Fragen z.B. in eine Datenbank oder zumindest ein Text-Dokument verlagern etc.

PS: int Punktestand; gehört glaub ich nicht in die Frage Klasse.
 
Du kennst Google? Das ist eine Suchmaschine für das Internet. Im Internet gibt es Wissen ohne Ende, wenn man denn danach sucht. Da du die Begriffe ja kennst die du brauchst, müsstest du nur danach suchen, bspw. bei Google. Das ginge schneller und ist für dich selbst deutlich besser.
 
Naja, ich würde ein struct als "Datentyp" für eine Fragestellung inkl. Antworten festlegen. Für die Antworten noch einen struct "Antwort" mit String und Bool (Antworttext und Markierung, ob richtige oder falsche Antwort). Die Antworten in das erste Struct. Alle Fragen (Typ Struct) in ein großes Array packen. In einem zweiten array speichern, welche Fragen (Indizes vom ersten Array) schon dran waren, damit nichts doppelt vor kommt. Dann nur noch die Fragen per Zufall (abzgl. der bereits gestellten Fragen) stellen, Antwort auswählen.

http://www.cplusplus.com/doc/tutorial/structures/

C++:
struct antwort{
    string Antworttext;
    bool korrekteAntwort;
};

struct Fragen{
    string Frage;
    antwort erste;
    antwort zweite;
    antwort dritte;
    antwort vierte;
} fragenkatalog[40];

int Punktestand = 0;
int gestellteFragen[15];

int main(){
    //Hier kommt nun der Programmcode
}

Und so greifst du auf eine Frage zu:
C++:
fragenkatalog[0].frage //Liefert Fragestring zurück
fragenkatalog[0].erste.Antworttext //Lifert Antworttext der ersten Antwort zurück
fragenkatalog[0].erste.korrekteAntwort //Liefert zurück, ob die erste Antwort korrekt ist oder nicht
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: my1096 und Nilson
Nilson schrieb:
Einen fertigen Code wird dir hier keiner liefern, das mach als Übung schön selbst.
Aber ja, du könntest die Fragen in ein Array packen. Dann könntest du einfach über den Index eine Frage auswählen.
Wie immer kann man so was auch beliebig Komplex machen. Die Fragen z.B. in eine Datenbank oder zumindest ein Text-Dokument verlagern etc.

PS: int Punktestand; gehört glaub ich nicht in die Frage Klasse.

Einen fertigen Code möchte ich auch nicht. Ich weiss nur nicht wie ich die Frage mit 4 Antwortmöglichkeiten in Arrays ausdrücken soll.

Bspws:

String Fragen [5][6]


Fragen[0][0] = "Frage"
Fragen[0][1] = "Antwort"
Fragen[0][2] = "Antwort"
Fragen[0][3] = "Antwort"
Fragen[0][4] = "Antwort"


In etwa so?
 
scooter010 schrieb:
Und so greifst du auf eine Frage zu:
C++:
fragenkatalog[0].frage //Liefert Fragestring zurück
fragenkatalog[0].erste.Antworttext //Lifert Antworttext der ersten Antwort zurück
fragenkatalog[0].erste.korrekteAntwort //Liefert zurück, ob die erste Antwort korrekt ist oder nicht

Danke dir vielmals, das hilft mir deutlich weiter!

Ginge dann so weiter, wenn ich das richtig verstehe:

fragenkatalog[0].frage
fragenkatalog[0].erste.Antworttext
fragenkatalog[0].erste.korrekteAntwort
fragenkatalog[0].zweite.Antworttext
fragenkatalog[0].zweite.korrekteAntwort
fragenkatalog[0].dritte.Antwort
fragenkatalog[0].dritte.korrekteAntwort
fragenkatalog[0].vierte.Antworttext
fragenkatalog[0].vierte.korrekteAntwort

fragenkatalog[1].frage
fragenkatalog[1].erste.Antworttext
fragenkatalog[1].erste.korrekteAntwort
fragenkatalog[1].zweite.Antworttext
fragenkatalog[1].zweite.korrekteAntwort
fragenkatalog[1].dritte.Antwort
fragenkatalog[1].dritte.korrekteAntwort
fragenkatalog[1].vierte.Antworttext
fragenkatalog[1].vierte.korrekteAntwort


Sorry falls ich da was total durcheinander bringe, bin leider wie gesagt nicht ganz fit bei C++.
 
Jop. Ob du das Füllen "hardcodest" oder über eine Funktion und Schleife aus einer Textdatei einliest ... nun es sei dir überlassen welche Mühe du dir machen willst ;) Wobei, dann ne Listet statt nem Array besser wäre ... Oder lässt es ganz weg und arbeitet nur mit der Datei ...
 
Zuletzt bearbeitet:
Jap. Genauso läuft es. Ich denke zwar, mit einer Klasse ist es "sauberer", aber bei mir hat es auch nur zum Maschinenbauprogrammieren gereicht.
Besser ist wohl:
C++:
struct fragestellung{
    string Frage;
    string Antw1;
    string Antw2;
    string Antw3;
    string Antw4;
    int korrekteAntwort
} fragenkatalog[40];

for(int i=0;i<40;i++){
   printf(fragenkatalog[i].Frage);
   printf(fragenkatalog[i].Antw1);
.
.
.
   printf("Korrekte Antwort ist Antwort Nr".fragenkatalog[i].korrekteAntwort);
}

Edith: Ja, das Eingeben des Fragenkataloges würde mich auch nerven... Würde ich wohl erstmal prozedural generieren zu testzwecken (random(1,4) oder so) und als Frage einfach die Nummer der Frage (1-40).

C++:
struct fragestellung{
    string Frage;
    string Antw1;
    string Antw2;
    string Antw3;
    string Antw4;
    int korrekteAntwort
} fragenkatalog[40];

for(int i=0;i<40;i++){
   fragenkatalog[i].Frage = "Frage Nr. ".i;
   fragenkatalog[i].Antw1 = "Antwort 1";
.
.
.
   fragenkatalog[i].korrekteAntwort = i%4+1; // Der Rest der Division durch 4 plus 1, also 1,2,3,4
}
 
Zuletzt bearbeitet:
Nilson schrieb:
Jop. Ob du das Füllen "hardcodest" oder über eine Funktion und Schleife aus eine Textdatei einliest ... nun es sei dir überlassen welche Mühe du dir machen willst ;) Wobei, damn ne Listet statt nem Array besser wäre ... Oder lässt es ganz weg und arbeitet nur mit der Datei ...

Hardcoden ginge für den Lehrer in Ordnung. Mit einlesen meinst du doch das mit ofstream? Das hatten wir erst vor kurzem aber vertieft haben wir es nicht. Wüsste ehrlich gesagt auch nicht wie ich das machen soll. Ich hab durch Krankheit leider sehr viel verpasst, weswegen ich alles nachholen muss.

scooter010 schrieb:
Jap. Genauso läuft es. Ich denke zwar, mit einer Klasse ist es "sauberer", aber bei mir hat es auch nur zum Maschinenbauprogrammieren gereicht.
Besser ist wohl:
C++:
struct fragestellung{
    string Frage;
    string Antw1;
    string Antw2;
    string Antw3;
    string Antw4;
    int korrekteAntwort
} fragenkatalog[40];

for(int i=0;i<40;i++){
   printf(fragenkatalog[i].Frage);
   printf(fragenkatalog[i].Antw1);
.
.
.
   printf("Korrekte Antwort ist Antwort Nr".fragenkatalog[i].korrekteAntwort);


Also ich glaub so wie du es gemacht hast mit der Schleife sollte ich arbeiten. Ich muss den Code auch präsentieren, die Leute sind halt etwas kritisch weswegen ich das bestmögliche rausholen muss. :D

Wie könnte ich das alles in die main schreiben? Ungefähr so wie ich es im ersten Post gemacht habe?
 
Mit verlaub, deine main() in dem ersten Post enthält nichts, bis auf ein wenig statische Textausgabe. Das mit der Schleife ist eigenlich nur geeignet um zu "Debugzwecken" alle Fragen inkl. Anworten hinereinander ausgeben zu lassen.

for (15x){
Du musst erstmal eine Frage (bzw. deren Nummer) zufällig aus einem Pool (alle Fragen) auswählen,
Die nummer mit allen bisherigen Nummern vergleichen und bei einer doppelung nochmal ziehen (Tipp: http://www.willemer.de/informatik/cpp/array.htm)
Nummer der Frage als gestellte Frage zwischenspeichern,
Frage (inkl. Antwortoptionen) Stellen,
die Antwort vom Nutzer einlesen und abgleichen mit der korrekten Antwort,
Wenn korrekt -> Punktestand hoch zählen, sonst abbruch (ggf. auch ohne Abbruch, je nach Spielregeln)
}
"Glühstrumpf, Sie haben x Fragen korrekt beantwortet"
 
scooter010 schrieb:
Mit verlaub, deine main() in dem ersten Post enthält nichts, bis auf ein wenig statische Textausgabe. Das mit der Schleife ist eigenlich nur geeignet um zu "Debugzwecken" alle Fragen inkl. Anworten hinereinander ausgeben zu lassen.

for (15x){
Du musst erstmal eine Frage (bzw. deren Nummer) zufällig aus einem Pool (alle Fragen) auswählen,
Die nummer mit allen bisherigen Nummern vergleichen und bei einer doppelung nochmal ziehen (Tipp: http://www.willemer.de/informatik/cpp/array.htm)
Nummer der Frage als gestellte Frage zwischenspeichern,
Frage (inkl. Antwortoptionen) Stellen,
die Antwort vom Nutzer einlesen und abgleichen mit der korrekten Antwort,
Wenn korrekt -> Punktestand hoch zählen, sonst abbruch (ggf. auch ohne Abbruch, je nach Spielregeln)
}
"Glühstrumpf, Sie haben x Fragen korrekt beantwortet"

Könnte man nicht srand benutzen um die zufälligen Fragen auszuwählen?
 
Aber nur beim ersten mal. Danach kannst du wenn du Pech (oder Glück ;)) die gleiche Frage also noch mal ziehen. Du musst also sicherstellen, das jede Frage nur einmal pro Spiel gezogen wird.
 
bestimmt, srand % 40 um eine zufällige Zahl von 1-40 zu bekommen und dann mit

C++:
int naechsteFrage(int* gestellteFragen){
    int gewuerfelteFrage = srand%40;

    for(int i = 0; i<15; i++){
        if(gestellteFragen[i] != gewuerfelteFrage) // Diese Notation, da sie besser für Sprungvorhersage der CPU ist, also leicht schneller abläuft
        else
            naechsteFrage(gestellteFragen); //<------------- Wichtiger Edith!
    }
    return gewuerfelteFrage;
}
sicherstellen, dass du nicht 2 mal die Selbe Frage stellst.

Edith: Das ja mal ein geiles Beispiel für funktionale Programmierung, fällt mir grade auf. Mit rekursivem Funktionsaufruf. Bin schon etwas stolz auf mich kappa
 
Zuletzt bearbeitet:
Nilson schrieb:
Aber nur beim ersten mal. Danach kannst du wenn du Pech (oder Glück ;)) die gleiche Frage also noch mal ziehen. Du musst also sicherstellen, das jede Frage nur einmal pro Spiel gezogen wird.

Stimmt. Wir hatten schon mal so eine ähnliche Aufgabe. Ging dann aber um Zahlen und dass sie nicht zweimal auftauchen sollten. Meine Mitschüler sollten wissen wie das geht ich frag mal am besten morgen nach.

Soll ich erstmal alles hardcoden, also die Fragen alle reinpacken? Ich hab heute morgen 40 Fragen mit dazugehörigen Antworten erstellt, müsste es halt entweder einlesen lassen oder hardcoden. Montag bin ich im Betrieb da würde ich eigentlich auch Hilfe bekommen. Aber versuche erstmal alles selber zu machen.


scooter010 schrieb:
bestimmt, srand % 40 um eine zufällige Zahl von 1-40 zu bekommen und dann mit

C++:
int naechsteFrage(int* gestellteFragen){
    int gewuerfelteFrage = srand%40;

    for(int i = 0; i<15; i++){
        if(gestellteFragen[i] != gewuerfelteFrage) // Diese Notation, da sie besser für Sprungvorhersage der CPU ist, also leicht schneller abläuft
        else
            naechsteFrage;
    }
    return gewuerfelteFrage;
}

Das schaut gut aus und ist aus meiner Sicht auch verständlich. Ich werde es mal morgen probieren. Danke auf jeden Fall nochmal für eure Bemühungen.

Ich merk btw. dass ich das alles besser verstehe, wenn ich hier frage oder auch selber recherchiere statt alles zwei stunden lang erzählt zu bekommen. :D
 
Freut mich, helfen zu können. Bitte schaue dir nochmal meinen 2 Edith an. Ich habe die Klammern vergessen beim Aufruf von "naechsteFrage()", ist also keine Variable sondern hier erfolgt der rekursive Funktionsaufruf.
 
  • Gefällt mir
Reaktionen: my1096
Naja, jetzt habe ich es fast komplett programmiert........ lol

C++:
struct fragestellung{
    string Frage;
    string Antw1;
    string Antw2;
    string Antw3;
    string Antw4;
    int korrekteAntwort
} fragenkatalog[40];

int gestellt[15];
int Punkte = 0;

int naechsteFrage(int* gestellteFragen){
    int gewuerfelteFrage = srand()%40;
    for(int i = 0; i<15; i++){
        if(gestellteFragen[i] != gewuerfelteFrage) // Diese Notation, da sie besser für Sprungvorhersage der CPU ist, also leicht schneller abläuft
        else
            gewuerfelteFrage = naechsteFrage(gestellteFragen);
    }
    return gewuerfelteFrage;
}

int main(){
    // Textausgabe, Begrüßug, blabla
    for(i = 0; i<15; i++){
        gestellt[i] = naechsteFrage(gestellt);
        //Textausgabe von fragenkatalog[gestellt[i]].frage und fragenkatalog[gestellt[i]].antw1 ...
        if(fragenkatalog[gestellt[i]].korrekteAntwort == /*Benutzereingabe*/)
            punkte += (i+1);
        else
            break;
    }
    //Textausgabe erreichte Punktzahl
}
 
Zuletzt bearbeitet:
scooter010 schrieb:
Naja, jetzt habe ich es fast komplett programmiert........ lol

C++:
struct fragestellung{
    string Frage;
    string Antw1;
    string Antw2;
    string Antw3;
    string Antw4;
    int korrekteAntwort
} fragenkatalog[40];

int gestellt[15];
int Punkte = 0;

int naechsteFrage(int* gestellteFragen){
    int gewuerfelteFrage = srand%40;
    for(int i = 0; i<15; i++){
        if(gestellteFragen[i] != gewuerfelteFrage) // Diese Notation, da sie besser für Sprungvorhersage der CPU ist, also leicht schneller abläuft
        else
            naechsteFrage(gestellteFragen);
    }
    return gewuerfelteFrage;
}

int main(){
    // Textausgabe, Begrüßug, blabla
    for(i = 0; i<15; i++){
        gestellt[i] = naechsteFrage(gestellt);
        //Textausgabe von fragenkatalog[gestellt[i]].frage und fragenkatalog[gestellt[i]].antw1 ...
        if(fragenkatalog[gestellt[i]].korrekteAntwort == /*Benutzereingabe*/)
            punkte += (i+1);
        else
            break;
    }
    //Textausgabe erreichte Punktzahl
}


srand gibt bei mir ne Fehlermeldung. "Invalid operands to binary expression ('void (*)(unsigned int)' and 'int')"

ctime ist eingebunden. eventuell mit srand(( unsigned )time( NULL))?
 
Ich muss gestehen, ich habe keine Lust jetzt noch die "Fleißarbeit" der richtigen Initialisierung der Funktionen und Deklaration Namensräume sowie benötigter include zu machen. Einfach mal http://www.cplusplus.com/reference/cstdlib/srand/ schauen.
Ergänzung ()

Kleiner Fehler:
C++:
int naechsteFrage(int* gestellteFragen){
    int gewuerfelteFrage = srand()%40; //<---- Noch nen kleiner Fehler
    for(int i = 0; i<15; i++){
        if(gestellteFragen[i] != gewuerfelteFrage)
        else
            gewuerfelteFrage = naechsteFrage(gestellteFragen); // <-- Änderung
    }
    return gewuerfelteFrage;
}
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: my1096
Zurück
Oben