Hilfe bei meinem Code #Anfängerfrage :'D

Einstiegsfragen, Mathematik, Physik, künstliche Intelligenz, Engine Design
Antworten
Jack
Beiträge: 15
Registriert: 29.02.2016, 12:20

Hilfe bei meinem Code #Anfängerfrage :'D

Beitrag 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 :cry:

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 :)
Benutzeravatar
Schrompf
Moderator
Beiträge: 5044
Registriert: 25.02.2009, 23:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas
Wohnort: Dresden
Kontaktdaten:

Re: Hilfe bei meinem Code #Anfängerfrage :'D

Beitrag 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.
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
Jack
Beiträge: 15
Registriert: 29.02.2016, 12:20

Re: Hilfe bei meinem Code #Anfängerfrage :'D

Beitrag 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.
Benutzeravatar
Schrompf
Moderator
Beiträge: 5044
Registriert: 25.02.2009, 23:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas
Wohnort: Dresden
Kontaktdaten:

Re: Hilfe bei meinem Code #Anfängerfrage :'D

Beitrag 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?
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
Jack
Beiträge: 15
Registriert: 29.02.2016, 12:20

Re: Hilfe bei meinem Code #Anfängerfrage :'D

Beitrag 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.
Benutzeravatar
Top-OR
Establishment
Beiträge: 330
Registriert: 02.03.2011, 16:32
Echter Name: Jens H.
Wohnort: Esslingen/Dessau
Kontaktdaten:

Re: Hilfe bei meinem Code #Anfängerfrage :'D

Beitrag 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.
--
Verallgemeinerungen sind IMMER falsch.
Benutzeravatar
Schrompf
Moderator
Beiträge: 5044
Registriert: 25.02.2009, 23:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas
Wohnort: Dresden
Kontaktdaten:

Re: Hilfe bei meinem Code #Anfängerfrage :'D

Beitrag 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.
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
Jack
Beiträge: 15
Registriert: 29.02.2016, 12:20

Re: Hilfe bei meinem Code #Anfängerfrage :'D

Beitrag 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 .. :(
Benutzeravatar
Raphael
Beiträge: 65
Registriert: 22.12.2011, 13:39
Echter Name: Raphael Menges

Re: Hilfe bei meinem Code #Anfängerfrage :'D

Beitrag 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.
Jack
Beiträge: 15
Registriert: 29.02.2016, 12:20

Re: Hilfe bei meinem Code #Anfängerfrage :'D

Beitrag 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? :)
Jack
Beiträge: 15
Registriert: 29.02.2016, 12:20

Re: Hilfe bei meinem Code #Anfängerfrage :'D

Beitrag von Jack »

Okay hat sich erledigt trotzdem danke für eure Zeit :)
Benutzeravatar
xq
Establishment
Beiträge: 1589
Registriert: 07.10.2012, 14:56
Alter Benutzername: MasterQ32
Echter Name: Felix Queißner
Wohnort: Stuttgart & Region
Kontaktdaten:

Re: Hilfe bei meinem Code #Anfängerfrage :'D

Beitrag von xq »

&
War mal MasterQ32, findet den Namen aber mittlerweile ziemlich albern…

Programmiert viel in ⚡️Zig⚡️ und nervt Leute damit.
Antworten