C++-Game

Hey Leute ;)

Habe ein Problem...
Hab aus langeweile mal ein Spiel gemacht, bin aber noch Anfänger.
Alles funktioniert, nur die While-Schleife am Ende nicht.

ICh weiß nicht mit den Klassen(oder wie auch immer) rechnen kann!
Will dem anderen ja Schaden abziehen ;)

Code:
#include <iostream>

using namespace std;

class Spieler  // Spieler deklaration! (Deklaration ist glaube ich klar ;)
{
public:
      void SetEnergie(int Energie) {itsEnergie = Energie;}
      int GetEnergie() {return itsEnergie;}
      
      void SetWeapon( int Weapon) { itsWeapon = Weapon; }
      int GetWeapon() { return itsWeapon; }
      
      void SetSchaden (int Schaden) { itsSchaden = Schaden; }
      int GetSchaden () {return itsSchaden; }
      
      void Attacke() { cout <<"Attacke!!!!\n"; }

private:
       int itsEnergie;
       int itsWeapon;
       int itsSchaden;
};


int main()
{
    Spieler Ich;
    Spieler Gegner;
    int Ich_Auswahl;
    int Gegner_Auswahl;
    int Ich_Waffe;
    int Gegner_Waffe;
    int Ich_Energie;
    int Gegner_Energie;
    
    cout <<"Willkommen bei meinem Spiel ;)! \n\n";
    cout <<"Waehlen sie IHREN Charakter aus: \n";    //Chrakter auswahl von Ich 
    cout <<"1. Ork \n2. Mensch\n3. Elf \n";
    cin >> Ich_Auswahl;
    
    if ( Ich_Auswahl == 1)
    {
         Ich.SetEnergie(700);
         cout <<"\nSie sind jetzt ein Ork!"; 
    }
    
    else if( Ich_Auswahl == 2)
    {
         Ich.SetEnergie(600);
         cout <<"\nSie sind jetzt ein Mensch!";   // Das sind die Eigenschaften vom Charakter
    }
    
    else if( Ich_Auswahl == 3)
    {
         Ich.SetEnergie(500);
         cout <<"\nSie sind jetzt ein Elf!";
    }
    
    else
    {     
        cout <<"\nEy, zu grosse Zahl!\nDeshalb sind sie jetzt ein Elf!";
        Ich.SetEnergie(500);
    }
        
         
    cout <<"\n\nWaehlen sie jetzt IHRE Waffe aus: \n\n";
    cout <<"1. Schwert \n2. Axt\n3. Bogen\n4. Speer\n";
    cin >> Ich_Waffe;
    
    if ( Ich_Waffe == 1 )
    {
         Ich.SetSchaden(50);
         cout <<"\n Sie haben jetzt ein Schwert!";
    }
    
    else if ( Ich_Waffe == 2 )
    {
         Ich.SetSchaden(70);
         cout <<"Sie haben jetzt eine Axt!";
    }
    
    else if ( Ich_Waffe == 3 )
    {
         Ich.SetSchaden(40);
         cout <<"Sie haben jetzt ein Bogen!";
    }
    
    else if ( Ich_Waffe == 4 )
    {
         Ich.SetSchaden(60);
         cout <<"Sie haben jetzt ein Speer!";
    }
    
    else
    {
         cout <<"Sie haben keine Waffe ausgewählt!\nDeshalb bekommen sie ein Bogen!";
         Ich.SetSchaden(40);
    }
    
    cout <<"Jetzt wählen sie ihren Feind: \n"; //Feindauswahl!
    cout <<"1. Ork \n2. Mensch\n3. Elf \n";
    cin >> Gegner_Auswahl;
    
    if ( Gegner_Auswahl == 1)
    {
         Gegner.SetEnergie(700);
         cout <<"\nSie sind jetzt ein Ork!"; 
    }
    
    else if( Gegner_Auswahl == 2)
    {
         Gegner.SetEnergie(600);
         cout <<"\nSie sind jetzt ein Mensch!";   // Das sind die Eigenschaften vom Charakter
    }
    
    else if( Gegner_Auswahl == 3)
    {
         Gegner.SetEnergie(500);
         cout <<"\nSie sind jetzt ein Elf!";
    }
    
    else
    {     
        cout <<"\nEy, zu grosse Zahl!\nDeshalb ist ihr Gegner jetzt ein Ork!";
        Gegner.SetEnergie(700);
    }
        
         
    cout <<"\n\nWaehlen sie jetzt die Waffe des Gegners aus: \n\n";
    cout <<"1. Schwert \n2. Axt\n3. Bogen\n4. Speer\n";
    cin >> Gegner_Waffe;
    
    if ( Gegner_Waffe == 1 )
    {
         Gegner.SetSchaden(50);
         cout <<"\n Sie haben jetzt ein Schwert!";
    }
    
    else if ( Gegner_Waffe == 2 )
    {
         Gegner.SetSchaden(70);
         cout <<"Sie haben jetzt eine Axt!";
    }
    
    else if ( Gegner_Waffe == 3 )
    {
         Gegner.SetSchaden(40);
         cout <<"Sie haben jetzt ein Bogen!";
    }
    
    else if ( Gegner_Waffe == 4 )
    {
         Gegner.SetSchaden(60);
         cout <<"Sie haben jetzt ein Speer!";
    }
    
    else
    {
         cout <<"Sie haben keine Waffe ausgewählt!\nDeshalb bekommen sie ein Axt!";
         Gegner.SetSchaden(70);
    }
    int Gegner_Tod = Gegner.GetEnergie();
    int Ich_Tod = Ich.GetEnergie();
    
    int Gegner_Attacke = Gegner.GetSchaden();
    int Ich_Attacke = Ich.GetSchaden();
    
    
    while ( *Ich_Tod >= 0 || *Gegner_Tod >= 0 )
    {
          cout <<"Sie greifen an! \n";
          Gegner_Energie = *Gegner_Tod - *Ich.GetSchaden() ;
          
          cout <<"Der Gegner greift an! \n";
          Ich_Energie = *Ich_Tod - *Gegner_Attacke ;
    }
    
    if (Gegner.GetEnergie() == 0 )
        cout <<"Sie haben gewonnen!";
        
    else if (Ich.GetEnergie() == 0 )
        cout <<"Sie haben verloren!";
        
    else 
    cout <<"Nix passiert...";
    
    int Ende;
    cin >> Ende;
    return 0;
}

