Seite 1 von 1
Hilfe bei meinem Code #Anfängerfrage :'D
Verfasst: 29.02.2016, 12:32
von Jack
Hallo zusammen,
ich bin gerade dabei mir ein kleines Spielchen zu Programmieren, was für mich eigentlich nur als Übung dient.
Nun habe ich ein kleines Problem, ich habe mir eine Klasse erzeugt und dazu zwei Instanzen, dazu habe ich mir eine Funktion geschrieben welche die Variablen der jeweiligen Instanzen verändern soll,
nur funktioniert das ganze leider nicht
hier mal zur besagten Funktion:
Code: Alles auswählen
void Gladiator::Angreifen(bool Zug, Gladiator Spieler, Gladiator Gegner)
{
srand(time(NULL)); rand();
string Information;
int Angriff = 5;
Angriff += rand() & 21;
if (Zug == false)
{
Spieler.Lebenspunkte -= (Angriff - Spieler.Panzerung);
Spieler.Panzerung;
}
else
{
Gegner.Lebenspunkte =- (Angriff - Gegner.Panzerung);
Gegner.Panzerung;
}
if (Zug == false)
{
Information = "Du greifst deinen Gegner an\n";
}
else
{
Information = "Dein Gegner greift dich an\n";
}
cout << Information << "Schaden: " << Angriff << endl;
}
Ich hoffe jmd versteht was ich meine x)
Danke schon mal :)
Re: Hilfe bei meinem Code #Anfängerfrage :'D
Verfasst: 29.02.2016, 12:40
von Schrompf
Was ist denn der Fehler? Bzw. wie exakt lauten die Fehlermeldungen, die der Compiler Dir ausspuckt?
Nimm's mir bitte nicht übel, dass ich Dir nicht einfach aufliste, was Du alles falsch machst. Du wirst am meisten lernen, wenn Du Dich mal selbst auf die Jagd machst. Das beginnt damit, dass Du Compiler-Fehlermeldungen - Du hast Quatsch getippt - unterscheidest von Laufzeitfehlern - Du hast was programmiert, was etwas Anderes tut, als Du möchtest.
Gegen Ersteres hilft nur das Lesen der Fehlermeldungen, und evtl. das Posten dieser Meldungen im Forum, wenn Du gar nicht daraus schlau wirst.
Gegen Zweiteres hilft die Benutzung eines Debuggers. Mit F9 setzt Du einen Unterbrechungspunkt an den Punkt, wo der Cursor gerade ist. Dann führst Du das Programm mit F5 aus und der Debugger wird genau an der Stelle unterbrechen. Dann kannst Du mit z.B. F10 Zeile für Zeile durch Deinen Code durchgehen und Dir angucken, was in Deinen Variablen steht und was die Berechnungen ergeben.
Re: Hilfe bei meinem Code #Anfängerfrage :'D
Verfasst: 29.02.2016, 12:55
von Jack
Achso das ist es ja eine Fehlermeldung bekomme ich nicht, mein verdacht ist das ich evtl was mit den Parametern falsch gemacht habe.
Re: Hilfe bei meinem Code #Anfängerfrage :'D
Verfasst: 29.02.2016, 13:08
von Schrompf
Ich meine das ernst. Sei konsequent. Überlege Dir jetzt und hier, woran Du das festmachst, dass Dein Programm nicht das tut, was es soll. Wie als würdest Du das jemand anderem erklären müssen, der neben Dir sitzt, warum Du jetzt gerade stutzig geworden bist. Dieser Gedankengang ist die Fehleranalyse. Und den kann Dir niemand abnehmen, weil nur Du weißt, was Du eigentlich haben willst.
Also nochmal: was tut Dein Programm gerade? Und hast Du eigentlich erwartet, was es tut?
Re: Hilfe bei meinem Code #Anfängerfrage :'D
Verfasst: 29.02.2016, 13:42
von Jack
Ich zerbreche mir daran schon eine ganze weile den Kopf.
Das es an den Parametern liegen könnte, mache ich daran fest dass wenn ich die Membervariablen in der Klasse auf public setze und sie anschließend einfach in der main ändere, Funktioniert alles wie geplant.
Nur ist dieser weg ja nicht im Sinne des Erfinders.
Leider weiß ich nicht wie die Syntax für die Parameter aussehen muss(Falls das der Fehler ist :D) also kann ich es nicht einfach Ausschließen.
Re: Hilfe bei meinem Code #Anfängerfrage :'D
Verfasst: 29.02.2016, 14:07
von Top-OR
Hiho Mr. Jack!
Mein Ansatz geht ein wenig in die Richtung, was Schrompf meint:
Schreibe dochmal zu jeder Zeile Code dort oben mit eignen Wort einen Kommentar(text), mit dem du genau erklärst, was diese Zeile macht.
Das scheint vielleicht zuerst simpel oder sinnlos, aber ich denke, in diesem Kontext ist es das genau NICHT.
Re: Hilfe bei meinem Code #Anfängerfrage :'D
Verfasst: 29.02.2016, 14:09
von Schrompf
Du hast jetzt zum zweiten Mal die Fragestellung ignoriert. Sorry, aber dann musst Du halt alleine mit Deinem Problem klarkommen.
Nur ein letzter Tipp: erspar Dir das public oder sonstwas. Nimm den Debugger, wie oben beschrieben. F9 für Breakpoint auf die erste Zeile deines Problems, dann starten mit F5, dann einzeln durchlaufen mit F10 bzw. F11.
Re: Hilfe bei meinem Code #Anfängerfrage :'D
Verfasst: 29.02.2016, 14:54
von Jack
Sorry Schrompf das hat sich für mich so angehört als wüsstest du bereits was nicht stimmt, willst es mir aber nicht sagen weil ich selbst darauf kommen soll.
Okay dann noch mal von vorn.
Was ich versucht habe zu Programmieren ist ein rundenbasierender Kampf wie man ihn zb. aus Pokemon oder FinalFantasy kennt, nur eben simpler.
Nun habe ich mir eine Klasse erstellt In der Variablen für die Lebenspunkte, Aktionspunkte etc habe und dann eben auch eine Instanz für den Spieler und eine für den Gegner.
Mein Problem ist nur das ich die Werte zwar ausgeben kann aber ich kann sie eben nicht über die jeweiligen Klassenfunktionen verändern.
Wenn zb die Funktion "Angriff" den Wert für die Lebenspunkte für die Instanz "Gegner" soll tut sie eben nicht so ganz was sie soll(Auser ein nervös zuckendes rechtes Auge bei mir hervorrufen:D)
Habe den Code nochmal ein wenig Kommentiert ich hoffe es ist nun Klarer was ich meine.
Code: Alles auswählen
Funktionen.hpp:
#pragma once
class Gladiator
{
private:
int Lebenspunkte;
int Aktionspunkte;
int Panzerung;
public:
Gladiator();
~Gladiator();
void Angreifen(bool Zug, Gladiator Spieler, Gladiator Gegner); //Soll die Lebenspunkte verringern
void Heilen(bool Zug, Gladiator Spieler, Gladiator Gegner); // Soll die Lebenspunkte erhöhen.
void Verteidigen(bool Zug, Gladiator Spieler, Gladiator Gegner); // Soll Panzerung + Aktionspunkte erhöhen
void Spiel(bool Zug, Gladiator Spieler, Gladiator Gegner); // Soll alle funktionen in einem Menue zusammenfassen
};
Funktionen.cpp:
#include <iostream>
#include <string>
#include <time.h>
#include <Windows.h>
#include "Gladiatoren und Funktionen.hpp"
using namespace std;
string Information;
bool Zug = false;
Gladiator::Gladiator() //Konstruktor
{
Lebenspunkte = 100;
Aktionspunkte = 100;
Panzerung = 1;
}
Gladiator::~Gladiator() // Destruktor
{
}
void Gladiator::Angreifen(bool Zug, Gladiator Spieler, Gladiator Gegner) //Soll die Lebenspunkte des Spielers o. Gegners verringern.
{
srand(time(NULL)); rand();
int Angriff = 5;
Angriff += rand() & 21; // Variable für die höhe der Angriffskraft
if (Zug == false) // Soll prüfen ob der Spieler an der Reihe ist.
{
Spieler.Lebenspunkte -= Angriff; // Wenn nicht - Spielerlebenspunkte verringern.
}
else
{
Gegner.Lebenspunkte =- (Angriff - Gegner.Panzerung); // Wenn ja - Gegnerischelebenspunkte verringern.
}
if (Zug == false) // Nur ein bisschen Textausgabe ..
{
Information = "Du greifst deinen Gegner an\n";
}
else
{
Information = "Dein Gegner greift dich an\n";
}
cout << Information << "Schaden: " << Angriff << endl;
}
void Gladiator::Heilen(bool Zug, Gladiator Spieler, Gladiator Gegner)
{
int x;
if (Zug == false)
{
x = Spieler.Lebenspunkte;
}
else
{
x = Gegner.Lebenspunkte;
}
srand(time(NULL)); rand();
int Heilung = rand() & 21 + 5;
x += (Heilung);
if (Zug == false)
{
Information = "Du Heilst dich!\n";
}
else
{
Information = "Dein Gegner Heilt sich!\n";
}
cout << Information << " Heilung: " << Heilung << endl;
}
void Gladiator::Verteidigen(bool Zug, Gladiator Spieler, Gladiator Gegner)
{
int x;
int y;
if (Zug == false)
{
x = Spieler.Panzerung;
y = Spieler.Aktionspunkte;
}
else
{
x = Gegner.Panzerung;
y = Gegner.Aktionspunkte;
}
srand(time(NULL)); rand();
int Aktionspunkte = rand() & 21 + 5;
y += Aktionspunkte + 5;
x += 15;
if (Zug == false)
{
Information = "Du verteidigst dich und kannst diese Runde nicht mehr angreifen!\n";
}
else
{
Information = "Dein Gegner verteidigt sich und kann diese runde nicht mehr angreifen!\n";
}
cout << Information << " Aktionspunkte: " << Aktionspunkte << endl;
}
//void Spielfeld(const int Höhe,const int Breite, char Feld[5][10])
//{
//
// for (int i = 0; i < Höhe; i++)
// {
// for (int x = 0; x < Breite; x++)
// {
// Feld[i][x] = ' ';
// cout << Feld[i][x];
// }
// cout << "\n";
// }
//
//}
//
//void ausgabe(const int Höhe, const int Breite, char Feld[5][10])
//{
// for (int i = 0; i < Höhe; i++)
// {
// for (int x = 0; x < Breite; x++)
// {
//
//
// cout << Feld[i][x];
// }
// cout << "\n";
// }
// cout << "\n1 = Angreifen\n2 = Verteidigen\n" << endl;
//
//
//}
void Gladiator::Spiel(bool Zug, Gladiator Spieler, Gladiator Gegner) //Funktion für das "Hauptspiel"
{
string Aktionsmenue = "\nDu bist an der Reihe was willst du tun?\n---------------------------------------\n<1> = Angreifen\n<2> = Heilen\n<3> = Verteidigen\n";
system("cls");
cout << "Spieler Lebenspunkte: " << Spieler.Lebenspunkte << "\t" << "Gegner Lebenspunkte: " << Gegner.Lebenspunkte << endl; // Ausgabe der jeweiligen Werte.
cout << "Spieler Aktionspunkte: " << Spieler.Aktionspunkte << "\t" << "Gegner Aktionspunkte: " << Gegner.Aktionspunkte << endl;
cout << "Spieler Verteidigung: " << Spieler.Panzerung << "\t\t" << "Gegner Verteidigung: " << Gegner.Panzerung << endl;
if (Zug == false)
{
cout << "\n" << Aktionsmenue << "\n" << endl; // Ausgabe für ein Aktionsmenue
}
else
{
cout << "\n" << Information << "\n" << endl; // Information über die jeweilige ausgewählte Aktion.
}
char Aktion;
cin >> Aktion;
switch (Aktion)
{
case '1': {Spieler.Angreifen(Zug, Spieler, Gegner); }break; // Auswahl der Aktion.
case '2': {Spieler.Heilen(Zug, Spieler, Gegner); }break;
case '3': {Spieler.Verteidigen(Zug, Spieler, Gegner); }break;
}
}
main:
#include <iostream>
#include <Windows.h>
#include <string>
#include "Gladiatoren und Funktionen.hpp"
using namespace std;
int main()
{
Gladiator Spieler; //Einen Galdiator für den Spieler
Gladiator Gegner; // Und einen für den Gegner
bool Zug = false;
cout << "GLADIATORENDUELL\n----------------\n\n" << endl; // Start menue
cout << "<1> = Spiel starten\n<2> = Spiel beenden\n\n" << endl;
char Menue;
do
{
cin >> Menue;
switch (Menue)
{
case '1':
{
Spieler.Spiel(Zug, Spieler, Gegner); // Hauptfunktion
}break;
case '2': {}break;
default: cout << "Falsche Eingabe" << endl;
}
} while (Menue != '2');
return 0;
}
Ich habe das mit dem Debugger mal versucht, verhaut mich nicht gleich aber gebracht hat mir das erst mal nichts .. :(
Re: Hilfe bei meinem Code #Anfängerfrage :'D
Verfasst: 29.02.2016, 15:09
von Raphael
Auf die Schnelle würde ich sagen "void Gladiator::Angreifen(bool Zug, Gladiator Spieler, Gladiator Gegner)" sieht mehr nach Java als nach C++ aus. Du gehst scheinbar bei einer solchen Methode davon aus, dass Gladiator als Referenz übergeben wird, es sind in C++ aber Kopien. Du änderst in den Methoden dann die Kopie, welche beim Verlassen der Methode weggeworfen wird.
Re: Hilfe bei meinem Code #Anfängerfrage :'D
Verfasst: 29.02.2016, 15:20
von Jack
Okay danke, hast du evtl auf die schnell auch einen Link zu einem Tutorial in dem beschrieben wird wie man das ganze per Referenz übergibt? :)
Re: Hilfe bei meinem Code #Anfängerfrage :'D
Verfasst: 29.02.2016, 15:25
von Jack
Okay hat sich erledigt trotzdem danke für eure Zeit :)
Re: Hilfe bei meinem Code #Anfängerfrage :'D
Verfasst: 29.02.2016, 15:26
von xq
&