Register for your free account! | Forgot your password?

Go Back   elitepvpers > Coders Den > C/C++
You last visited: Today at 20:26

  • Please register to post and access all features, it's quick, easy and FREE!


Wer wird Millionär in C++

Discussion on Wer wird Millionär in C++ within the C/C++ forum part of the Coders Den category.

Reply
 
Old   #1

 
elite*gold: 11
The Black Market: 163/0/2
Join Date: Jul 2011
Posts: 7,307
Received Thanks: 1,289
Wer wird Millionär in C++

Hallo,


ich muss für ein Schulprojekt das Spiel "Wer wird Millionär" programmieren. Da ich aber absoluter Anfänger in C++ bin, bekomme ich das im Moment nicht hin.


Ich bekomme aktuell die Ausgaben der Fragen nicht hin. Diese Fragen sollen später random ausgegeben werden. Ich habs vorher mit einem struct versucht, doch mir wurde geraten, das in Arrays zu packen.


Code:



Semikоlоn is offline  
Thanks
1 User
Old 04/10/2019, 13:03   #2
 
elite*gold: 0
Join Date: Feb 2009
Posts: 1,080
Received Thanks: 512
Versuchen wir doch erstmal strukturiert ran zu gehen.

Für ein Quiz spiel benötigst du einen Container an Fragen, eine Frage besteht aus dem Fragetext, mehreren Antworten, von der natürlich eine richtig sein muss.

In C++ terms bedeutet das du willst eine art von Objekt haben das die Information der Fragen beinhaltet, sowie eine art Container um die fragen zu halten. Aktuell machst du beides mit einem zweidimensionalen Array. Das ist zum einen unleserlich und aufwendig. Mein Tipp ist, erstelle einen eigenen Typen für Fragen (Stuct/Class), und benutz einen Container (std::set, std::vector) für den Fragenkatalog.

Wenn du eine frage stellst, printest du die Fragestellung sowie die möglichen antworten aus, und liest vom user dann eine zahl ein. Wenn die Zahl = index der richtigen antwort (auf dem screen) ist, bekommt der Spieler die nächste frage, wenn nicht hat er das spiel verloren.

Die fragen solle ja zufällig auftreten, da gibt es verschiedene Optionen, z.B. kannst du die Fragen einfach in einem vector speichern, und die nächste frage mit rand() auswählen, und diese dann löschen. Persönlich finde ich das aber recht ugly da Vector elemt löschen langsam ist (O(n)).
Die etwas kompliziertere lösung die ich machen würde, ich würde den Fragen eine Zufallszahl zuordnen, und sie dann nach dieser sortiert in einem std::set lagern (indem man std::less für den Fragen typen spezialisiert) und dann immer das erste element entfernen. gibt bestimmt noch effizientere Methoden (std::set basiert auf nem RBT in den meisten implementationen, was hohe statische kosten hat), aber dir würde ich eh das mit dem vector empfehlen, da ich glaube das es für dich völlig ausreicht.

Also mal als pseudo code:
Code:
Frage {
-- Daten
  Text;
  Antworten;
-- Methoden
  FrageStellen {
    Print (Text);
    Print (Antworten);
    Read (UserAntwort);
    if (UserAntwort == RichtigeAntwort) return true;
    return false;
  }
}

Liste<Frage> Fragen = {
  Frage(Frage1, A1, A2, A3, A4),
  Frage(Frage2, A1, A2, A3, A4),
  ...
  Frage(FrageN, A1, A2, A3, A4),
}

Main {
  While (Fragen not empty) {
    AktuelleFrage = Fragen[Random]
    Fragen.delete(AktuelleFrage);
    if (AktuelleFrage.FrageStellen ist Falsch) Veloren;
  }
  Gewonnen
}


warfley is offline  
Thanks
1 User
Old 04/10/2019, 13:14   #3

 
elite*gold: 11
The Black Market: 163/0/2
Join Date: Jul 2011
Posts: 7,307
Received Thanks: 1,289
Quote:
Originally Posted by warfley View Post
Versuchen wir doch erstmal strukturiert ran zu gehen.

Für ein Quiz spiel benötigst du einen Container an Fragen, eine Frage besteht aus dem Fragetext, mehreren Antworten, von der natürlich eine richtig sein muss.