PS: ICh weiß, ist bestimmt nen schlechter Programmierstyl, aber bin ja Anfänger :p
 
die Variablen Ich_Tod bzw. Gegner_Tod bleiben während der While-Schleife am Ende Gleich, d.h. die bedingung wird immer Wahr bleiben.

Außerdem warum dereferenzierst du einfache Variablen? Bei mir mag der Compiler das nicht einmal.

Folgendes sollte funktionieren:

Code:
    while ( Ich_Tod >= 0 || Gegner_Tod >= 0 )
    {
          cout <<"Sie greifen an! \n";
          Gegner_Energie = Gegner_Tod - Ich.GetSchaden() ;
          
          cout <<"Der Gegner greift an! \n";
          Ich_Energie = Ich_Tod - Gegner_Attacke ;

          // Variablen aktualisieren
          Gegner_Tod = Gegner.GetEnergie();
          Ich_Tod = Ich.GetEnergie();
    }
 
Geht bei mir gehts irgendwie trotzdem nicht...
Ist immer noch eine endlosschleife...

Und wie gesagt, bin noch anfänger...
 
Kapselung ist eine feine Sache, wenn sie wirklich verwendet wird ;)

Code:
Gegner_Tod = Gegner.GetEnergie();
          Ich_Tod = Ich.GetEnergie();
damit werden die Variablen immer auf den Startwert gesetzt. Also entweder komplett OO sein (ich.setSchaden() nutzen und ich.getEnertie() abfragen) oder alle genutzen Variablen vorher lokal anlegen und nicht Objektvariablen mit den Blockvariablen mischen ;)
 
