Quiz Wer wird Milionär? mit C

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Quiz Wer wird Milionär? mit C

    Hallo zusammen,

    ich habe folgendes Problem:
    In meinem Studium mus ich zusammen mit einem Kollegen ein Programm in C schreiben, in diesem Programm müssen gewisse Elemmente verwendet werden (was genau ist fürs erste nicht so wichtig).Ich habe noch nicht viel Ahnung von der Materie, da es zum großen Teil Neuland für mich ist.

    1. Jedenfalls wollen wir "Wer wird Millionär?" umsetzten und haben uns vorgestellt eine Art Datenbank zu konstruieren, in der die Fragen untergebracht sind.
    -Ist das überhaupt möglich??

    2. Die Fragen sollen aus 3 Stufen (leicht, mittel, schwer) per Zufallsgenerator (evt. rand(..)?) ausgewählt werden.
    - Wie könnt ich das machen und die Antworten müssen ja auch irgendwie zu den Fragen passen und dann muss die korrekte Antwort auch noch irgendwie markiert sein...

    Ich weiß momentan nicht weiter und würde mich echt freuen, wenn mir jemand weiterhelfen kann.

    Schönen Gruß
    Chen
  • Ja, ich weiß mehr oder weniger was wichtig ist, aber ich weiß eben nicht wie ich es umsetzen kann. Habe schon versucht 3 Strukturen für die Kategoien zu machen, aber dennoch bleibt das Problem wie ich die Fragen dann per Zufall einbinden kann.
    Ich bin eben nur auf dem Wissensstand, dass ich mit struct die Fragen quasi ablegen kann, aber wie ich dann gezielt inkl. der Antworten auf die zugreiden kann bleibt mir ein Rätsel...
  • Habe nun mal folgendes gemacht, die Strukturen habe ich in eine Headerdatei geschrieben und sie dann in die C-Quelldatei eingebunden:

    die Quelldatei:

    Quellcode

    1. //benutzte include-Dateien
    2. #include <stdio.h> // Standardfunktionen Ein- und Ausgabe
    3. #include <conio.h> // Standardfunktionen Tastatur und Bildschirm
    4. #include <math.h> // mathematische Standardfunktion
    5. #include <string.h> //
    6. #include "strukturen.h" // Strukturen des Fragenpools und Prototypen
    7. int main (void)
    8. {
    9. struct leicht cont;
    10. printf("1. Frage 100 Eturo:\n\n");
    11. printf("%s\n\n",cont.frage1);
    12. printf("%s\t\t",cont.antwort1_1);
    13. printf("%s\t\t",cont.antwort1_2);
    14. printf("\n%s\t\t",cont.antwort1_3);
    15. printf("%s\t",cont.antwort1_4);
    16. getch();
    17. return 0;
    18. }
    Alles anzeigen


    die Headerdatei:

    Quellcode

    1. #include <stdio.h>
    2. #include <conio.h>
    3. #include <string.h>
    4. struct leicht
    5. {
    6. char frage1[50];
    7. char antwort1_1[30];
    8. char antwort1_2[30];
    9. char antwort1_3[30];
    10. char antwort1_4[30];
    11. char frage2[50];
    12. char antwort2_1[30];
    13. char antwort2_2[30];
    14. char antwort2_3[30];
    15. char antwort2_4[30];
    16. char frage3[50];
    17. char antwort3_1[30];
    18. char antwort3_2[30];
    19. char antwort3_3[30];
    20. char antwort3_4[30];
    21. char frage4[50];
    22. char antwort4_1[30];
    23. char antwort4_2[30];
    24. char antwort4_3[30];
    25. char antwort4_4[30];
    26. }leicht;
    27. struct mittel
    28. {
    29. char frage1[50];
    30. char antwort1_1[30];
    31. char antwort1_2[30];
    32. char antwort1_3[30];
    33. char antwort1_4[30];
    34. char frage2[50];
    35. char antwort2_1[30];
    36. char antwort2_2[30];
    37. char antwort2_3[30];
    38. char antwort2_4[30];
    39. char frage3[50];
    40. char antwort3_1[30];
    41. char antwort3_2[30];
    42. char antwort3_3[30];
    43. char antwort3_4[30];
    44. char frage4[50];
    45. char antwort4_1[30];
    46. char antwort4_2[30];
    47. char antwort4_3[30];
    48. char antwort4_4[30];
    49. }mittel;
    50. struct schwer
    51. {
    52. char frage1[50];
    53. char antwort1_1[30];
    54. char antwort1_2[30];
    55. char antwort1_3[30];
    56. char antwort1_4[30];
    57. char frage2[50];
    58. char antwort2_1[30];
    59. char antwort2_2[30];
    60. char antwort2_3[30];
    61. char antwort2_4[30];
    62. char frage3[50];
    63. char antwort3_1[30];
    64. char antwort3_2[30];
    65. char antwort3_3[30];
    66. char antwort3_4[30];
    67. char frage4[50];
    68. char antwort4_1[30];
    69. char antwort4_2[30];
    70. char antwort4_3[30];
    71. char antwort4_4[30];
    72. };
    73. int main (void)
    74. {
    75. struct leicht cont;
    76. strcpy(cont.frage1,"text text text text");
    77. strcpy(cont.antwort1_1,"a) text");
    78. strcpy(cont.antwort1_2,"b) text");
    79. strcpy(cont.antwort1_3,"c) text");
    80. strcpy(cont.antwort1_4,"d) text");
    81. getch();
    82. return 0;
    83. }
    Alles anzeigen


    das ist natürlich noch nicht fertig ;)
    Jedenfalls möchte ich mit strcpy(...) den Strukturkomponenten Zeichenketten zuweisen.
    Das Problem ist allerdings, dass ich wohl 2 main() Funktionen habe und daher folgende Fehlermeldung kommt:

    Quellcode

    1. Fehler 7 error C2084: Funktion 'int main(void)' hat bereits einen Funktionsrumpf


    Was könnte ich tun, damit ich in der header-Datei allen Komponenten die Zeichenketten (die Fragen) zuordnen kann und in der Quelldatei dann diese nur noch aufrufen brauch??
  • Quellcode

    1. struct schwer
    2. {
    3. char frage1[50] = "text";
    4. char antwort1_1[30] = "text";
    5. char antwort1_2[30] = "text";
    6. char antwort1_3[30] = "text";
    7. char antwort1_4[30] = "text";
    8. char frage2[50] = "text";
    9. char antwort2_1[30] = "text";
    10. char antwort2_2[30] = "text";
    11. char antwort2_3[30] = "text";
    12. char antwort2_4[30] = "text";
    13. char frage3[50] = "text";
    14. char antwort3_1[30] = "text";
    15. char antwort3_2[30] = "text";
    16. char antwort3_3[30] = "text";
    17. char antwort3_4[30] = "text";
    18. char frage4[50] = "text";
    19. char antwort4_1[30] = "text";
    20. char antwort4_2[30] = "text";
    21. char antwort4_3[30] = "text";
    22. char antwort4_4[30] = "text";
    23. };
    Alles anzeigen


    Alternativ kannst du soweit ich weiß in C auch für structs einen Konstruktor schreiben:

    Quellcode

    1. struct schwer
    2. {
    3. schwer();
    4. char frage1[50];
    5. char antwort1_1[30];
    6. char antwort1_2[30];
    7. char antwort1_3[30];
    8. char antwort1_4[30];
    9. char frage2[50];
    10. char antwort2_1[30];
    11. char antwort2_2[30];
    12. char antwort2_3[30];
    13. char antwort2_4[30];
    14. char frage3[50];
    15. char antwort3_1[30];
    16. char antwort3_2[30];
    17. char antwort3_3[30];
    18. char antwort3_4[30];
    19. char frage4[50];
    20. char antwort4_1[30];
    21. char antwort4_2[30];
    22. char antwort4_3[30];
    23. char antwort4_4[30];
    24. };
    25. void schwer::schwer (void)
    26. {
    27. strcpy(frage1,"text text text text");
    28. strcpy(antwort1_1,"a) text");
    29. strcpy(antwort1_2,"b) text");
    30. strcpy(antwort1_3,"c) text");
    31. strcpy(antwort1_4,"d) text");
    32. }
    Alles anzeigen
  • Wenn ich es so mache:

    Quellcode

    1. struct leicht
    2. {
    3. char frage1[50] = "Text";
    4. char antwort1_1[30] = "Text";
    5. char antwort1_2[30] = "Text";
    6. char antwort1_3[30] = "Text";
    7. char antwort1_4[30] = "Text";
    8. }leicht;


    kommt folgednde Fehlermeldung:

    Fehler 1 error C2864: "leicht::frage1": Nur statische konstante integrale Datenmember können innerhalb einer Klasse initialisiert werden.
    Fehler 2 error C2864: "leicht::antwort1_1": Nur statische konstante integrale Datenmember können innerhalb einer Klasse initialisiert werden.
    Fehler 3 error C2864: "leicht::antwort1_2": Nur statische konstante integrale Datenmember können innerhalb einer Klasse initialisiert werden.
    Fehler 4 error C2864: "leicht::antwort1_3": Nur statische konstante integrale Datenmember können innerhalb einer Klasse initialisiert werden.
    Fehler 5 error C2864: "leicht::antwort1_4": Nur statische konstante integrale Datenmember können innerhalb einer Klasse initialisiert werden.
  • "Chen" schrieb:

    Wenn ich es so mache:

    Quellcode

    1. struct leicht
    2. {
    3. char frage1[50] = "Text";
    4. char antwort1_1[30] = "Text";
    5. char antwort1_2[30] = "Text";
    6. char antwort1_3[30] = "Text";
    7. char antwort1_4[30] = "Text";
    8. }leicht;


    kommt folgednde Fehlermeldung:

    Fehler 1 error C2864: "leicht::frage1": Nur statische konstante integrale Datenmember können innerhalb einer Klasse initialisiert werden.
    Fehler 2 error C2864: "leicht::antwort1_1": Nur statische konstante integrale Datenmember können innerhalb einer Klasse initialisiert werden.
    Fehler 3 error C2864: "leicht::antwort1_2": Nur statische konstante integrale Datenmember können innerhalb einer Klasse initialisiert werden.
    Fehler 4 error C2864: "leicht::antwort1_3": Nur statische konstante integrale Datenmember können innerhalb einer Klasse initialisiert werden.
    Fehler 5 error C2864: "leicht::antwort1_4": Nur statische konstante integrale Datenmember können innerhalb einer Klasse initialisiert werden.


    da war was ...
    enteder du nimmst di Version mit Konstruktor oder machst die alle static + const
  • ich hab vor Jahren mal was ganz Ahnliches erstellt.

    Spiel heißt "Wer wird gewinnen?".

    10 Fragen pro Spiel (3 leichte, 4 mittlere, 3 schwere)
    Die Fragen werden jeweils aus dem entsprechenden Fragenpool per Zufall ausgewählt. Pro Spiel kommen so keine doppelten Fragen zustande. Quelltext hab ich jetzt nicht da, würde dir aber eh nix bringen, da Pascal.

    Vll. willst du dir ja trotzdem mal ansehen, wie sowas fertig aussehen kann.
    Das Quizfenster muss nach dem starten der Datei mit ALT+ENTER maximiert werden.
    Joker konnte ich leider nicht mehr unterbringen, da nach 4000 Zeilen Schluss ist bei Pascal :roll:
    Du kannst aber die Fragen in Textdateien schreiben und dann "einlesen lassen" vom Programm. Dann kann sich der "Kandidat" natürlich aber schon im Vorfeld die Fragen ansehen, deshalb hab ich das gelassen.

    Was du vll bei deinem Quiz beachten solltest: Bei mir sind zwar die Fragen "zufällig" ausgewählt, falls diese Frage aber beim nächsten Spiel nochmal auftauchst ist die richtige Lösung wieder an der gleichen Stelle. Das könnte man besser machen.

    Downloaden kannst du das Spiel hier:

    http://bluestyler1.fortunecity.de/wwg.htm

    Gruß,

    cewbie
  • Hier ist eine generische Variante für dein Problem:

    Quellcode

    1. #include <stdlib.h>
    2. #include <string.h>
    3. #include <assert.h>
    4. typedef struct _question_t {
    5. char* question;
    6. unsigned int answerCount;
    7. char** answers;
    8. } question_t;
    9. question_t* newQuestion (unsigned int nNumberOfAnswers)
    10. {
    11. question_t* pQuestion;
    12. unsigned int i; // added
    13. assert (nNumberOfAnswers > 0);
    14. pQuestion = (question_t*) malloc (sizeof (question_t));
    15. pQuestion->question = NULL;
    16. pQuestion->answerCount = nNumberOfAnswers;
    17. pQuestion->answers = (char**) malloc (nNumberOfAnswers * sizeof (char*));
    18. for (i = 0; i < nNumberOfAnswers; ++i) // added
    19. pQuestion->answers[i] = NULL; // added
    20. return pQuestion;
    21. }
    22. void deleteQuestion (question_t* pQuestion)
    23. {
    24. if (pQuestion)
    25. {
    26. unsigned int i;
    27. if (pQuestion->question)
    28. free (pQuestion->question);
    29. for (i = 0; i < pQuestion->answerCount; ++i)
    30. if (pQuestion->answers[i])
    31. free (pQuestion->answers[i]);
    32. free (pQuestion->answers);
    33. }
    34. }
    35. void setQuestion (question_t* pQuestion, const char* pString)
    36. {
    37. assert (pQuestion);
    38. if (pQuestion->question)
    39. free (pQuestion->question);
    40. pQuestion->question = strdup (pString);
    41. }
    42. void setAnswer (question_t* pQuestion, unsigned int nIndex, const char* pString)
    43. {
    44. assert (pQuestion);
    45. assert (nIndex < pQuestion->answerCount);
    46. if (pQuestion->answers[nIndex])
    47. free (pQuestion->answers[nIndex]);
    48. pQuestion->answers[nIndex] = strdup (pString);
    49. }
    Alles anzeigen


    Mögliche Aufrufe:

    Quellcode

    1. question_t* p = newQuestion (4);
    2. setQuestion (p, "Wie?"); // war mal ein Fehler in dieser Zeile
    3. setAnswer (p, 0, "a");
    4. setAnswer (p, 1, "a");
    5. setAnswer (p, 2, "a");
    6. setAnswer (p, 3, "a");
    7. /* ... */
    8. deleteQuestion (p);
  • Erstmal vielen Dank für die zahlreichen Beiträge! Das hilft mir ungemein

    @cewbie:

    das ist im Prinzip das, was ich machen will, gefällt mir gut.Joker wollt ich zuerst auch einbringen, denke aber die werd ich raus lassen. Bin so schon überfordert.

    @phax:

    ich habe deine generische variante mal in eine Headerdatei gepackt und in meine Quelldatei eingebunden.
    Anschließend habe ich ich den Aufruf, wie du ihn aufgeschrieben hast in meine main geschrieben:

    Quellcode

    1. #include <stdio.h> // Standardfunktionen Ein- und Ausgabe
    2. #include <conio.h> // Standardfunktionen Tastatur und Bildschirm
    3. #include <math.h> // mathematische Standardfunktion
    4. #include <string.h> //
    5. #include "struct_daten.h" // Strukturen des Fragenpools und Prototypen
    6. int main (void)
    7. {
    8. printf("\n\t\tWer wird Millionaer?");
    9. question_t* p = newQuestion (4);
    10. p->setQuestion ("Wie geht das?");
    11. setAnswer (p, 0, "a)");
    12. setAnswer (p, 1, "b)");
    13. setAnswer (p, 2, "c)");
    14. setAnswer (p, 3, "d)");
    15. /* ... */
    16. deleteQuestion (p);
    17. getch();
    18. return 0;
    19. }
    Alles anzeigen


    Jetzt sagt mir das Prog aber, dass 'setQuestion' kein Element von '_question_t' sei?!?: (Z. 11)

    Quellcode

    1. Fehler 3 error C2039: 'setQuestion': Ist kein Element von '_question_t'


    Kann deinen Variante mittlerweile auch teilweise nachvollziehen...
    Aber ich möchte später die Fragen aus einer Stufe (struct leicht, struct mittel, struct schwer) per Zufall ausgeben lassen. Ist das damit auch möglich?
    Wenn ich es mit struct und strcpy mache kann ich diese ja soweit ich weiß in ein Array packen und dann per rand() irgendwie generieren.
  • Jetzt läuft es, allerdings wird die Frage nicht angezeigt...
    habe deleteQuestion(p) entfernt.

    Habe einen neuen Ansatz für mein Problem, und zwar:

    1. Ich schreibe die Fragen allesamt in eine externe *.txt Datei und binde diese ein.

    2. In der structuren.h mache ich ein Grundgerüst mit structs (für jede Frage inkl. Antworten eine) und 3 arrays für die Schwierigkeitsstufen. etwa so:

    Quellcode

    1. struct fr_leicht_1
    2. {
    3. char frage1[50];
    4. char antwort1_1[30];
    5. char antwort1_2[30];
    6. char antwort1_3[30];
    7. char antwort1_4[30];
    8. }question_l;
    9. struct fr_mittel_1
    10. {
    11. char frage6[50];
    12. char antwort6_1[30];
    13. char antwort6_2[30];
    14. char antwort6_3[30];
    15. char antwort6_4[30];
    16. }question_m;
    17. .
    18. .
    19. .
    Alles anzeigen
    usw.

    die Arrays:

    Quellcode

    1. .
    2. .
    3. .
    4. typ feld_leicht[5];
    5. feld_leicht[0] = question_l.fr_leicht_1;
    6. feld_leicht[1] = question_l.fr_leicht_2;
    7. feld_leicht[2] = question_l.fr_leicht_3;
    8. feld_leicht[3] = question_l.fr_leicht_4;
    9. feld_leicht[4] = question_l.fr_leicht_5;
    10. .
    11. .
    12. .
    Alles anzeigen


    Stimmt die Zuweisung der Feldelemente so?
    -
    3. Bräucht eine Funktion, die bei Abruf am Anfang des Progs die Fragen und Antworten aus der txt Datei in die structs schreibt, damit ich anschließend mit den Feldern und dem Index vom rand() die Fragen zufällig ausgeben kann. Ist das möglich?? Kann mir da jmd. weiterhelfen?