Text Spiel

05/03/2010 17:40 Danielnoel#1
Kann mir einer helfen. Ich möchte ein Text basiertes Spiel programmieren, bekomme aber immer so ein Fehler.
[Only registered and activated users can see links. Click Here To Register...]

Danke schonmal.:D
05/03/2010 17:48 Madd Eye#2
So wie das ausschaut wird das mit C++ gemacht oder??
Also die Programmiersprachen angeben ist immer Gut

Und evtl. den Codeteil in denen du die besagten variablen defenierst
05/03/2010 21:33 Danielnoel#3
Also erst mal danke, dass du mir hilfst. Ich habe das Programm in VB geschrieben.
Code:
#ifndef _SPIELER_H_
#define _SPIELER_H_

class Spieler
{
private:
	char name[32];
	int gold;
	int experience;
	int health;
	int maxhealth;
	int mana;
	int maxmana;
	int str;
	int inti;
public:
	Spieler();
	bool SetName(char* newname);
	char* GetName();
	void SetGold(int newgold);
	void AddGold(int amount);
	void SpendGold(int amount);
	int GetGold();
	void SetExperience(int newexperience);
	void AddExperience(int amount);
	int GetExperience();
	void SetHealth(int newhealth);
	void AddHealth(int amount);
	void LoseHealth(int amount);
	int GetHealth();
	void SetMaxHealth(int newmaxhealth);
	int GetMaxHealth();
	void SetMana(int newmana);
	void AddMana(int amount);
	void LoseMana(int amount);
	int GetMana();
	void SetMaxMana(int newmana);
	int GetMaxMana();
};

#endif]
Code:
#include "Bibliotek.h"

Spieler::Spieler()
{
	SetName("Hero");
	str = 1;
	inti = 1;
	SetGold(500000);
	SetExperience(0);
	SetMaxHealth(25);
	SetHealth(25);
	SetMaxMana(10000);
	SetMana(10000);
}

void Spieler::AddExperience(int amount)
{
	SetExperience(experience + amount);
}

void Spieler::AddGold(int amount)
{
	SetGold(gold + amount);
}

void Spieler::AddHealth(int amount)
{
	SetHealth(health + amount);
}

void Spieler::AddMana(int amount)
{
	SetMana(mana + amount);
}

int Spieler::GetExperience()
{
	return experience;
}

int Spieler::GetGold()
{
	return gold;
}

int Spieler::GetHealth()
{
	return health;
}

int Spieler::GetMana()
{
	return mana;
}

int Spieler::GetMaxHealth()
{
	return maxhealth;
}

int Spieler::GetMaxMana()
{
	return maxmana;
}

char*Spieler::GetName()
{
	return name;
}

void Spieler::SetExperience(int newexperience)
{
	experience = newexperience;
}

void Spieler::SetGold(int newgold)
{
	gold = newgold;
}

void Spieler::SetHealth(int newhealth)
{
	health = newhealth;

	if (health > maxhealth)
		health = maxhealth;

	if (health < 0)
		health = 0;
}

void Spieler::SetMana(int newmana)
{
	mana = newmana;

	if (mana > maxmana)
		mana = maxmana;

	if (mana < 0)
		mana = 0;
}

void Spieler::SetMaxHealth(int newmaxhealth)
{
	maxhealth = newmaxhealth;
}

void Spieler::SetMaxMana(int newmaxmana)
{
	maxmana = newmaxmana;
}

bool Spieler::SetName(char *newname)
{
	if (strlen(newname) == 0)
		return false;

	if (strlen(newname) > 32)
		return false;

	strcpy_s(name,newname);

	return true;
}
void Spieler::LoseHealth(int amount)
{
	SetHealth(health - amount);
}

void Spieler::LoseMana(int amount)
{
	SetMana(mana - amount);
}