ok ;)

Werde später mal gucken obs geht, bim am anderen PC.

aber schonmal THX^^

Edit:

Weiß nicht ob ich das falsch gemacht habe, aber jetzt habe ich das so:
Code:
    while ( Ich_Tod >= 0 || Gegner_Tod >= 0 )
    {
          cout <<"Sie greifen an! \n";
          Gegner_Energie = Gegner_Tod - Ich.GetSchaden() ;
          
          cout <<"Der Gegner greift an! \n";
          Ich_Energie = Ich_Tod - Gegner_Attacke ;

          // Variablen aktualisieren
          Gegner_Tod = Gegner.SetEnergie();
          Ich_Tod = Ich.SetEnergie();
    }

Und jetzt steht bei dem Kompiler als fehler, dass es nichts richtiges gefunden hat oder so...
 
Hab ich auch schon versucht.
Aber wie CDW gessagt hat, damit werden die Variablen wieder auf den Standartwert gesetzt...
 
Das sollte Dein Gedanke sein, oder nicht?
Code:
while (ich.getEnergie()>=0 && gegner.getEnergie()>=0 ) //solange beide am leben sind:
    {
          cout <<"Sie greifen an! \n";
         ich.setEnergie(ich.getEnergie-gegner.getSchaden()); 
          
          cout <<"Der Gegner greift an! \n";
         gegner.setSchaden(gegner.getEnergie-ich.getSchaden));
   
    }
Das wäre OOP-Anwendung (Du hast ja schließlich die Methoden nicht umsonst definiert ;) ).
Variablennamen und Methodennamen fangen nach http://java.sun.com/docs/codeconv/ klein an. Für C++ gilt wohl auch in etwa dasselbe:
http://en.wikibooks.org/wiki/C++_Programming/Code/Style_Conventions
 
Sagt mal, Jungs, WIESO in aller Welt fangt Ihr an, die EINFACHSTEN Probleme mit dem KOMPLIZIERTEST möglichen Mitteln zu lösen?

Vor allem: Wenn man Anfänger ist UND außerdem nur ein sehr kleines, überschaubares Problem vor der Nase hat, wieso dann VOR Beginn der ersten Lösung schon von vornherein Organisationsmittel benutzen, die einen EXTRA Komplexitätslayer über das ganze ziehen?

@nhBps:
Nimm doch einfach mal EINFACHE Ausdrucksmittel, mit denen Du schon genug Probleme hast, um das Problem auf die EINFACHE Weise zu lösen!

NACHDEM dann die EINFACHE Lösung existiert, schreibe diese stückweise um, wo Du in jedem Schritt immer wieder kontrollieren kannst, ob das Zeug IMMER NOCH funktioniert.

Auf diese Weise lernst Du gleichzeitig eine anerkannte Technik zur Modifikation von komplexen Projekten, die anders gar nicht zu handhaben wären. Und investierst also nebenbei sinnvoll in die Zukunft.

Und Du landest AUCH SO schließlich bei dem von Dir offenbar angestrebten Üben der komplexeren und flexibleren Ausdrucksweisen mit Zugriffsfunktionen.

Aber: Eins nach dem anderen und nicht gleich mit dem Kopf durch die Wand...
 
Werds dann später machen probieren bin am anderen

Aber ich jz schon 2 ganze Tutorials durch und ein Buch durch...
Aber werds heute dann mal umändern...

THX ;)

Edit:

Code:
#include <iostream>

using namespace std;


