Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

helebelele

Frischling

  • »helebelele« ist der Autor dieses Themas

Beiträge: 32

Wohnort: Düsseldorf

  • Private Nachricht senden

1

25.10.2011, 21:05

Instanz einer Klasse variieren?

Hallo,

tut mir Leid für die etwas komische Überschrift, aber ich wusste nicht wie ich das schreiben soll.
Hier kurz ein paar Hintergrundinformationen um zu wissen wovon ich gleich rede :) Also, ich möchte bald ein Rollenspiel programmieren. Da ich jetzt erstmal in die Programmierung wieder einsteigen muss, halt ich mich momentan in einer Konsolenanwendung auf. Dort geht es momentan soweit, dass es ein "Menü" mit 3 Punkten gibt zwischen denen man wählen kann. Das besteht momentan aus "Neues Spiel starten", "Spiel fortsetzen" und "Spiel beenden".
Dann wird einfach abgefragt was man machen möchte. Wenn man "Neues Spiel starten" wählt, soll man sich eine Figur erstellen. Man gibt der Figur einfach nur einen Namen und wählt eine von 3 Rassen aus.
Außerdem wird die Figur 3 Attribute(Angriff, Verteidigung und Schnelligkeit) haben. Je nach Rasse sollen diese leicht differenzieren. Aber da die Figur am Anfang natürlich Level 1 ist, gibt es feste Startwerte.

Jetzt zu meinem Problem:

Ich sag mal die Startwerte sind wie folgt(ohne Berücksichtigung einer Rasse):

Stärke = 10
Verteidigung = 10
Schnelligkeit = 20

Eine Rasse soll nun 2 Punkte mehr in Stärke aber dafür 1 Punkt weniger Verteidigung haben. Also:

Stärke = 12
Verteidigung = 9
Schnelligkeit = 20

Eine andere soll jetzt aber 2 Punkte mehr in Verteidigung haben und 1 weniger in Stärke.

Ich habe für den Spieler eine Klasse erstellt. In dieser Klasse sind als Membervariablen die 3 Attribute, der Name, die Rasse und die Max. Lebenspunkte enthalten.
Die Werte für die 3 Attribute sollen beim erstellen einer Instanz mit festgelegt werden.

Die Klasse sieht bei mir momentan wie folgt aus:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class CPlayer
{
    private:

        //Membervariablen
        char m_chName;
        char m_chRace;
        int m_health;
        int m_attack;
        int m_defense;
        int m_agility;
        
     public:

        //Memberfunktionen
        CPlayer (char name, char race, int hp, int att, int def, int agi);
        void showStatus();
};


Ist bestimmt nicht grade sehr schön aber ich lerne ja noch :D

Jetzt habe ich mir überlegt, dass ich bei der Erstellung des Charakters eine Abfrage für die Rasse mache. Der Konstruktor hat wie man oben sehen kann die Parameter. Die Abfrage wird in einer Variable gespeichert und als Parameter dem Konstruktor übergeben. Im Konstruktor mache ich dann eine If-Abfrage für die Rasse. Also wenn die 1. Rasse gewählt wird, dann diese Werte, sonst bei der anderen Rasse diese Werte usw.
Kann ich das so machen? Und wenn ich das so mache, dann kann ich doch die Parameter für die Attribute aus dem Konstruktor raus nehmen oder nicht?

edit: bzw. müsst ich beim Konstruktor nicht eigentlich sogar nur Namen und Rasse übergeben? Das ist ja das einzige was vom Spieler manuell eingegeben bzw. ausgewählt wird. Also das "int hp" für die Lebenspunkte auch raus, da die ja bei jeder Instanz am Anfang gleich sind. Also dass ich die dann einfach im Konstruktor so festlege mit "m_health = 100"?

Gruß
Tino :)

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

2

25.10.2011, 21:11

Funktioniert es denn so? Was sind die Vor/Nachteile wenn du es auf die eine oder andere machst?

Überleg dir diese Fragen und entscheide dann aufgrund dessen was du nehmen willst. Kannst ja auch mal beides ausprobieren.

helebelele

Frischling

  • »helebelele« ist der Autor dieses Themas

Beiträge: 32

Wohnort: Düsseldorf

  • Private Nachricht senden

