PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Project schwierigkeiten (Fehler)



jookerxxx
01.05.2009, 13:05
Hallo, ich arbeite an einem Prokjekt... Läuft auch schon ganz gut, jedoch gibt es einen ganz großen Fehler im Projekt. Ich vermute es liegt an dem Konstruktor oder an dem aufruf des Konstruktors, in der main.cpp Hier erstmal der Code:


//Common_Header.h

#ifndef COMMON_HEADER_H
#define COMMON_HEADER_H

#include <iostream>
#include <cstdlib>
#include <conio.h>
#include <ctime>
#include <windows.h>
#include <mmsystem.h>


typedef unsigned int uint;
using namespace std;
#endif






//Monster.h

#include "common_header.h"

#ifndef _MONSTER_H
#define _MONSTER_H



class Monster {

private:

//Deklaration der Eigenschaften

uint Health;
uint Strenght;
uint Mana;


public:

//Deklaration der Konstruktoren
Monster(uint h, uint s, uint m);
Monster(uint h, uint s);
Monster(uint h);
Monster( ); //Standardkonstruktor

//Deklaration des Destruktors
~Monster( ); //Wird aufgerufen sobald eine Instanz zerstört wird

//Deklaration der Funktionen

//Deklarationen der Zugriffsmethoden (get)
uint get_Health(void) const;
uint get_Strenght(void) const;
uint get_Mana(void) const;

//Deklarationen der Zugrissmethoden (set)
void set_Health(uint h);
void set_Strenght(uint s);
void set_Mana(uint m);

//Deklaration der Adventure-Funktionen
void Monster_get_Health (); //Monster bekommt Leben
void Monster_get_Mana (); //Monster bekommt Mana

void Monster_get_hit(); //Monster wird getroffen
void Monster_Attack(); //Monster greift an
};

#endif







//Soldat.h

#include "common_header.h"

#ifndef SOLDAT_H
#define SOLDAT_H

class Soldat{

//Deklaration der Eigenschaften

private:

uint Soldat_Health;
uint Soldat_Strenght;
uint Soldat_Mana;

public:

//Deklaration der Konstruktoren
Soldat(uint h, uint s, uint m);
Soldat(uint h, uint s);
Soldat(uint h);
Soldat( ); //Standardkonstruktor

//Deklaration des Destruktors
~Soldat( ); //Wird aufgerufen sobald eine Instanz zerstört wird

//Deklaration der Funktionen

//Deklarationen der Zugriffsmethoden (get)
uint get_Soldat_Health(void) const;
uint get_Soldat_Strenght(void) const;
uint get_Soldat_Mana(void) const;

//Deklarationen der Zugrissmethoden (set)
void set_Soldat_Health(uint h);
void set_Soldat_Strenght(uint s);
void set_Soldat_Mana(uint m);

//Deklaration der Adventure-Funktionen
void Soldat_get_Health (); //Soldat bekommt Leben
void Soldat_get_Mana (); //Soldat bekommt Mana

void Soldat_get_hit(); //Soldat wird getroffen
void Soldat_Attack(); //Soldat greift an
};

#endif






//Monster.cpp

#include "monster.h"
#include "soldat.h"

//Definitionen der Konstruktoren

Monster::Monster(uint h, uint s, uint m){
uint Health = h;
uint Strenght = s;
uint Mana = m;
}
Monster::Monster(uint h, uint s){
uint Health = h;
uint Strenght = s;
//Sobald Mana nicht angegeben wird, Mana = 100
uint Mana = 100;
}
Monster::Monster(uint h){
uint Health = h;
//Sobald Stärke nicht angegeben wird, Stärke = 100
uint Strenght = 100;
//Sobald Mana nicht angegeben wird, Mana = 100
uint Mana = 100;
}
Monster::Monster( ){ //Definition Standardkonstruktor
//Sobald keine Parameter übergeben werden, Perfektes Mosnter

uint Health = 100;
uint Strenght = 100;
uint Mana = 100;
}

//Definition des Destruktors
Monster::~Monster( ){ //Desktruktor darf niemals Parameter haben
PlaySound(TEXT("Monster_die.wav"), NULL, SND_FILENAME);
int live = 20;
cout<<"Du hast das Monster getötet..."<<endl;
Sleep(5000);
cout<<"Du erhälst 20 Leben..."<<endl;
//Soldat::set_Soldat_Health(live);
//#error "Bitte bei dem Soldat leben auffüllen lassen(Monster.cpp)- Destruktor"
}