int main()
{
int Ich_Auswahl;
int Gegner_Auswahl;

int Ich_Waffe;
int Gegner_Waffe;

int Ich_Energie;
int Gegner_Energie;

int Ich_Schaden;
int Gegner_Schaden;

int Ich_Tod;
int Gegner_Tod;

int Ich_Aktualisiert;
int Gegner_Aktualisiert;

cout <<"Willkommen bei meinem Spiel ;)! \n\n";
cout <<"Waehlen sie IHREN Charakter aus: \n"; //Chrakter auswahl von Ich
cout <<"1. Ork \n2. Mensch\n3. Elf \n";
cin >> Ich_Auswahl;

if ( Ich_Auswahl == 1)
{
Ich_Energie = 700;
cout <<"\nSie sind jetzt ein Ork!";
}

else if( Ich_Auswahl == 2)
{
Ich_Energie = 600 ;
cout <<"\nSie sind jetzt ein Mensch!"; // Das sind die Eigenschaften vom Charakter
}

else if( Ich_Auswahl == 3)
{
Ich_Energie = 500;
cout <<"\nSie sind jetzt ein Elf!";
}

else
{
cout <<"\nEy, zu grosse Zahl!\nDeshalb sind sie jetzt ein Elf!";
Ich_Energie = 500 ;
}


cout <<"\n\nWaehlen sie jetzt IHRE Waffe aus: \n\n";
cout <<"1. Schwert \n2. Axt\n3. Bogen\n4. Speer\n";
cin >> Ich_Waffe;

if ( Ich_Waffe == 1 )
{
Ich_Schaden = 50;
cout <<"\n Sie haben jetzt ein Schwert!";
}

else if ( Ich_Waffe == 2 )
{
Ich_Schaden = 70;
cout <<"Sie haben jetzt eine Axt!";
}

else if ( Ich_Waffe == 3 )
{
Ich_Schaden = 40;
cout <<"Sie haben jetzt ein Bogen!";
}

else if ( Ich_Waffe == 4 )
{
Ich_Schaden = 60 ;
cout <<"Sie haben jetzt ein Speer!";
}

else
{
cout <<"Sie haben keine Waffe ausgewählt!\nDeshalb bekommen sie ein Bogen!";
Ich_Schaden = 40 ;
}

cout <<"Jetzt wählen sie ihren Feind: \n"; //Feindauswahl!
cout <<"1. Ork \n2. Mensch\n3. Elf \n";
cin >> Gegner_Auswahl;

if ( Gegner_Auswahl == 1)
{
Gegner_Energie = 700;
cout <<"\nSie sind jetzt ein Ork!";
}

else if( Gegner_Auswahl == 2)
{
Gegner_Energie = 600;
cout <<"\nSie sind jetzt ein Mensch!"; // Das sind die Eigenschaften vom Charakter
}

else if( Gegner_Auswahl == 3)
{
Gegner_Energie = 500;
cout <<"\nSie sind jetzt ein Elf!";
}

else
{
cout <<"\nEy, zu grosse Zahl! Deshalb ist ihr Gegner jetzt ein Ork!";
Gegner_Energie = 700;
}


cout <<"\n\nWaehlen sie jetzt die Waffe des Gegners aus: \n\n";
cout <<"1. Schwert \n2. Axt\n3. Bogen\n4. Speer\n";
cin >> Gegner_Waffe;

if ( Gegner_Waffe == 1 )
{
Gegner_Schaden = 50;
cout <<"\n Sie haben jetzt ein Schwert!";
}

else if ( Gegner_Waffe == 2 )
{
Gegner_Schaden = 70;
cout <<"Sie haben jetzt eine Axt!";
}

else if ( Gegner_Waffe == 3 )
{
Gegner_Schaden = 40;
cout <<"Sie haben jetzt ein Bogen!";
}

else if ( Gegner_Waffe == 4 )
{
Gegner_Schaden = 60;
cout <<"Sie haben jetzt ein Speer!";
}

else
{
cout <<"Sie haben keine Waffe ausgewählt! Deshalb bekommen sie ein Axt!";
Gegner_Schaden = 70;
}

while ( Gegner_Aktualisiert > 0 || Ich_Aktualisiert > 0 )
{
cout <<"Sie greifen an! \n";
Gegner_Tod = Gegner_Energie - Ich_Schaden ;

cout <<"Der Gegner greift an! \n";
Ich_Tod = Ich_Energie - Gegner_Schaden ;

Gegner_Aktualisiert = Gegner_Aktualisiert - Gegner_Tod;
Ich_Aktualisiert = Ich_Aktualisiert - Ich_Tod;
}

if (Gegner_Aktualisiert < 0 )
cout <<"Sie haben gewonnen!";

else if (Ich_Aktualisiert < 0 )
cout <<"Sie haben verloren!";

else
cout <<"Nix passiert...";

int Ende;
cin >> Ende;
return 0;
}

