kleines Rollenspiel
-
Hallo alle zusammen, ich lerne zurzeit fleißig C++ und hab auch schon zu Übungszwecken etwas auf die beine gestellt ( was ich hinbekomme mit meinem jetzigen wissen)
Jetz wollte ich eine Funktion zur Schadensberechnung einfügen ( die int Rechnung in Zeile 27) und habe diese auch eingesetzt ( Zeile 122)
es wird kein Fehler ausgegeben, aber wenn ich das Programm jetz starte wird der Schaden nicht mehr vom Gegnerleben abgezogen ;-/
Über Hilfe würde ich mich freuen.
xXSkiDXx
#include <iostream> //Bibliotheken #include <string> #include <stdio.h> #include <cstdlib> #include <windows.h> #include <cmath> #include <conio.h> #include <time.h> using namespace std ; struct Charakterwerte // Struktur der Verfügbaren Werte von Spieler -und Nichtspieler Charakteren { string name[100]; int LVL[100]; int EXP[100]; int HP[100]; int MP[100]; int DMG[100]; int DEF[100]; int MDMG[100]; int MDEF[100]; }; int Rechnung(int Gegnerleben , int Charakterschaden , int Gegnerverteidigung) //Funktion zur Berechnung des Charakterschadens { ((static_cast<int> (Gegnerleben - (Charakterschaden-(Gegnerverteidigung/5))))); } int main() { srand(time(0)); int i = (rand() % 3) ; // Zufallszahl die bestimmt welcher Gegner auftaucht Charakterwerte Char; // Werte der Spielbaren Charaktere Char.LVL[0] = 1; // Level, Erfahrungspunkte, Leben, Magiepunkte, Schaden, Verteidigung , Magieschaden, Magievert. Char.EXP[0] = 0; Char.HP[0] = 250; Char.MP[0] = 20; Char.DMG[0] = 25; Char.DEF[0] =8; Char.MDMG[0] =5; Char.MDEF[0] =0; Charakterwerte Gegner; // Werte der Gegner mit Arrays Gegner.name[0]= "Gnom"; Gegner.EXP[0] = 100; Gegner.HP[0] = 65; Gegner.MP[0] = 5; Gegner.DMG[0] = 35; Gegner.DEF[0] =3; Gegner.MDMG[0] =1; Gegner.MDEF[0] =0; Gegner.name[1]= "Wutgnom"; Gegner.EXP[1] = 150; Gegner.HP[1] = 90; Gegner.MP[1] =8; Gegner.DMG[1] = 41; Gegner.DEF[1] =5; Gegner.MDMG[1] =2; Gegner.MDEF[1] =1; Gegner.name[2]= "Troll"; Gegner.EXP[2] = 160; Gegner.HP[2] = 110; Gegner.MP[2] =5; Gegner.DMG[2] = 37; Gegner.DEF[2] =9; Gegner.MDMG[2] =2; Gegner.MDEF[2] =1; cout<<"Bitte geben Sie Ihren Namen ein:"<<endl; // Aufforderung den Name einzugeben cin>>Char.name[0]; Sleep(1500); cout<<"Sie werden angegriffen!"; Sleep(1000); char loop; do // Anweisung das das Programm immer wiederholt werden soll { cout<<endl<<endl<< "Wähle eine Aktion aus:"<< endl; //Auswahlmöglichkeiten cout<< "Angreifen \t <1>"<< endl; cout<< "Heilen \t\t <2>"<< endl; cout<< "Flüchten \t <3>"<< endl; int Eingabe[2]; cin >>Eingabe[0]; //Eingabeaufforderung getchar(); cout<< endl; switch(Eingabe[0]) //bei Eingabe von 1,2,3 soll jeweils etwas anderes passieren { case 1: cout<<endl<<endl<<Char.name[0]<<" startet einen Angriff"<<endl<<endl; //bei 1 Angriff Sleep(1000); cout<<Char.name[0]<<"s Leben vor dem Angriff:\t"<<Char.HP[0]<<" HP"<<endl; Sleep(1000); cout<<"Leben des "<<Gegner.name[i]<<"s vor dem Angriff:\t"<<Gegner.HP[i]<<" HP"<<endl<<endl; Sleep(2000); cout<<Char.name[0]<<" teilt:\t"<<Char.DMG[0]-(Gegner.DEF[i]/5)<<" Schaden aus"<<endl<<endl; Sleep(1000); Gegner.HP[i] = Rechnung(Gegner.HP[i], Char.DMG[0], Gegner.DEF[i]); cout<<Char.name[0]<<"s Leben nach dem Angriff:\t"<<Char.HP[0]<<" HP"<<endl; Sleep(1000); if(Gegner.HP[i]<=0) //wenn Gegner besiegt = Gewonnen { Gegner.HP[i]=0; Sleep(1000); cout<<endl<<endl<<Char.name[0]<<" hat gewonnen"; loop = '2'; break; } else //wenn nicht wird fortgefahren { cout<<"Leben des "<<Gegner.name[i]<<"s nach dem Angriff:\t"<<Gegner.HP[i]<<" HP"<<endl; cout<<endl<<"Drücken Sie Enter um fortzufahren"; getchar(); loop = '1'; break; } case 2: cout<<endl<<endl<<Char.name[0]<<" heilt sich"<<endl<<endl; //bei 2 heilt sich der Charakter Sleep(1000); cout<<Char.name[0]<<"s derzeitiges Leben:\t"<<Char.HP[0]<<" HP"<<endl; Sleep(1000); cout<<Char.name[0]<<" heilt:\t"<<Char.MDMG[0]+50<<"HP"<<endl<<endl; Char.HP[0] = Char.HP[0] + Char.MDMG[0]+50; if(Char.HP[0]>250) // Wennfunktion damit Max Leben { // nicht überschritten werden kann Char.HP[0] = 250; cout<<Char.name[0]<<"s Leben nach der Heilung:\t"<<Char.HP[0]<<" HP"<<endl; cout<<endl<<"Drücken Sie Enter um fortzufahren"; loop = '1'; getchar(); break; } else //wenn nicht überschritten dann ganz normal berechnet { cout<<"Leben nach der Heilung:\t"<<Char.HP[0]<<" HP"<<endl; cout<<endl<<"Drücken Sie Enter um fortzufahren"; getchar(); loop = '1'; break; } case 3: Sleep(2000); cout<<endl<<Char.name[0]<<" konnte flüchten"<<endl; //bei 3 flüchten Sleep(4000); loop = '3'; default:cout<<"ungültige Eingabe"<<endl; //alle anderen Eingaben = Ungültig continue; } if(loop == '1') { Sleep(1000); cout<<endl<<endl<<"Der "<<Gegner.name[i]<<" startet einen Angriff"<<endl<<endl; //danach automatisch der Gegnerische Zug Sleep(1000); cout<<Char.name[0]<<"s Leben vor dem Angriff:\t"<<Char.HP[0]<<" HP"<<endl; Sleep(1000); cout<<"Leben des "<<Gegner.name[i]<<"s vor dem Angriff:\t"<<Gegner.HP[i]<<" HP"<<endl<<endl; Sleep(2000); cout<<"Der "<<Gegner.name[i]<<" teilt:\t"<<Gegner.DMG[i]<<" Schaden aus"<<endl<<endl; Char.HP[0] = static_cast<int> (Char.HP[0] - Gegner.DMG[i]); if(Char.HP[0]<=0) { Char.HP[0]=0; cout<<endl<<endl<<Char.name[0]<<" ist gestorben"; //wenn leben <0 dann stirbt der Charakter cin.get(); exit(0); } else // ansonsten normale Schadensberechnung { Sleep(1000); cout<<Char.name[0]<<"s Leben nach dem Angriff:\t"<<Char.HP[0]<<" HP"<<endl; Sleep(1000); cout<<"Leben des "<<Gegner.name[i]<<"s nach dem Angriff:\t"<<Gegner.HP[i]<<" HP"<<endl; Sleep(1000); loop = '1'; continue; } } } while(loop == '1'); // Ende der Wiederholanweisung // bei loop= 1 alles Wieder holen if(loop == '2') //bei lopp = 2 Erfahrungspunkte verteilen { cout<<endl<<endl<<"Sie erhalten "<<Gegner.EXP[i]<<" Erfahrungspunkte"; } else // ansonsten keine Erfahrungspunkte { cout<<endl<<endl<<"Sie konnten nichts erbeuten"; }; cout<<endl<<endl<<"to be continued"; getchar(); } // Ende der int main()
-
int Rechnung(int Gegnerleben , int Charakterschaden , int Gegnerverteidigung) //Funktion zur Berechnung des Charakterschadens { ((static_cast<int> (Gegnerleben - (Charakterschaden-(Gegnerverteidigung/5))))); }Wo ist da das return?
Wozu soll der static_cast gut sein?
-
hab schon mal ein return drin gehabt, aber wusste nicht genau was ich als parameter von return eingeben sollte ;-/
und den static cast hab ich drin.. weil ich irgendwo gelesen habe, das das ergebnis so immer eine int wird? Okay man könnte es glaube auch weg lassen... naja wie gesagt bin noich am lernen..^^
-
xXSkiDXx schrieb:
hab schon mal ein return drin gehabt, aber wusste nicht genau was ich als parameter von return eingeben sollte ;-/
Na, das Ergebnis deiner Berechnung:
return Gegnerleben - (Charakterschaden-(Gegnerverteidigung/5));xXSkiDXx schrieb:
und den static cast hab ich drin.. weil ich irgendwo gelesen habe, das das ergebnis so immer eine int wird? Okay man könnte es glaube auch weg lassen... naja wie gesagt bin noich am lernen..^^
So ein gebastel hilft dir beim Lernen auch nicht wirklich weiter ...
-
Hallo xXSkiDXx,
als Tipp noch:
lege dir besser ein Array von Charakter(werten) an, anstatt in der Struktur 'Charakterwerte' jeweils Arrays zu verwenden:struct Charakterwerte { string name; int LVL; int EXP; // ...; }; Charakterwerte Char; Charakterwerte Gegner[100];(bisher hat auch dein 'Char' für 100 Charaktere Platz reserviert, obwohl du nur einen davon benutzt!)
Noch etwas eleganter wäre die Verwendung der STL-Klasse vector<>...
-
xXSkiDXx schrieb:
Über Hilfe würde ich mich freuen.
Grundsätzlich solltest du um Hilfe von möglichst vielen zu bekommen dein Programm auch sinnvoll einrücken (Egal welche der geläufigen Varianten du nimmst, Hauptsache du bist einheitlich, und man erkennt auf den ersten Blick den Scope).
Die Unterschiedlichen Einrückungen etc. machen das Lesen jedenfalls extrem schwer (Und Programme werden häufiger gelesen als geschrieben).
Des weiteren ist deine main-Funktion viel zu überfrachtet (Auslagern in Funktionen wäre durchaus ratsam).
-
Mir sieht dass alles auch noch recht C-lastig aus, also ein Misch aus C und C++. Da du hier postest denke ich eg dass du C++ machen willst. Klar du lernst C++ erst, aber ich würd mir ein anderes Design überlegen, nutz zum einen Vektoren statt Arrays, und ich würde auch eher Klassen von verschiedenen Charaktern anlegen, welche dann die verschiedenen Werte haben. Find deine Lösung mit dem Arrays in der struct Charakterwerte recht unübersichtlich.
Hab den Code jetzt aber auch nicht ganz durchforstet, da ich ihn auch wie gesagt bisschen unübersichtlich finde.
Lg freeG
-
fr33g schrieb:
Mir sieht dass alles auch noch recht C-lastig aus, also ein Misch aus C und C++. Da du hier postest denke ich eg dass du C++ machen willst. Klar du lernst C++ erst, aber ich würd mir ein anderes Design überlegen, nutz zum einen Vektoren statt Arrays, und ich würde auch eher Klassen von verschiedenen Charaktern anlegen, welche dann die verschiedenen Werte haben. Find deine Lösung mit dem Arrays in der struct Charakterwerte recht unübersichtlich.
Hab den Code jetzt aber auch nicht ganz durchforstet, da ich ihn auch wie gesagt bisschen unübersichtlich finde.
Lg freeG
Auch wenn ich dir generell mit den Klassen zustimme, so ist es noch lang keine "C-ness" nur weil wer ein Array und keine Klassen nutzt.
-
Scorcher24 schrieb:
Auch wenn ich dir generell mit den Klassen zustimme, so ist es noch lang keine "C-ness" nur weil wer ein Array und keine Klassen nutzt.
Ich würde aber schon sagen, dass in diesem Fall ein Musterbeispiel für C mit cout vorliegt.
Besonders interessant diese Zeile:
string name[100];Ob das wirklich so gemeint ist?
-
Das hatte ich doch schon geschrieben...