//Definition der Zugriffsmethoden (get)
uint Monster::get_Health(void) const{
return Health;
}
uint Monster::get_Strenght(void) const{
return Strenght;
}
uint Monster::get_Mana(void) const{
return Mana;
}

//Definition der Zugriffsmethoden (set)
void Monster::set_Health(uint h){
Health += h;
}
void Monster::set_Strenght(uint s){
Strenght += s;
}
void Monster::set_Mana(uint m){
Mana += m;
}

//Definition der Advanture-Funktionen
void Monster::Monster_get_Health (){
uint Random;
srand((uint)time(0));
Random = (rand()%100)+1;
Monster::set_Health(Random);
if(Health > 100) Health = 100;
cout<<"Das Monster hat Leben bekommen:"<<endl;
cout<<"Monster: "<<this->Health<<endl;
}

void Monster::Monster_get_Mana (){
uint Random;
srand((uint)time(0));
Random = (rand()%100)+1;
Monster::set_Mana(Random);
if(Mana > 100) Mana = 100;
cout<<"Das Monster hat Mana bekommen:"<<endl;
cout<<"Monster: "<<this->Mana<<endl;
}

void Monster::Monster_get_hit(){
PlaySound(TEXT("Monster_get_hit.wav"), NULL, SND_FILENAME);
cout<<"Leben des Monster: "<<this->Health<<endl;
//#error "Bitte nochmal überarbeiten in Verbindung mit Soldat"
}

void Monster::Monster_Attack(){
PlaySound(TEXT("Monster_attack.wav"), NULL, SND_FILENAME);
cout<<"Das Monster greift mit "<<this->Strenght<<" Stärke an..."<<endl;
//#error "Bitte nochmal überarbeiten in Verbindung mit Soldat"
}





//Soldat.cpp

#include "soldat.h"
#include "monster.h"

//Definitionen der Konstruktoren

Soldat::Soldat(uint h, uint s, uint m){
uint Soldat_Health = h;
uint Soldat_Strenght = s;
uint Soldat_Mana = m;
}
Soldat::Soldat(uint h, uint s){
uint Soldat_Health = h;
uint Soldat_Strenght = s;
//Sobald Mana nicht angegeben wird, Mana = 100
uint Soldat_Mana = 100;
}
Soldat::Soldat(uint h){
uint Soldat_Health = h;
//Sobald Stärke nicht angegeben wird, Stärke = 100
uint Soldat_Strenght = 100;
//Sobald Mana nicht angegeben wird, Mana = 100
uint Soldat_Mana = 100;
}
Soldat::Soldat( ){ //Definition Standardkonstruktor
//Sobald keine Parameter übergeben werden, Perfekter Soldat

uint Soldat_Health = 100;
uint Soldat_Strenght = 100;
uint Soldat_Mana = 100;
}

//Definition des Destruktors
Soldat::~Soldat( ){ //Desktruktor darf niemals Parameter haben
system("CLS");
cout<<"~~~~~~~~~~Game Over~~~~~~~~~~"<<endl;
getch();
}

//Definition der Zugriffsmethoden (get)
uint Soldat::get_Soldat_Health(void) const{
return Soldat_Health;
}
uint Soldat::get_Soldat_Strenght(void) const{
return Soldat_Strenght;
}
uint Soldat::get_Soldat_Mana(void) const{
return Soldat_Mana;
}

//Definition der Zugriffsmethoden (set)
void Soldat::set_Soldat_Health(uint h){
Soldat_Health += h;
if(Soldat_Health > 100) Soldat_Health = 100;
}
void Soldat::set_Soldat_Strenght(uint s){
Soldat_Strenght += s;
if(Soldat_Strenght > 100) Soldat_Strenght = 100;
}
void Soldat::set_Soldat_Mana(uint m){
Soldat_Mana += m;
if(Soldat_Mana > 100) Soldat_Mana = 100;
}

//Definition der Advanture-Funktionen
void Soldat::Soldat_get_Health (){
uint Random;
srand((uint)time(0));
Random = (rand()%100)+1;
Soldat::set_Soldat_Health(Random);
cout<<"Du bekommst Leben:"<<endl;
cout<<"Soldat: "<<this->Soldat_Health<<endl;
}