Hab das jetzt so verändert...
Aber jetzt gewinne ich die ganze Zeit...

Danke an alle die mir geholfen haben ^^
 
Original von nhBps
Aber ich jz schon 2 ganze Tutorials durch und ein Buch durch...

dan lies dir in dem buch nochmal das kapitel zum thema switch-statements durch ;)

Hab das jetzt so verändert...
Aber jetzt gewinne ich die ganze Zeit...

ich hab mir dein programm nicht wirklich durchgelesen, ab du scheinst in zeile 179 und 182 zu prüfen, ob die anzahl der lebenspunkte _gleich_ 0 ist. wenn mir allerdings 2 mal z.B. 60 abgezogen werden, habe ich dann nicht -20 LP?
 
Ja, habe den Fehler jetzt berichtigt ;)

Code:
#include <iostream>

using namespace std;


int main()
{
int Ich_Auswahl;
int Gegner_Auswahl;            // Variablen zum Auswählen
int Ich_Waffe;
int Gegner_Waffe;

int Ich_Energie;
int Gegner_Energie;

int Ich_Schaden;
int Gegner_Schaden;


cout <<"Willkommen bei meinem Spiel ;)! \n\n";
cout <<"Waehlen sie IHREN Charakter aus: \n"; //Chrakter auswahl von Ich
cout <<"1. Ork \n2. Mensch\n3. Elf \n";
cin >> Ich_Auswahl;

if ( Ich_Auswahl == 1)
{
Ich_Energie = 700;
cout <<"\nSie sind jetzt ein Ork!";
}

else if( Ich_Auswahl == 2)
{
Ich_Energie = 600 ;
cout <<"\nSie sind jetzt ein Mensch!"; // Das sind die Eigenschaften vom Charakter
}

else if( Ich_Auswahl == 3)
{
Ich_Energie = 500;
cout <<"\nSie sind jetzt ein Elf!";
}

else
{
cout <<"\nEy, zu grosse Zahl!\nDeshalb sind sie jetzt ein Elf!";
Ich_Energie = 500 ;
}


cout <<"\n\nWaehlen sie jetzt IHRE Waffe aus: \n\n";
cout <<"1. Schwert \n2. Axt\n3. Bogen\n4. Speer\n";
cin >> Ich_Waffe;

if ( Ich_Waffe == 1 )
{
Ich_Schaden = 50;
cout <<"\n Sie haben jetzt ein Schwert!";
}

else if ( Ich_Waffe == 2 )
{
Ich_Schaden = 70;
cout <<"Sie haben jetzt eine Axt!";
}

else if ( Ich_Waffe == 3 )
{
Ich_Schaden = 40;
cout <<"Sie haben jetzt ein Bogen!";
}

else if ( Ich_Waffe == 4 )
{
Ich_Schaden = 60 ;
cout <<"Sie haben jetzt ein Speer!";
}

else
{
cout <<"Sie haben keine Waffe ausgewählt!\nDeshalb bekommen sie ein Bogen!";
Ich_Schaden = 40 ;
}

cout <<"\nJetzt wählen sie ihren Feind: \n"; //Feindauswahl!
cout <<"1. Ork \n2. Mensch\n3. Elf \n";
cin >> Gegner_Auswahl;

if ( Gegner_Auswahl == 1)
{
Gegner_Energie = 700;
cout <<"\nIhr Feind ist jetzt ein Ork!";
}

else if( Gegner_Auswahl == 2)
{
Gegner_Energie = 600;
cout <<"\nIhr Feind ist jetzt ein Mensch!"; // Das sind die Eigenschaften vom Charakter
}

else if( Gegner_Auswahl == 3)
{
Gegner_Energie = 500;
cout <<"\nIhr Feind ist jetzt ein Elf!";
}

else
{
cout <<"\nEy, zu grosse Zahl! Deshalb ist ihr Gegner jetzt ein Ork!";
Gegner_Energie = 700;
}


cout <<"\n\nWaehlen sie jetzt die Waffe des Gegners aus: \n\n";
cout <<"1. Schwert \n2. Axt\n3. Bogen\n4. Speer\n";
cin >> Gegner_Waffe;

if ( Gegner_Waffe == 1 )
{
Gegner_Schaden = 50;
cout <<"\nIhr Feind hat jetzt ein Schwert!";
}

else if ( Gegner_Waffe == 2 )
{
Gegner_Schaden = 70;
cout <<"\nIhr Feind hat jetzt eine Axt!";
}

else if ( Gegner_Waffe == 3 )
{
Gegner_Schaden = 40;
cout <<"\nIhr Feind hat jetzt ein Bogen!";
}

else if ( Gegner_Waffe == 4 )
{
Gegner_Schaden = 60;
cout <<"\nIhr Feind hat jetzt ein Speer!";
}

else
{
cout <<"Sie haben keine Waffe ausgewählt für ihren Feind asugewählt! Deshalb bekommet er eine Axt!";
Gegner_Schaden = 70;
}

while ( Gegner_Energie > 0 && Ich_Energie > 0 )
{

Ich_Energie = Ich_Energie - Gegner_Schaden ;

Gegner_Energie = Gegner_Energie - Ich_Schaden ;

}

if (Gegner_Energie < 0 )
cout <<"Sie haben gewonnen!";

else if (Ich_Energie < 0 )
cout <<"Sie haben verloren!";

else
cout <<"Nix passiert...";

int Ende;
cin >> Ende;
return 0;
}
 