void Spieler::SpendGold(int amount)
{
	SetGold(gold - amount);
}
Code:
void deinZimmer(Spieler* spieler)
{
	cout << "Du bist in deinem Zimmer und siehst ein gemuetliches Bett.\n";
	char antwort;
	antwort = 'm';
	while(antwort != 'y' || antwort != 'n')
	{
		cout << "Moechtest du ne Runde schlafen? (y/n)\n";
		cout << ">";
		cin >> antwort;
		cout << endl;
		if(antwort = 'y')
		{
			cout << "Du legst dich hin und schlaefst bis zum Sonnenaufgang.";
			spieler->SetHealth(spieler->GetMaxHealth());
		}
		if(antwort = 'n')
		{
			atlantis(spieler);
		}

	}


}
Beim untersten möchte ich die Hp wieder auf voll setzten.
Genau dort erscheint auch der Fehler.
05/03/2010 21:52 Madd Eye#4
Erstmal ist das niemals VB sonder entweder C# oder C++ (Vom Code her)
Und der Fehler CXX0030 gibts nur bei C++ also xD

Naja gehen wir das mal durch

Code:
void Spieler::SetHealth(int newhealth)
{
	health = newhealth;

[COLOR="Red"]	if (health > maxhealth)
		health = maxhealth;[/COLOR]

	if (health < 0)
		health = 0;
}
Was bringt es dir die HP auf Maximum zu stellen wenn man nicht über das Maximum kommen kann?


Code:
void deinZimmer(Spieler* spieler)
{
	cout << "Du bist in deinem Zimmer und siehst ein gemuetliches Bett.\n";
	char antwort;
	antwort = 'm';
	[COLOR="Red"]while(antwort != 'y' || antwort != 'n')
	{[/COLOR]
		cout << "Moechtest du ne Runde schlafen? (y/n)\n";
		cout << ">";
		cin >> antwort;
		cout << endl;
		if(antwort = 'y')
		{
			cout << "Du legst dich hin und schlaefst bis zum Sonnenaufgang.";
			spieler->SetHealth(spieler->GetMaxHealth());
		}
		if(antwort = 'n')
		{
			atlantis(spieler);
		}

[COLOR="Red"]	}[/COLOR]


}
Hier kannst du dir die while schleife sparen da mit cin>> antwort; Das Programm wartet bis der Spieler eine Eingabe macht


Das rote ist also eigentlich unnötig xD

Zum eigentlichen Fehler:

Versuch es mal mit:
Code:
int maxh = spieler->GetMaxHealth();
spieler->SetHealth(maxh);
statt

Code:
spieler->SetHealth(spieler->GetMaxHealth());
Der Fehler ist nämlich ein Windows spezifischer Fehler, für den es so direkt keine Lösung gibt
05/03/2010 22:05 Danielnoel#5
Zum ersten: Sry hab da was verwechselt meinte natülich Visual C++.
Zum zweiten: Wenn ich des weg machen würde, würde er über das Maximum gehen.
Zum dritten: Stimmt hast recht. xD:D
Zum vierten: Ne geht net. Er zeigt den Fehler hier an.

