Problem mit Konsolen Spiel
-
So hab alles nochmal von Anfang an gemacht das Spiel funktioniert jetzt auch eigentlich is zwar noch nicht ganz fertig ..... Aber irgendwie is das noch etwas verbuggt^^
Hier ist der Soucre Code vielleicht hat ja einer von euch eine Idee was da falsch ist.#include <iostream> #include <stdlib.h> using namespace std; int main() { int start; int wohin; int verlassen; int links; int wahl; int angriff; int userfertigkeit; int pc; int rezz; int flucht; cout<<"(1) Spiel Starten\n"; cin>>start; switch(1) do {//do klammer { case 1: system("CLS"); cout<<"Wohin willst du gehen ? 1= Haus ,3= Dungeon\n"; cin>>wohin; //--------------------BEREICH FÜR DAS HAUS !!!!!-------------------------------------------------// } if (wohin==1) { cout<<"Du bist jetzt im Haus\n"; cout<<"1 Haus durchsuchen\n"; cout<<"2 Haus Verlassen\n"; cin>>verlassen; } if (1==verlassen) { system("CLS"); cout<<"Du hast 100 Goldmuenzen gefunden =) druecke (2) um das Haus wieder zu verlassen\n"; cin>>verlassen; } //-----------------ENDE VOM BEREICH FÜR DAS HAUS -----------------------------------------------------// //--------------------BEREICH FÜR DEN DUNGEON!!!!!-------------------------------------------------// if (wohin==3) { system("CLS"); cout<<"Du bist jetzt im Dungeon\n"; cout<<"Woher willst du gehen 4 = Links\n"; cin>>links; } //-----------------ENDE VOM BEREICH FÜR DEN DUNGEON ----------------------------------------------------// //-----------------------------Bereich für Angriff und Flucht ----------------------------------------// if (links==4) { system("CLS"); cout<<"Du wirst angegriffen !!! 5 = Angriff, 6 = Flucht\n"; cin>>wahl; } //-----------------------------Bereich für Angriff ------------------------------------------------------// if (wahl==5) { system("CLS"); cout<<"Waehle deine Angriffsfertigkeit aus:\n"; cout<<"1 Kugelblitz\n"; cout<<"2 Feuerball\n"; cin>>userfertigkeit; srand ( time (NULL) ); pc = rand()%1+1; cout<<"Du hast die Fertigkeit"<<userfertigkeit<<"gewaehlt\n"; cout<<"Der Gegner hat die Fertigkeit"<<pc<<"gewaehlt\n\n"; } //------------------------------------Bereich für Kampf-------------------------------------------------// if (userfertigkeit==1 && pc==1) { cout<<"Du hast den Gegner zwar besiegt konntest aber leider seinem\n" <<"Kugelblitz nicht mehr ausweichen. Druecke 2 und bestaetige mit enter\n" <<"um wieder belebt zu werden\n"; cin>>rezz; }//if klammer //------------------------------------ENDE VON BEREICH FÜR KAMPF ------------------------------------------------// //---------------------------- BEREICH FÜR FLUCHT ---------------------------------------------------------------------// if (wahl==6) { cout<<"Druecke die 7 und bestaetige mit Enter um zu fliehen\n"; cin>>flucht; } //---------------------------- ENDE VON BEREICH FÜR FLUCHT ---------------------------------------------------------------------// }//while klammer while(verlassen==2); system("PAUSE"); }
-
Versuch doch mal, deine Quelltexte etwas einzurücken - hilft ungemein, wenn du die Übersicht behalten willst.
Ansonsten beschäftige dich erstmal mit ein paar Grundlagen von C++, bevor du sowas zusammenschusterst
PS:
switch(1) do {//do klammerWas soll denn das darstellen?
PPS: "nicht ganz fertig" ist ja wohl die Untertreibung des Jahrhunderts

-
Ich finde das so übersichtlicher als das Einzurücken ^^
Also mit diesen Strichen wo ich die Bereiche makiert habe. Und das hier:switch(1) do {//do klammerwar nur so eine makierung für mich weil ich ab und zu ausversehen zu viel lösche oder mal auf eine falsche taste komme^^ Die Kommentare zu dem Source Code müssen anderen net verstehen die sind nur für mich da ^^ Und die Grundlagen habe ich mir schon angesehen.
-
Bassmaster schrieb:
Ich finde das so übersichtlicher als das Einzurücken ^^
Also mit diesen Strichen wo ich die Bereiche makiert habe.Na wenn du meinst. Ich find's mit einrückungen auf jeden Fall klarer zu erkennen, welcher (Unter)Block wo aufhört.
Und das hier:
[...]
war nur so eine makierung für mich weil ich ab und zu ausversehen zu viel lösche oder mal auf eine falsche taste komme^^Es ist auf jeden Fall die ungewöhnlichste Anwendung von switch(), die mir bisher untergekommen ist

-
Ich mach C++ erst seit ca. 1 1/2 Wochen und in Schule da hab ich das 1 mal iner Woche nur 90 minuten
Ich will doch nur wissen wa da an meinem Source Code falsch ist.

-
Erstens: Er ist grauenhaft formatiert.
Zweitens: Die bereits erwähnte switch()-Konstruktion ist zumindest fragwürdig
Drittens: Der gesamte Code hat keine erkennbare Struktur - wenn du so weitermachst, verlierst du selber den Überblick.
-
PLZ nur noch leute antworteten die meine frage beantworten können.
Hier die Frage nochmal: Was ist an dem Source Code falsch, wieso kommen da so blöde Bugs.
Ps. Ja ich weiss es ist schlecht formatiert ....................
Wenn ihr es auch nicht wisst dann schreibt einfach nichts dazu. Thx
-
Aber irgendwie is das noch etwas verbuggt^^
ist leider keine Fehlerbeschreibung.
Und bei deinem Kommentar kannst du froh sein, wenn überhaupt noch jemand antwortet.
-
Kannst du mal genauer erklären, was für "blöde Bugs" überhaupt auftreten?
(btw, hast du daran gedacht, daß die einzelnen Variablen am Ende der do-while-Schleife ihren jeweiligen Wert behalten?)
-
Oh sry hatte ja ganz vergessen zu beschreiben was da nicht funktioniert XD
Also:Wenn ich das Spiel starte und ins Haus reingehe. Dann gehe ich auf Haus Durchsuchen finde die 100 Goldmünzen dann drücke 1 und dann werd ich angegriffen -.- und das soll eben nicht passieren.
Hab das Programm schon ein paar mal verändert dann ging es beim ersten versuch alles gut ich konnte alles machen.
Z.B.
Ich geh ins Haus hol die 100 Goldmünzen dann nach geh ich in den Dungeon dann geh ich links dann werd ich angeriffen ich werde besiegt.
Danach bin ich dann wieder in meinem Auswahlmenü wo ich Auswählen kann ob ich ins Haus oder in den Dungeon will.
Das is ja auch alles soweit richtig. Aber wenn ich dann wieder in das Haus gehe und die 100 Goldmünzen hole dann steht dort das ich angegriffen werden
Ich versuch schon den ganzen Tag das hinzukriegen das es richtig funktioniert.
-
Wie gesagt, am Ende der Schleife behalten alle Variablen ihren Wert - auch 'links' (das im vorigen Schleifendurchlauf während des 'if(wohin==3)'-Blocks auf 4 gesetzt wurde). Und da du die einzelnen Abfragen sequentiell abarbeitest, landest du beim nächsten Anlauf sofort wieder im Kampf.
Btw, ich würde ja etwas Struktur in dein Spiel reinbringen und den zentralen Teil (Auswahl der Handlungsoption und richtige Reaktion) in eine Funktion auslagern:
struct situation { string beschreibung; vector<pair<string,situation*> > folgende; }; situation* aktion(const situation& aktuell) { int sel; cout<<aktuell.beschreibung<<endl; for(int i=0;i<aktuell.folgende.size();++i) cout<<i+1<<" - "<<aktuell.folgende[i].first<<endl; cin>>sel; return aktuell.folgende[sel-1].second; }
-
Was bedeutet denn der Satz CStoll:
Wie gesagt, am Ende der Schleife behalten alle Variablen ihren Wert - auch 'links' (das im vorigen Schleifendurchlauf während des 'if(wohin==3)'-Blocks auf 4 gesetzt wurde).
Was meinst du damit das die Variaböen ihren Wert behalten

-
Genau das, was ich gesagt habe - du gehst als erstes in den Dungeon und auf dem Weg werden wohin=3 (gehe ins Dungeon), links=4 (gehe nach links), wahl=5 (Angriff) etc. gesetzt und du schließlich eingeächert, danach beginnt die Schleife wieder von vorne und wohin=1 (gehe ins Haus), verlassen=1 (durchsuchen) und verlassen=2 (Haus verlassen) gesetzt. Der Block "if(wohin==3) wird übersprungen und die Abfrage "if(links==4)" ist immer noch gültig (links wurde seit dem letzten Schleifendurchlauf nicht mehr angefasst) -> und schon wirst du wieder angegriffen.
-
Muss man dann da verschiedene Schleifen benutzen oder wie geht das ?

-
Wahrscheinlich reicht es schon, eine einzelne Variable durchgängig zu verwenden - aber wie ich schon mehrfach versucht habe zu erklären, solltest du das gesamte Programm besser strukturieren. (du verlierst ja schon bei drei "Räumen" (Haus, Dungeon, Kampf) den Überblick, wie soll das erst werden, wenn das Spiel umfangreicher wird?)
-
Okay ich versuchs mal besser zu Strukturieren
-
Ich hab es jetzt mal eingerückt aber was genau müsste ich denn dann da jetzt verändern

#include <iostream> #include <stdlib.h> using namespace std; int main() { int start; int wohin; int verlassen; int links; int wahl; int angriff; int userfertigkeit; int pc; int rezz; int flucht; cout<<"(1) Spiel Starten\n"; cin>>start; switch(1) do { { case 1: system("CLS"); cout<<"Wohin willst du gehen ? 1= Haus ,3= Dungeon\n"; cin>>wohin; //--------------------BEREICH FÜR DAS HAUS !!!!!-------------------------------------------------// } if (wohin==1) { cout<<"Du bist jetzt im Haus\n"; cout<<"1 Haus durchsuchen\n"; cout<<"2 Haus Verlassen\n"; cin>>verlassen; } if (1==verlassen) { system("CLS"); cout<<"Du hast 100 Goldmuenzen gefunden =) druecke (2) um das Haus wieder zu verlassen\n"; cin>>verlassen; } //-----------------ENDE VOM BEREICH FÜR DAS HAUS -----------------------------------------------------// //--------------------BEREICH FÜR DEN DUNGEON!!!!!-------------------------------------------------// if (wohin==3) { system("CLS"); cout<<"Du bist jetzt im Dungeon\n"; cout<<"Woher willst du gehen 4 = Links\n"; cin>>links; } //-----------------ENDE VOM BEREICH FÜR DEN DUNGEON ----------------------------------------------------// //-----------------------------Bereich für Angriff und Flucht ----------------------------------------// if (links==4) { system("CLS"); cout<<"Du wirst angegriffen !!! 5 = Angriff, 6 = Flucht\n"; cin>>wahl; } //-----------------------------Bereich für Angriff ------------------------------------------------------// if (wahl==5) { system("CLS"); cout<<"Waehle deine Angriffsfertigkeit aus:\n"; cout<<"1 Kugelblitz\n"; cout<<"2 Feuerball\n"; cin>>userfertigkeit; srand ( time (NULL) ); pc = rand()%1+1; cout<<"Du hast die Fertigkeit"<<userfertigkeit<<"gewaehlt\n"; cout<<"Der Gegner hat die Fertigkeit"<<pc<<"gewaehlt\n\n"; } //------------------------------------Bereich für Kampf-------------------------------------------------// if (userfertigkeit==1 && pc==1) { cout<<"Du hast den Gegner zwar besiegt konntest aber leider seinem\n" <<"Kugelblitz nicht mehr ausweichen. Druecke 2 und bestaetige mit enter\n" <<"um wieder belebt zu werden\n"; cin>>rezz; } //------------------------------------ENDE VON BEREICH FÜR KAMPF ------------------------------------------------// //---------------------------- BEREICH FÜR FLUCHT ---------------------------------------------------------------------// if (wahl==6) { cout<<"Druecke die 7 und bestaetige mit Enter um zu fliehen\n"; cin>>flucht; } //---------------------------- ENDE VON BEREICH FÜR FLUCHT ---------------------------------------------------------------------// } while(verlassen==2); system("PAUSE"); }
-
Bassmaster schrieb:
Ich hab es jetzt mal eingerückt aber was genau müsste ich denn dann da jetzt verändern

Mal davon abgesehen das es ziemlich grausam eingerückt wurde, bedeutet anders strukturieren nicht nur das Erscheinungsbild zu verändern sondern den Programmfluß anzupassen (Ausgliederung in unterschiedliche Funktionen/Methoden...).
Ganz davon abgesehen: Was soll das bitte sein?
switch(1) do { { case 1:Sorry, aber ich habe grad nicht die Zeit um dir hier große Beispiele zu liefern, aber ein paar Regeln zur besseren Lesbarkeit kann ich dir kurz mitgeben:
Ein paar übliche Einrückformen:
int main { // ... int wohin; // ... switch(wohin) { case 1: //... break; default: //... break; } } int main { // ... int wohin; // ... switch(wohin) { case 1: //... break; default: //... break; } } int main { // ... int wohin; // ... switch(wohin) { case 1: //... break; default: //... break; } }Unabhängig davon wie du dein Programm schreibst solltest du einen Stil finden, der das Lesen erleichtert. Den damit findet man auch Fehler besser (Hier kann man sehr leicht sehen welcher Code zusammen gehört).
cu André
-
Bassmaster schrieb:
Ich hab es jetzt mal eingerückt aber was genau müsste ich denn dann da jetzt verändern

Erstens: Die Einrückung ist ja grauenhaft (ja, man könnte stundenlang darüber diskutieren, wie die optimale Einrückung aussieht - aber deine ist alles andere als optimal).
Zweitens: Fang am besten nochmal ganz bei Null an. Die Funktion "aktion()", die ich vorhin gepostet habe, wäre eventuell ein Ansatzpunkt.
-
Kennt jemand ein Tutorial wo genau beschrieben steht was diese ganzen Sachen bedeuten?
struct situation { string beschreibung; vector<pair<string,situation*> > folgende; }; situation* aktion(const situation& aktuell) { int sel; cout<<aktuell.beschreibung<<endl; for(int i=0;i<aktuell.folgende.size();++i) cout<<i+1<<" - "<<aktuell.folgende[i].first<<endl; cin>>sel; return aktuell.folgende[sel-1].second; }