In C++ terms bedeutet das du willst eine art von Objekt haben das die Information der Fragen beinhaltet, sowie eine art Container um die fragen zu halten. Aktuell machst du beides mit einem zweidimensionalen Array. Das ist zum einen unleserlich und aufwendig. Mein Tipp ist, erstelle einen eigenen Typen für Fragen (Stuct/Class), und benutz einen Container (std::set, std::vector) für den Fragenkatalog.

Wenn du eine frage stellst, printest du die Fragestellung sowie die möglichen antworten aus, und liest vom user dann eine zahl ein. Wenn die Zahl = index der richtigen antwort (auf dem screen) ist, bekommt der Spieler die nächste frage, wenn nicht hat er das spiel verloren.

Die fragen solle ja zufällig auftreten, da gibt es verschiedene Optionen, z.B. kannst du die Fragen einfach in einem vector speichern, und die nächste frage mit rand() auswählen, und diese dann löschen. Persönlich finde ich das aber recht ugly da Vector elemt löschen langsam ist (O(n)).
Die etwas kompliziertere lösung die ich machen würde, ich würde den Fragen eine Zufallszahl zuordnen, und sie dann nach dieser sortiert in einem std::set lagern (indem man std::less für den Fragen typen spezialisiert) und dann immer das erste element entfernen. gibt bestimmt noch effizientere Methoden (std::set basiert auf nem RBT in den meisten implementationen, was hohe statische kosten hat), aber dir würde ich eh das mit dem vector empfehlen, da ich glaube das es für dich völlig ausreicht.

Also mal als pseudo code:
Code:
Frage {
-- Daten
  Text;
  Antworten;
-- Methoden
  FrageStellen {
    Print (Text);
    Print (Antworten);
    Read (UserAntwort);
    if (UserAntwort == RichtigeAntwort) return true;
    return false;
  }
}

Liste<Frage> Fragen = {
  Frage(Frage1, A1, A2, A3, A4),
  Frage(Frage2, A1, A2, A3, A4),
  ...
  Frage(FrageN, A1, A2, A3, A4),
}

Main {
  While (Fragen not empty) {
    AktuelleFrage = Fragen[Random]
    Fragen.delete(AktuelleFrage);
    if (AktuelleFrage.FrageStellen ist Falsch) Veloren;
  }
  Gewonnen
}

Danke erstmal für die Hilfe!

Das Problem ist, wir sind halt noch ganz am Anfang und hatten bis auf paar Basics nichts gemacht. Sprich bis jetzt eig. Nur Datentypen, Strings, Pointer, arrays und Listen.
Deswegen sagen mir die meisten Sachen nichts. Und wir dürfen halt nur das benutzen was wir gelernt haben.
Ich hatte das halt mit einem struct versucht:
Semikоlоn is offline  
Old 04/10/2019, 13:35   #4
 
elite*gold: 0
Join Date: Feb 2009
Posts: 1,080
Received Thanks: 512
Quote:
Originally Posted by Semikоlоn View Post
Danke erstmal für die Hilfe!

Das Problem ist, wir sind halt noch ganz am Anfang und hatten bis auf paar Basics nichts gemacht. Sprich bis jetzt eig. Nur Datentypen, Strings, Pointer, arrays und Listen.
Deswegen sagen mir die meisten Sachen nichts. Und wir dürfen halt nur das benutzen was wir gelernt haben.
Ich hatte das halt mit einem struct versucht:
Das ist schon fast richtig, du hast nur den fehler gemacht alle daten in eine Struct zu setzen. Du solltest eine Struct für die Fragen haben und dann eine liste dieser Struct als katalog

So würde ich das machen:
Code:
struct Challange {
  std::string question;
  std::string answers[4];
  int correctAnswer;

  bool askQuestion() {
  ...
  }
}

std::vector<Challange> challanges = {
  {
    .question = "Frage 1",
    .answers = {
      "Antwort1",
      "Antwort2",
      "Antwort3",
      "Antwort4"
    },
    .correctAnswer = 2
  },
  {
    .question = "Frage 2",
    .answers = {
      "Antwort1",
      "Antwort2",
      "Antwort3",
      "Antwort4"
    },
    .correctAnswer = 2
  },
  ...
};