3

25.10.2011, 21:33

Ich hab mich jetzt erstmal für die zweite Möglichkeit entschieden, da diese mir sinnvoller und übersichtlicher erscheint.
Die Klasse sieht jetzt so aus:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class CPlayer
{
    private:

        //Membervariablen
        char m_chName;
        char m_chRace;
        int m_health;
        int m_attack;
        int m_defense;
        int m_agility;
        
    public:

        //Memberfunktionen
        CPlayer (char name, char race);
        void showStatus();
};


Den Konstruktor hab ich jetzt auch demenstprechend aufgebaut:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
CPlayer::CPlayer (char name, char race)
{
    m_chName = name;
    m_chRace = race;

    m_health = 100;

    // Attribute je nach Rasse verteilen
    if (race = 1)
    {
        m_attack = 12; m_defense = 9; m_agility = 20;
    }
    else if (race = 2)
    {
        m_attack = 9; m_defense = 12; m_agility = 20;
    }
    else if (race = 3)
    {
        m_attack = 9; m_defense = 9; m_agility = 25;
    }

    cout << "Spieler \"" << m_chName << "\" wurde erfolgreich erstellt!\n";
}


Der Charakter wird jetzt wie folgt erstellt:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    char name;
    cout << "Bitte gib den Namen deines Charakteres ein: ";
    cin >> name;
    cout << endl;

    int rasse;
    cout << "Welcher Rasse soll dein Charakter angehören?\n";
    cout << "1 - Mensch\n";
    cout << "2 - Ork\n";
    cout << "3 - Elfe\n";
    cout << "Rasse(1-3): ";
    cin >> rasse;
    cout << endl;

    CPlayer Player1(name, rasse);


Das ist jetzt nur der Teil in dem die Instanz erstellt wird. Kann ich das mit den Variablen, die ich kurz vor der Abfrage erstellt habe anders machen? Gibt es dafür eine "schönere" Methode? Aber erstmal: Funktioniert das so? Und ist das auch erstmal ok so? Gibt es viel praktischere Methoden(selbst bei sowas simplen)?

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

4

25.10.2011, 21:43

Kann ich das mit den Variablen, die ich kurz vor der Abfrage erstellt habe anders machen?

Die Frage verstehe ich nicht ganz.

Aber erstmal: Funktioniert das so? Und ist das auch erstmal ok so? Gibt es viel praktischere Methoden(selbst bei sowas simplen)?

Ob das funktioniert kannst du ja sicher selbst beantworten. ;)
Ok ist das auf jeden Fall. Würde das wahrscheinlich auch in etwa so machen. Ggf lädt man sich die Variablen für die einzelnen Klassen aus einem XML o.ä., damit man sie nicht hart einprogrammieren muss, aber ansonsten ist das ganz in Ordnung so.
Allerdings hast du da bereits einen Fehler drin, der dich einiges an Debug Zeit kosten könnte. ;)
Schau mal was du da für die Rasse einliest und auf was du dann in der Funktion prüfst!
Ok, ich sags dir gleich, weil es doch nicht ganz intuitiv ist. Du liest den Wert als char ein, was üblicherweisen Buchstaben sind. Da gibt es allerdings auch Zahlen. Das ist grundsätzlich auch gut so. Allerdings prüfst du dann in der Funktion auf 1, 2 und 3. Nun das Problem ist, dass ein '1' (wie es auch in einem String vorkommt) nicht 1 entspricht, sondern 49 (siehe dazu die ANSI Tabelle), aber auch selbst das muss nicht gelten (tut es aber üblicherweise). Also solltest du entweder einen integer einlesen oder in dem Konstruktor auf '1', '2' und '3' prüfen (beachte die Hochkommas, welche dir ein char geben), sonst wirst du keine Werte erhalten.

Wichtige Punkte, wenn du dich ein mal ein wenig mehr mit C++ beschäftigt hast:
  • Initialisierungsliste
  • Enum

helebelele

Frischling

  • »helebelele« ist der Autor dieses Themas

Beiträge: 32

Wohnort: Düsseldorf

  • Private Nachricht senden

5

25.10.2011, 21:51


Die Frage verstehe ich nicht ganz.


