Spiel: Wer wird Millionär



  • N'Abend,

    ich bin gerade dabei das Spiel "Wer wird Millionär" in C++ zu programmieren und bin für mein anfängliches Wissen, wie ich finde, schon recht weit gekommen.

    Ich bin nur an einen Punkt angelangt an dem ich alleine nicht mehr weiter weiß. Wie sicherlich bekannt ist gibt es in dem genannten Spiel den Joker "50:50"; dessen Implementierung verfolge ich zur Zeit.

    Leider habe ich nur Grundkenntnisse und würde mir nun gerne Anregungen und Hinweise zu einer möglichen Lösung in diesem Forum einholen, aus diesem Grund habe ich mich hier auch registriert.

    _________________________________________________________________________

    Hier der bisherige Sourcecode:

    //---------------------------------------------------------------------------
    
    #include <vcl.h>
    #pragma hdrstop
    
    #include "Unit1_Millionaer.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    
    //Globale Deklarationen
    
    char* Antwort;
    char* Titel;
    String Hilfen[3]; // 3 Joker werden benötigt
    bool Wahl[3]; // Kennt nur die Werte "true" & "false"
    String Fragen [6][5];
    int positionderrichtigenantwort[6];
    int gegAntwort=0;
    
    TForm1 *Form1;
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
            : TForm(Owner)
    {
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm1::CheckBox3Click(TObject *Sender)
    {
    CheckBox3->Enabled =false;   //Joker nur 1x einsetzbar
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm1::FormCreate(TObject *Sender)
    {
    
    randomize();  // Wirkliche(!) Zufallszahlen generieren
    
    Hilfen[0] = " Publikum";
    Hilfen[1] = " Telefon";
    Hilfen[2] = " 50:50";
    
    Fragen [0][0] = "Gegen wen setzte sich Bonn\n1949 bei der Wahl der Bundeshauptstadt durch?";
    Fragen [0][1] = "Frankfurt am Main";
    Fragen [0][2] = "Jamaica";
    Fragen [0][3] = "Berlin";
    Fragen [0][4] = "Hongkong";
    
    Fragen [1][0] = "Welches der sieben Weltwunder gibt es heute noch?";
    Fragen [1][1] = "Die Pyramiden von Gizeh in Ägypten";
    Fragen [1][2] = "Die Zeusstatue des Phidias von Olympia";
    Fragen [1][3] = "Die hängenden Gärten der Semiramis zu Babylon";
    Fragen [1][4] = "Der Leuchtturm auf der Insel Pharos vor Alexandria";
    
    Fragen [2][0] = "Wer ist Erstbesteiger des Mount Everest?";
    Fragen [2][1] = "Edmund Hillary";
    Fragen [2][2] = "Michael Schumacher";
    Fragen [2][3] = "Angela Merkel";
    Fragen [2][4] = "Danzel Washington";
    
    Fragen [3][0] = "Wie beginnt die 2. Strophe\nder deutschen Nationalhymne?";
    Fragen [3][1] = ",... deutsche Frauen, deutscher Wein";
    Fragen [3][2] = "Einigkeit und Recht und Freiheit";
    Fragen [3][3] = "Blüh im Glanze dieses Glückes,";
    Fragen [3][4] = "Leider die falsche Antwort";
    
    Fragen [4][0] = "Wie lauten die Dezimalstellen von PI?";
    Fragen [4][1] = "3,14159";
    Fragen [4][2] = "1,3426";
    Fragen [4][3] = "2,8414";
    Fragen [4][4] = "4,5903";
    
    Fragen [5][0] = "Wo befindet sich der Sitz der UNO?";
    Fragen [5][1] = "New York";
    Fragen [5][2] = "Washington";
    Fragen [5][3] = "Los Angeles";
    Fragen [5][4] = "Brüssel";
    
    RadioGroup1->ItemIndex = 0;
    }
    
    //---------------------------------------------------------------------------
    
    void __fastcall TForm1::RadioGroup1Click(TObject *Sender)
    {
    String gemAntwort[5];//Antworten in gemischter Reihenfolge, bei der die erste nicht díe Richtige ist
    for(int i2=0;i2<5;i2++)//Schreibt leere Antworten in die Arrays
    {
    gemAntwort[i2]="";
    }
    
    for(int i=1;i<5;i++)//Lese eine Antwortmöglichkeit vom Array [Fragen] aus und schreibe diese
                        //in eine andere Array [gemAntwort], in zufälliger Reihenfolge
    {
            int randNR=0;//randNR = zufällig generierte Zahl
            do
            {
    
                    randNR=1+random(4);//.., wird immer um eins erhöht, damit nicht Null generiert wird und max. bis 4 zählt
            }
            while(gemAntwort[randNR]!="");//Das mache solange wie in der Antwort an der Stelle von randNr nichts steht
    
            gemAntwort[randNR]=Fragen[RadioGroup1->ItemIndex][i];
            if (i==1)positionderrichtigenantwort[RadioGroup1->ItemIndex]=randNR;
            /*Wenn die Position 1 ist, dann steht an der randNr die richtige Antwort*/
    }
    
    Panel1->Caption = gemAntwort[1];//Dann schreibe dies auf die Panels
    Panel1->Color = clBtnFace;
    Panel2->Caption = gemAntwort[2];
    Panel2->Color = clBtnFace;
    Panel3->Caption = gemAntwort[3];
    Panel3->Color = clBtnFace;
    Panel4->Caption = gemAntwort[4];
    Panel4->Color = clBtnFace;
    
    Label1->Caption= Fragen[RadioGroup1->ItemIndex][0];
    
      switch(RadioGroup1->ItemIndex)
      {
       case 0: Antwort = "Frankfurt am Main"; break;
       case 1: Antwort = "Die Pyramiden von Gizeh in Ägypten"; break;
       case 2: Antwort = "Edmund Hillary"; break;
       case 3: Antwort = ",... deutsche Frauen, deutscher Wein"; break;
       case 4: Antwort = "3,14159"; break;
       case 5: Antwort = "New York";
      }
      }
    //---------------------------------------------------------------------------
    
    //---------------------------------------------------------------------------
    
    void __fastcall TForm1::Panel1Click(TObject *Sender)
    {
    gegAntwort=1;
    Panel1->Color =clLime;
    Panel2->Color =clBtnFace;
    Panel3->Color =clBtnFace;
    Panel4->Color =clBtnFace;
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm1::CheckBox1Click(TObject *Sender)
    {
    CheckBox1->Enabled =false;   //Joker nur 1x einsetzbar
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm1::CheckBox2Click(TObject *Sender)
    {
    CheckBox2->Enabled =false;   //Joker nur 1x einsetzbar
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm1::Panel2Click(TObject *Sender)
    {
    gegAntwort=2;
    Panel2->Color =clLime;
    Panel1->Color =clBtnFace;
    Panel3->Color =clBtnFace;
    Panel4->Color =clBtnFace;
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm1::Panel3Click(TObject *Sender)
    {
    gegAntwort=3;
    Panel3->Color =clLime;
    Panel2->Color =clBtnFace;
    Panel1->Color =clBtnFace;
    Panel4->Color =clBtnFace;
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm1::Panel4Click(TObject *Sender)
    {
    gegAntwort=4;
    Panel4->Color =clLime;
    Panel2->Color =clBtnFace;
    Panel3->Color =clBtnFace;
    Panel1->Color =clBtnFace;
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
    switch(positionderrichtigenantwort[RadioGroup1->ItemIndex])
    /*Wenn ausgewählte Antwort die Position der richtigen Antwort entspricht, dann ....*/
    {
    case 1:Panel1->Color=clLime;break;
    case 2:Panel2->Color=clLime;break;
    case 3:Panel3->Color=clLime;break;
    case 4:Panel4->Color=clLime;
    
    }
    if(gegAntwort==positionderrichtigenantwort[RadioGroup1->ItemIndex])
    {
    
     Wahl[0] = CheckBox1->Checked;
     /*Ausgabe einer MessageBox, in der die Überschrift + Inhalt vollkommen variabel sind
     lediglich die Bezeichnung der MessageBox ist mit  "Benutzte Hilfen:" statisch, alles weitere ist variabel*/
     Wahl[1] = CheckBox2->Checked;
     Wahl[2] = CheckBox3->Checked;
     String Ueberschrift = "Benutzte Hilfen:";
     for (int Nr=0; Nr<3; Nr++)
     if (Wahl[Nr] == true) Ueberschrift = Ueberschrift + Hilfen[Nr];
     Titel = Ueberschrift.c_str();
     Application->MessageBox(Antwort,Titel,0+64);
    
    }
    else
    {
    switch(gegAntwort)
    {
    case 1:Panel1->Color=clRed;break;
    case 2:Panel2->Color=clRed;break;
    case 3:Panel3->Color=clRed;break;
    case 4:Panel4->Color=clRed;
    }
    
     Wahl[0] = CheckBox1->Checked;
     /*Ausgabe einer MessageBox, in der die Überschrift + Inhalt vollkommen variabel sind
     lediglich die Bezeichnung der MessageBox ist mit  "Benutzte Hilfen:" statisch, alles weitere ist variabel*/
     Wahl[1] = CheckBox2->Checked;
     Wahl[2] = CheckBox3->Checked;
     String Ueberschrift = "Benutzte Hilfen:";
     for (int Nr=0; Nr<3; Nr++)
     if (Wahl[Nr] == true) Ueberschrift = Ueberschrift + Hilfen[Nr];
     Titel = Ueberschrift.c_str();
      Application->MessageBox(Antwort,Titel,0+64);
    
      ProgressBar1->StepBy(1);//Optische Fortschrittsanzeige
    }
    }
    //---------------------------------------------------------------------------
    

    Hier Bilder von der Form zur Verdeutlichung:
    Bild 1: http://img121.imageshack.us/i/form1u.png/
    Bild 2: http://img525.imageshack.us/i/form1inuse.png/

    Gruß Chris (:



  • so ganz weiss ich noch nicht, was deine Frage nun ist?!?



  • Was hast du denn für ein Problem mit dem 50:50-Joker?

    Du musst erstmal schauen, welche Antworten falsch sind und unter denen wählst du zufällig zwei aus.

    Mach doch mal einen Implementierungsvorschlag, im Zweifelsfall in Pseudocode.



  • Das gehört übrigens in VCL-Forum...



  • _matze schrieb:

    Das gehört übrigens in VCL-Forum...

    Haben wir sowas? 😕 Habs jetzt nicht gefunden...
    Und da es eigentlich ja nur um den 50/50-Joker-Algorithmus geht kanns auch hier bleiben...



  • pumuckl schrieb:

    _matze schrieb:

    Das gehört übrigens in VCL-Forum...

    Haben wir sowas? 😕 Habs jetzt nicht gefunden...

    http://www.c-plusplus.net/forum/viewforum-var-f-is-2.html



  • pumuckl schrieb:

    Haben wir sowas? 😕 Habs jetzt nicht gefunden...

    Ja. 😮

    pumuckl schrieb:

    Und da es eigentlich ja nur um den 50/50-Joker-Algorithmus geht kanns auch hier bleiben...

    Akzeptiert.



  • Nunja, das Grundgerüst habe ich ja bereits geschaffen.
    Die Funktionsweise des 50:50 Jokers und wie dies in der Theorie im Programm umgesetzt werden sollte kenne ich auch, nur eben die Praxis ist mir ein Rätsel.

    Das Problem besteht nun nur darin wie schreibe ich den Code, dass 2 falsche Antworten, natürlich immer verschieden und niemals die richtigen gestrichen/ausgeblendet werden.

    Gruß Chris



  • Hallo

    Du weißt doch welche Antworten falsch und richtig sind. Aus den drei falschen wählst du per Zufall zwei aus und fertig.

    chrische



  • blueangel1610 schrieb:

    Das Problem besteht nun nur darin wie schreibe ich den Code, dass 2 falsche Antworten, natürlich immer verschieden und niemals die richtigen gestrichen/ausgeblendet werden.

    nimm die richtige und eine falsche, und blende die anderen beiden aus



  • zwutz schrieb:

    http://www.c-plusplus.net/forum/viewforum-var-f-is-2.html

    _matze schrieb:

    Ja. 😮

    Memo an mich selbst: Brille kaufen, nachts mehr schlafen. Kann nur besser werden.

    @Topic: Wenn du es in der Theorie so genau weißt, dann schreib doch mal Punkt für Punkt auf, wie du es in der Theorie machen würdest - und bei welchem Punkt dann die Umsetzung in die Praxis nicht gelingt.



  • Bei Frage 4 würde ich irgendwas antworten und später müsste Herr Jauch sich bei mir entschuldigen
    und mich wieder zu seiner Sendung einladen 😋



  • Hallöchen (:,

    ich melde mich zurück mit der Lösung zum 50:50 Joker 😉
    Primär habe ich ja nun das Ziel erreicht, interessieren würde mich nunmehr noch, wie man diesen Quellcode vereinfachen oder auf andere Art und Weise realisieren könnte.

    Würde mich auf eure Antworten freuen (:

    _________________________________________________________

    void __fastcall TForm1::CheckBox3Click(TObject *Sender)
    {
    CheckBox3->Enabled =false;   //Joker nur 1x einsetzbar
    
            int randfifty=0;//randNR = zufällig generierte Zahl
            do
            {
                    randfifty=1+random(4);//
            }
            while(positionderrichtigenantwort[RadioGroup1->ItemIndex]==randfifty);//
    
            switch(randfifty)
            {
            case 1: Panel1->Enabled=false;Panel1->Color=clBtnFace; break;
            case 2: Panel2->Enabled=false;Panel2->Color=clBtnFace; break;
            case 3: Panel3->Enabled=false;Panel3->Color=clBtnFace; break;
            case 4: Panel4->Enabled=false;Panel4->Color=clBtnFace;
            }
    
            int randfifty2=0;//randNR = zufällig generierte Zahl
            do
            {
                    randfifty2=1+random(4);//
            }
            while(positionderrichtigenantwort[RadioGroup1->ItemIndex]==randfifty2);//
    
            switch(randfifty2)
            {
            case 1: Panel1->Enabled=false;Panel1->Color=clBtnFace; break;
            case 2: Panel2->Enabled=false;Panel2->Color=clBtnFace; break;
            case 3: Panel3->Enabled=false;Panel3->Color=clBtnFace; break;
            case 4: Panel4->Enabled=false;Panel4->Color=clBtnFace;
            }
    
    }
    


  • #include <cassert> //kommt neu dazu (wegen des makros assert)
    
    int get_random_number(int max, int not1 = -1, int not2 = -1)
    {
      int R;
      do
      {
        R = random(max)+1;
      } while(R != not1 && R != not2);
    
      return R;
    }
    
    void disable_answer(int what)
    {
      assert(what < 5 && what > 0);
      TPanel *panels[4];
      panels[0] = Panel1;
      panels[1] = Panel2;
      panels[2] = Panel3;
      panels[3] = Panel4;
    
      panels[what]->Enabled=false;
      panels[what]->Color=clBtnFace;
    }
    
    void __fastcall TForm1::CheckBox3Click(TObject *Sender) 
    {
      CheckBox3->Enabled =false;   //Joker nur 1x einsetzbar 
      const int right_answer = positionderrichtigenantwort[RadioGroup1->ItemIndex];
    
      int randfifty = get_random_number(4, right_answer);
      disable_answer(randfifty);
    
      randfifty = get_random_number(4, right_answer, randfifty);
      disable_answer(randfifty);
    }
    

    so würd ichs vermutlich lösen

    bb



  • Erkenne ich das richtig und Du erstellst deine eigenen Klassen?
    Ich frage deshalb, weil ich das bei einem Kollegen in ähnlicher Form schon einmal gesehen habe.

    Ich würde mich darüber freuen, wenn Du deinen Code, sofern es Dir zeitlich möglich ist ein bisschen besser kommentierst, zur Verständlichkeit und zum nachvollziehen.

    Danke 🙂



  • einfacher wäre es einfach eine von den falschen auszuwählen, als zwei rauszuwerfen



  • Hallöchen (;

    Ich darf mit Stolz verkünden das ich nun eine neuere Version von WWM entwickelt und lauffähig bekommen habe.

    Hier der Code:

    //---------------------------------------------------------------------------
    
    #include <vcl.h>
    #pragma hdrstop
    
    #include "Unit1.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    
    //Globale Deklarationen
    TForm1 *Form1;
    
    int Nr, Nr2; // Speichert zufällig generierte Zahlen
    
    TStringList *FrageObjekt;//Deklaration des Frageobjektes
    TStringList *AntwortObjekt; //Deklaration des Antwortbjektes
    TStringList *BewertungenObjekt; //Deklaration des Bewertungsobjektes
    
    const String DateiFragenName = "Fragen.txt";
    const String DateiAntwortenName = "Antworten.txt";
    const String DateiBewertungenName = "Bewertungen.txt";
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
            : TForm(Owner)
    {
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm1::FormCreate(TObject *Sender)
    {
    randomize(); // Generiert Zufallszahl
    
      FrageObjekt = new TStringList; //Erstellen des 1. Objektes
      AntwortObjekt = new TStringList;
      BewertungenObjekt = new TStringList;
    
      try
      {
      FrageObjekt->LoadFromFile(DateiFragenName);
      AntwortObjekt->LoadFromFile(DateiAntwortenName);
      }
      catch(...)
      {
        FrageObjekt->Add("Keine Frage geladen!!!");
      }
    
      Panel_Frage->Caption = FrageObjekt->Text; 
      Label1->Caption = FrageObjekt->Count; //Es wird die Anzahl der Fragen ausgegeben
    
      Scrollbar1->Max = FrageObjekt->Count - 1;
    
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
      Nr = random(FrageObjekt->Count);
      // Abhängig von [Nr] wird Frage aus dem FrageObjekt ausgegeben
    
      Panel_Frage->Caption = FrageObjekt->Strings[Nr];
      //Auf dem Panel wird nun abhängig von dem FrageObjekt, welches wieder von
      //der zufälligen Variable "Nr" abhängt, ausgegeben
    
      Edit_Antwort->SetFocus();// Setzt Fokus auf Edit-Feld (Antwort)
    
      Nr2=Nr; // Wertezuweisung
      do
      {
      Nr=random(FrageObjekt->Count);
      }
      while (Nr==Nr2);
    
      Panel_Frage->Caption = FrageObjekt->Strings[Nr];
      Scrollbar1->Position=Nr;
      //Do-While: Es wird ausgeschlossen das sich die Frage 2x hintereinander wdh.
      Panel_Bewertung->Color=clBtnFace;
      Panel_Bewertung->Caption="";
    
      Edit_Antwort->Text = "Bitte geben Sie hier Ihre Antwortmöglichkeit ein!";
    
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Scrollbar1Change(TObject *Sender)
    {
    
      Nr = random(FrageObjekt->Count);
      Scrollbar1->Position = (Nr);
      Panel_Frage->Caption = FrageObjekt->Strings[Nr];
    
      //--Es wird abhängig von der Position der Scrollbar noch keine
      //zufällige Frage auf dem Panel angezeigt
    
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Button2Click(TObject *Sender)
    {
    String data;
    
    {
       data = Edit_Antwort->Text;
       data = AnsiLowerCase(data);
       if(data == AntwortObjekt->Strings[Scrollbar1->Position])
            {
            Panel_Bewertung->Caption = "Richtig!!!";
            Panel_Bewertung->Color=clLime;
            }
            else
            {
            Panel_Bewertung->Caption = "Falsch!!!";
            Panel_Bewertung->Color=clRed;
            }
            }
            }
    
    //---------------------------------------------------------------------------
    

    Mein gesamtes Projekt, geschrieben mit dem Borland-Builder v6 hab' ich hier => http://file.qip.ru/file/112189108/2b908397/Scrollbar_v3.html nichmal hochgeladen.

    Mein weiteres Ziel das ich nun verfolge, bei dem ich Eure Hilfe brauche, ist eine Statistik über die falschen und richtigen Antworten (in einer MessageBox) durch den Klick auf einen Button "Statistik auswerten" anzeigen zu lassen.

    Ansätze zur Realisierung sind sehr willkommen.

    Gruß
    Chris



  • blueangel1610 schrieb:

    Ansätze zur Realisierung sind sehr willkommen.

    Für die Ansätze bist du selber zuständig (Stichwort: Eigeninitiative zeigen). Wenn du bei der Umsetzung Probleme hast oder es an anderer Stelle hakt, wird dir natürlich gerne geholfen.



  • Dann poste ich mal das worüber ich mir so in meinem Brain schon Gedanken gemacht habe.

    Ich brauche zwei Integer-Variablen die jedes mal die richtige oder die falsche Antwort mitzählen und dann nach dem Klick auf "Auswerten" dann die MsgBox mit den Nummern ausgibt -- Soweit richtig gedacht?



  • Probiers doch einfach aus?
    Oft gehört es dazu einen Ansatz auszu probieren und wenn er sich als falsch heraus stellen soll, dann merkst du das selbst und dann weisst auch gleich, wie dus besser machen kannst.

    Also einfach mal probieren und wenn du per se nicht weiter kommst mit deinem Problem, DANN helfen wir dir. Aber denken musst du schon selbst. Das übernehmen wir hier nicht für dich!


Anmelden zum Antworten