warfley is offline  
Old 04/10/2019, 14:33   #5

 
elite*gold: 11
The Black Market: 163/0/2
Join Date: Jul 2011
Posts: 7,307
Received Thanks: 1,289
Quote:
Originally Posted by warfley View Post
Das ist schon fast richtig, du hast nur den fehler gemacht alle daten in eine Struct zu setzen. Du solltest eine Struct für die Fragen haben und dann eine liste dieser Struct als katalog

So würde ich das machen:
Code:
struct Challange {
  std::string question;
  std::string answers[4];
  int correctAnswer;

  bool askQuestion() {
  ...
  }
}

std::vector<Challange> challanges = {
  {
    .question = "Frage 1",
    .answers = {
      "Antwort1",
      "Antwort2",
      "Antwort3",
      "Antwort4"
    },
    .correctAnswer = 2
  },
  {
    .question = "Frage 2",
    .answers = {
      "Antwort1",
      "Antwort2",
      "Antwort3",
      "Antwort4"
    },
    .correctAnswer = 2
  },
  ...
};

Wir dürfen halt keine Vektoren benutzen, wenn ich das nicht falsch verstanden habe.
Semikоlоn is offline  
Old 04/10/2019, 22:16   #6
 
elite*gold: 100
Join Date: Apr 2008
Posts: 581
Received Thanks: 754
Quote:
Originally Posted by Semikоlоn View Post
Wir dürfen halt keine Vektoren benutzen, wenn ich das nicht falsch verstanden habe.
Statt vector geht auch einfach nur ein Array. Die Fragen sind ja eh fix, du musst dir nur merken welche Frage schon gestellt wurde. Statt die Frage aus dem Array zu entfernen (das geht mit Array natürlich nicht so schön wie mit std::vector) kannst du z.B. in der Challange-Struktur eine weitere Variable anlegen, die signalisiert ob die Frage schon gestellt wurde.

Statt
Code:
std::vector<Challanges> challanges = { ... };
kannst du auch einfach
Code:
Challanges challanges[] = { ... };
machen.

PS: Challenge schreibt man mit e ... ;D


florian0 is offline  
Reply



« Suche jemanden der sich mit C&Arduino auskennt | - »

Similar Threads
Wer wird Millionär
02/14/2015 - AutoIt - 1 Replies
Ein kleines Spiel, man kann selber Fragen erstellen, so viele wie man will und wenn man spielt wird Random eine Frage gestellt. Menü: Spielen: Frage erstellen:
Wer wird Millionär Metin?
01/05/2012 - Metin2 PServer - Discussions / Questions - 4 Replies
Ja also meine Idee ist es, das man die OX map umformt in form von 4 Spalten anstatt 2, Da würde da z.B so ne frage kommen Wie viele Tattoos hat der dunkle Anführer A) 1 B) 3 C) 5 D) 7 wenn man es richtig hat, ist man eine stufe weiter ---> es werden pro spiel nur 20 runden geben, wenn man falsch benatwortet bekommt man gar nichts. Man kann vor der Frage jederzeit aussteigen, dann bekommt man das Yang was man bisher gewonnen hat ... Sobald die nächste Frage kommt, wird der NPC...
Wer wird Millionär geknackt
11/29/2010 - Off Topic - 30 Replies
ach fast vier Jahren ohne einen Millionengewinner hat wieder ein Kandidat der Sendung "Wer wird Millionär?" alle 15 Fragen richtig beantwortet. Der Café-Betreiber Ralf Schnoor aus Hannover konnte auch ohne Hilfe seines noch vorhandenen Telefonjokers die letzte Frage richtig beantworten, wie RTL mitteilte. (37)|Danke! Schriftgröße A A A Schnoor hat es geschafft: Er ist Jauchs erster Millionär seit vier Jahren. © RTL / Stefan Gregorowius Sie lautete: Wie heißt die erste deutsche Briefmarke,...
rakion+ebay=millionär
03/29/2006 - General Gaming Discussion - 2 Replies
http://cgi.ebay.de/Rakion-Account-LeveL-71...1QQcmdZViewItem rofl..



All times are GMT +2. The time now is 20:26.


Powered by vBulletin®
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.
SEO by vBSEO ©2011, Crawlability, Inc.

BTC: 3KeUpz52VCbhmLwuwydqxu6U1xsgbT8YT5
ETH: 0xc6ec801B7563A4376751F33b0573308aDa611E05

Support | Contact Us | FAQ | Advertising | Privacy Policy | Terms of Service | Abuse
Copyright ©2019 elitepvpers All Rights Reserved.