Ich hab doch die erst erstellt kurz bevor ich die Abfrage mache, da ich mir gedacht hab, dass ich die ja erst da brauche. Ist das ok so?

Ok, ich sags dir gleich, weil es doch nicht ganz intuitiv ist. Du liest den Wert als char ein, was üblicherweisen Buchstaben sind. Da gibt es allerdings auch Zahlen. Das ist grundsätzlich auch gut so. Allerdings prüfst du dann in der Funktion auf 1, 2 und 3. Nun das Problem ist, dass ein '1' (wie es auch in einem String vorkommt) nicht 1 entspricht, sondern 49 (siehe dazu die ANSI Tabelle), aber auch selbst das muss nicht gelten (tut es aber üblicherweise). Also solltest du entweder einen integer einlesen oder in dem Konstruktor auf '1', '2' und '3' prüfen (beachte die Hochkommas, welche dir ein char geben), sonst wirst du keine Werte erhalten.


Ich hab doch nur den Namen als char und der Konstruktor erwartet auch nur den als char. Die Rasse ist bei der Abfrage als int(siehe Zeile 6) und der Konsturktor erwartet für die Rasse ebenfalls ein Integer. Also ist es doch gleich oder hab ich grad nen Denkfehler? Oo

edit: ok du hast recht :) hab grad gesehen, dass ich im Konstruktor char anstatt int genommen hab :D wollte eigentlich auch im Konstruktor mit Integer arbeiten :) Danke für deine Hilfe^^

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

6

25.10.2011, 21:59

Du meinst "rasse"? - Nein, das ist eigentlich Ok so.

Ah, rasse ist in der Tat int, aber im Konstruktor ist es ein char! Auch die Membervariable ist ein char. In dem Fall wird das funktionieren, weil das korrekt konvertiert wird, aber ich würde da rasse schon auch noch zu einem int machen.

helebelele

Frischling

  • »helebelele« ist der Autor dieses Themas

Beiträge: 32

Wohnort: Düsseldorf

  • Private Nachricht senden

7

25.10.2011, 22:00

siehe edit :) hab ich dann auch gesehen XD und der fehler ist schon behoben :D

helebelele

Frischling

  • »helebelele« ist der Autor dieses Themas

Beiträge: 32

Wohnort: Düsseldorf

  • Private Nachricht senden

8

25.10.2011, 22:10

Jetzt hab ich leider ein weiteres Problem :(
Ich möchte dann im Konstruktor bei der If-Abfrage noch den Namen der Rasse festlegen. Also bei 1 heißt die Rasse einfach "Mensch".
Wollte dann die char-Variable m_chRace = "Mensch"; setzen. Dabei krieg ich jedoch diese Fehlermeldung:

error C2440: '=': 'const char [7]' kann nicht in 'char' konvertiert werden
IntelliSense: Ein Wert vom Typ ""const char *"" kann keiner Entität vom Typ ""char"" zugewiesen werden.

Der Konstruktor sieht wie folgt aus:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
// Konstruktor
CPlayer::CPlayer (char name, int race)
{
    m_chName = name;

    m_health = 100;

    // Attribute je nach Rasse verteilen
    if (race = 1)
    {
        m_chRace = "Mensch";
        m_attack = 12; m_defense = 9; m_agility = 20;
    }
    else if (race = 2)
    {
        m_attack = 9; m_defense = 12; m_agility = 20;
    }
    else if (race = 3)
    {
        m_attack = 9; m_defense = 9; m_agility = 25;
    }

    cout << "Spieler \"" << m_chName << "\" wurde erfolgreich erstellt!\n";
}


Könntest du mir da weiterhelfen?

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

9

25.10.2011, 22:12

Ein char kann nur ein einzelnes Zeichen beinhalten. Du willst aber einen string speichern. Also solltest du anstatt char std::string benutzen.

helebelele

Frischling

  • »helebelele« ist der Autor dieses Themas

Beiträge: 32

Wohnort: Düsseldorf

  • Private Nachricht senden

10

25.10.2011, 22:18

Aber mit einem char kann man doch bis zu 256 Zeichen darstellen oder nicht? Außerdem könnte ich dann doch auch keinen ganzen Namen in einer char-Variable speichern

Werbeanzeige