void Soldat::Soldat_get_Mana (){
uint Random;
srand((uint)time(0));
Random = (rand()%100)+1;
Soldat::set_Soldat_Mana(Random);
cout<<"Du ahst Mana bekommen:"<<endl;
cout<<"Soldat: "<<this->Soldat_Mana<<endl;
}

void Soldat::Soldat_get_hit(){
//cout<<"Du wurdest von einem Monster mit "<<Monster::get_Strenght()<<endl;
//#error "Bitte nochmal überarbeiten in Verbindung mit Soldat"
}

void Soldat::Soldat_Attack(){
cout<<"Du greifst ein Monster mit "<<this->Soldat_Strenght<<" Stärke an..."<<endl;
//#error "Bitte nochmal überarbeiten in Verbindung mit Soldat"
}




#include "common_header.h"
#include "monster.h"
#include "soldat.h"
using namespace std;

DWORD WINAPI PlaySoundThread(void *file)
{
PlaySound((const char *) file, NULL, SND_FILENAME);
return 0;
}



int main(){

int AgentenWahl = 0;



Monster Org(100, 100, 100);

Sleep(3000);



CreateThread(0, 0, PlaySoundThread, (void *) "music.wav", 0, NULL);

do{
system("CLS");
cout<<"\t\t -------------The Game-------------"<<endl<<endl;

cout<<"\t\t Wähle deinen Agenten aus:"<<endl<<endl;

cout<<"\t\t 1. \t\tJohn"<<endl;
cout<<"\t\t 2. \t\tTommy"<<endl;
cout<<"\t\t 3. \t\tJason"<<endl;
cout<<"\t\t 4. \t\tJack"<<endl;
cout<<"\t\t 5. \t\tSpiel Ende"<<endl;
cin>>AgentenWahl;
if(AgentenWahl > 4 && AgentenWahl != 5 || AgentenWahl <= 0){
cout<<"Fehler bei der Eingabe...Bitte versuche es erneut...";
getch();
}

if(AgentenWahl == 5){
exit (1);
}
system("CLS");

switch(AgentenWahl){
case 1:
Soldat John();
cout<<"Du hast John gewählt"<<endl;
break;
case 2:
Soldat Tommy();
cout<<"Du hast Tommy gewählt"<<endl;
break;
case 3:
Soldat Jason();
cout<<"Du hast Jason gewählt"<<endl;
break;
case 4:
Soldat Jack();
cout<<"Du hast Jack gewählt"<<endl;
break;
}//Ende von switch



getch();

cout<<"Monsters Leben:"<<Org.get_Health()<<endl;
cout<<"Monsters Mana :"<<Org.get_Mana()<<endl;
cout<<"Monsters Särke:"<<Org.get_Strenght()<<endl;

Org.Monster_Attack();
Org.Monster_get_hit();

}while(AgentenWahl = 0);




return 0;
}


Ausgabe:

-------------The Game-------------

Wõhle deinen Agenten aus:

1. John
2. Tommy
3. Jason
4. Jack
5. Spiel Ende

1
Du hast John gewählt
Monsters Leben:2009095316
Monsters Mana :4294967295
Monsters Sõrke:2008948848

Ich glaube jeder kann erkennen das das Leben der Monster und die Stärke sowie auch Mana nicht sooo hoch sein sollten.
Ich hoffe ihr könnt mir helfen.

blackberry
01.05.2009, 14:47
Im Konstruktor tust du folgendes:

Monster::Monster(uint h, uint s, uint m){
uint Health = h;
uint Strenght = s;
uint Mana = m;
}


Was du hier machen wolltest ist die Attribute Health, Strenght (heißt korrekterweise eigentlich "Strength") und Mana deines Objekts mit den Werten h, s und m belegen.

Da diesen aber ein "uint" davorgestellt hast werden diese als lokale Variablen interpretiert. (siehe Namenskollision -> this-Zeiger benutzen)
Deine richtigen Attribute werden somit nie belegt und deren Wert bleibt undefiniert.

Um das zu ändern musst du einfach das "uint" entfernen.
(das hast du bei der Soldat-Klasse auch so gemacht, also auch diese editieren!)


mfG. BlackBerry

PS: dein Programmierstil ist grauenhaft ^^