Sieht doch ganz gut aus. Allerdings hast du am Ende noch einen kleinen Fehler drin:
Code:
[...]
while ( Gegner_Energie > 0 && Ich_Energie > 0 )
{
  Ich_Energie = Ich_Energie - Gegner_Schaden ;
  Gegner_Energie = Gegner_Energie - Ich_Schaden ;
}

if (Gegner_Energie < 0 )
cout <<"Sie haben gewonnen!";

else if (Ich_Energie < 0 )
cout <<"Sie haben verloren!";

else
cout <<"Nix passiert...";
[...]

Hier überprüfst du erst, ob die Energie noch größer als 0 ist und gibst danach, je nachdem, wessen Energie kleiner 0 ist, die entsprechende Endmeldung aus. Wenn allerdings einer der Opponenten genau bei 0 Energiepunkten rauskommt, springst du zwar aus der Whileschleife raus, gibst aber trotzdem "Nix passiert..." aus.
Wenn du die <-Operatoren in der if- und else-if-Abfrage jeweils durch ein <= ersetzen würdest, hättest du die absolute Sicherheit, dass der richtige Gewinner ausgegeben wird. Außerdem würdest du dir den else-Block sparen :)
 
ich wei das mit dem stil haste schon geschrieben also is das nur ein tipp
mehrere ifs gleicher variable lassen sich auch als switch case ausdrücken

und ich würde fast das ganze progg nur in klassen packen, is einfach übersichtlicher^^
 
sry schlechte angewohnheit^^
ein IF ist keine schleife
ich beuge mich
ich sehe alles ein
ich bereue
ich werde es nie wieder tun

ne ohne mist ich weiß^^
 
If-Schleifen? Okay hier haste eine(kA wie GoTo's gehen, aber ich versuchs ^^)


:start
blubb = mache_was(blubb);
if(blubb!=richtigerwert) goto start:

Und Fertig ist die If-(Goto-)Schläife
 
Zurück
Oben