Code:
int Spieler::GetMaxHealth()
{
	return maxhealth;
}
bei return maxhealth
05/03/2010 22:12 Madd Eye#6
Ersetz dann mal
Code:
class Spieler
{
private:
mit
Code:
class Spieler
{
public:
05/03/2010 22:21 Danielnoel#7
Ich hab hier doch beides stehen.

Code:
#ifndef _SPIELER_H_
#define _SPIELER_H_

class Spieler
{
[COLOR="Red"]private:[/COLOR]
	char name[32];
	int gold;
	int experience;
	int health;
	int maxhealth;
	int mana;
	int maxmana;
	int str;
	int inti;
[COLOR="Red"]public:[/COLOR]
	Spieler();
	bool SetName(char* newname);
	char* GetName();
	void SetGold(int newgold);
	void AddGold(int amount);
	void SpendGold(int amount);
	int GetGold();
	void SetExperience(int newexperience);
	void AddExperience(int amount);
	int GetExperience();
	void SetHealth(int newhealth);
	void AddHealth(int amount);
	void LoseHealth(int amount);
	int GetHealth();
	void SetMaxHealth(int newmaxhealth);
	int GetMaxHealth();
	void SetMana(int newmana);
	void AddMana(int amount);
	void LoseMana(int amount);
	int GetMana();
	void SetMaxMana(int newmana);
	int GetMaxMana();
};

#endif]
05/03/2010 22:25 Madd Eye#8
Ja und ersetz das
private:

mal mit einem public:

das beugt in manchen fällen diesem Fehler vor
aber eben nicht immer
05/03/2010 22:28 Danielnoel#9
Geht nicht er zeigt immernoch den Fehler hier.
Code:
int Spieler::GetMaxLeben()
{
	return maxleben;
}
05/03/2010 22:50 Madd Eye#10
Oh man bin ich Blöd xD

schau mal genau hin

in den Definitionen steht:
Code:
int max[COLOR="Red"][B][U]health[/U][/B][/COLOR];
und bei unten dann:
Code:
int Spieler::GetMaxLeben()
{
	return max[COLOR="Red"][B][U]leben[/U][/B][/COLOR];
}
xD du hast da leben statt health stehen
05/04/2010 15:11 Danielnoel#11
Oh!!
Ist mir gar net aufgefallen.
Es funktioniert aber immer noch nicht.
05/04/2010 17:04 Madd Eye#12
welche fehler kommen den noch?

Immer noch die selben?
05/04/2010 17:59 Danielnoel#13
Ich geb dir mal den ganzen Code und du schaust mal OK??
Wenn du es startest, dann nach Atlantis gehst, dann Mein Zimmer und wenn man y eingibt kommt der Fehler.
05/04/2010 18:29 xNopex#14
@TS: Das Verwenden von dem this-Zeiger schafft Übersicht. So als Randbemerkung.

Quote:
if(antwort = 'y') [...] if(antwort = 'n')
Fail...

Quote:
Hier kannst du dir die while schleife sparen da mit cin>> antwort; Das Programm wartet bis der Spieler eine Eingabe macht
Die while-Schleife hat den Sinn, dass die Eingabe wiederholt wird, solange die Eingabe nicht 'y' oder 'n' ist. Das was du da von dir gibst hat damit gar nichts zu tun.

Quote:
Versuch es mal mit:
Code:

int maxh = spieler->GetMaxHealth();
spieler->SetHealth(maxh);

statt

Code:

spieler->SetHealth(spieler->GetMaxHealth());
Beide Ausdrücke sagen das gleiche Aus, dasselbe in Grün.

Quote:
Ersetz dann mal
Code:

class Spieler
{
private:

mit
Code:

class Spieler
{
public:
Noch nie was von Datenkapselung gehört, oder? @TS: Bitte so lassen, wie es war, der Vorschlag deines Helfers war nicht klug. Innerhalb der Klasse hat man eh auf jedes Attribut und jeder Methode Zugriff.. Nur so am Rande bemerkt.

Quote:
Oh man bin ich Blöd xD
Joa...

Quote:
Wenn du es startest, dann nach Atlantis gehst, dann Mein Zimmer und wenn man y eingibt kommt der Fehler.
Bei mir kommt da kein Fehler, sondern das Verhalten, das man wegen dem Quellcode auch zu erwarten hat.
05/04/2010 19:25 Madd Eye#15
Quote:
Code:
Versuch es mal mit:

int maxh = spieler->GetMaxHealth();
spieler->SetHealth(maxh);

statt

Code:

spieler->SetHealth(spieler->GetMaxHealth());
Beide Ausdrücke sagen das gleiche Aus, dasselbe in Grün.
Das die beiden das selbe aussagen weiß ich, aber es ist die schreibmethode die VC++ oftmals nicht korrekt ausführt

Quote:
Ersetz dann mal


Code:
class Spieler
{
private:

mit
Code:

class Spieler
{
public:
Noch nie was von Datenkapselung gehört, oder? @TS: Bitte so lassen, wie es war, der Vorschlag deines Helfers war nicht klug. Innerhalb der Klasse hat man eh auf jedes Attribut und jeder Methode Zugriff.. Nur so am Rande bemerkt.
Das hatte den selben Sinn
Manchmal schluckt VC++ diese Befehle in dieser Form nicht und dann taucht der Fehler CXX030 auf

Ich weiß wovon ich rede hatte ihn schon selber oft genug -.-

Quote:
Quote:
Oh man bin ich Blöd xD
Joa...
Und abfällig musst du auch nicht werden