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

1

06.02.2013, 10:04

[C++]Erstes Spiel mit Klassen programmieren(sinn der klassen noch nicht ganz klar)

Hallo Leute

Ich habe mal ein paar fragen an euch bezüglich meines ersten Spielprojects mit Klassen.

Ich muss ehrlich gestehen, ich habe noch nicht angefangen, weil ich mir das ganze noch überhaupt nicht vorstellen kann.

Erstmal so die vorstellung, was genau ich machen möchte.

Ich möchte eine Map zeichnen aus punkten also .... Der Spieler wird hier auf die Koordinate 1:1 dann gestellt.
Desweiteren möchte ich einen gegner einbauen, und den mit einer Art attacke ausrüsten.
Das soll heißen, wenn der Spieler nah genug an die Koordinate des Gegners kommt, soll er die attacke ausführen, und rund um die Koordinate sollen # gezeichnet werden. Die # stehen hierbei für die Range der attacke.


So meine Frage wäre nun wie folgt.

Was sollte ich dabei in eine Klasse packen?
Die Map?
Den Spieler?
Den Gegner?

Ich habe halt dabei bedenken, wenn ich alles in Klassen packe, muss ich ja Spielerkoordinaten und Map theoretisch public setzen.


Ich hoffe ihr könnt mir da ein bisschen Licht ins dunkle bringen
Gruß Leri :)

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

2

06.02.2013, 11:20

Das kann man jetzt beliebig komplex machen. Gucken wir mal was du hast. Eine Umgebung, einen Spieler und einen Gegner. Wären im Prinzip drei Klassen. Gucken wir mal weiter. Ein Spieler hat eine Position. Ein Gegner hat auch eine Position. Ein Spieler hat ein Bild/Symbol. Ein Gegner hat das auch. Ein Gegner hat eine Attacke. Nun schreibst du nicht ob der Spieler das auch hat. Vermutlich schon. Von daher stellt sich die Frage ob man hier 2 Klassen machen soll oder bei einer bleibt. Um das ganze ein wenig einfacher zu machen, könnte man eine Basisklasse machen, welche eine Position und ein Bild/Symbol/was auch immer hat. Dort kommen alle Gemeinsamkeiten eines Spielers und eines Gegners rein. Spieler und Gegner leiten dann davon ab.
Das ist natürlich nur ein Beispiel. Es ist gut wenn du guckst was du hast. Dann guckst du welche Klassen du daraus machen würdest. Als nächstes versuchst du Gemeinsamkeiten zu finden. Manchmal kann man aus zwei Klassen eine machen. Manchmal kann man für Klassen eine gemeinsame Basisklasse finden. Es ist sinnvoll wenn du dir am Anfang simple Spiele suchst um das zu lernen. Mit der Zeit kommen noch viel mehr Klassen dazu die für dich jetzt möglicherweise noch nicht klar sind. Unter Umständen möchtest du Spielzustände abbilden, ein Fenster abstrahieren oder irgendwelche Verwaltungsklassen schreiben. Auch wenn es langweilig klingt. Tic Tac Toe, Vier Gewinnt, Pong, Breakout, das sind so Spiele die schön simpel sind und an denen man ein wenig Klassendesign ausprobieren kann.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

3

06.02.2013, 11:50

danke schonmal für deine Antwort.
Die Vererbung ist mir soweit schon bewusst.

Ich habe eher schwierigkeiten bei der umsetzung.

Die klassen Spieler und Gegner haben ja eine x-y Koordinate also eine Position.

Sagen wir mal ich mache nun eine klasse die map zeichnen heißt.

Hier hänge ich sozusagen, weil ich nicht genau weiß, wie ich mit klassen da umgehen soll.
Jede für sich stellt ja ein Objekt da.
Ich würde jetzt x und y Koordinate in den klassen privat machen, was aber heißt ich kann die variablen nicht in die Map klasse bringen, weil sie ja privat in den anderen wären.

Und genau da hab ich eben das problem mit dem denken.
Es heißt, Koordinaten sollten eigentlich privat sein, da es schwierigkeiten gibt, wenn der quelltext größer wird und ich dann zufällig im programm einfach auf diese zugreife und diese verändere(public)

^^ Ich weiß halt dementsprechend momentan nicht wie ich die Spieler auf die Map dann setzen soll, wenn die Koordindaten der Spieler Privat in der Klasse selbst sind und in die Klasse map reingebracht werden müssen

4

06.02.2013, 11:55

Habe schon nach vielen tutorials geschaut u.s.w

Da wird halt nur beschrieben wie man diese erstellt, und einzeln verwendet sprich nur die klasse selbst, nicht halt mit anderen funktionen und anderen teilprogrammen.

z.b so
class test
{
//pseudo klasse
void test();
}

test t1;
test.test();




ich bräucht halt mal ein tutorial, wo mal gezeigt wird, wie arbeitet man mit klassen im ersten projekt oder so ^^
class map
{
privarte:
int Spieler;
int x;
int y;
public:
void besetztespielfeld(int x, int y)
{
x=klasse spieler x ....
}
void ZeicheMap()
}
class berechnen
{
private:
int y;
int x;
public:
void berechnen(int x, int y);
}

int main()

5

06.02.2013, 12:28

ich habe hier mal einen alten code von mir, ich kann damit wunderbar einen Spieler platzieren und herumlaufen lassen.

Sagen wir mal ich würde den Spieler in eine Klasse packen, was ja logisch wäre, bloss ich weiß halt nicht genau, wie ich mit klassen und der normalen main funktion dann richtig arbeite, wenn alles in klassen liegt.

Ich muss ja über 1 klasse die map zeichnen über 1 den Spieler injizieren also auf die karte und halt noch ein gegner


Der Code hier stellt eine Map da, die eine quest enthält und ein ziel mit letzendlicher attack funktion, wo man von einem monster angegriffen wird ^^

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
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
#include <iostream>
#include <conio.h>
#include <stdio.h>
using namespace std;
//Variablen
/////////////////////////
    int breite = 15;
    int hoehe = 15;
    int Zielh = 12;
    int Zielb = 8;
    int spielerh = 0;
    int spielerb = 0;
    int einsatzh =0;
    int einsatzb= 0;
    int questb = 4;
    int questh = 3;
    char questann;
    int questan;
    int questab = 0;
    int c;
    int ergebnis = 0;
    char attacke;
    //Variablen
    //////////////////
   int Spielerleben = 100;
   int  Spielerdefense = 50;
  int  Spielerdmg = 45;

  int  enemyleben = 200;
   int enemydefense = 20;
   int enemydmg = 10;

    
    
    char auswahl;
    ////////Funktion: quest
    int aufgabe(    int spielerh,
    int spielerb)
 {

    char questann;
        int questb = 4;
    int questh = 3;
 
    
 
    if(spielerh==questh && spielerb==questb)
    {
                    
                        cout << " Moechten Sie die quest annehmen(l)ja (n)ein?" << endl;
                        cin>>questann;
                
                        switch(questann)
                        {
                                        case('l'):
                                                {
                                                        cout << "Du hast die quest angenommen, kehre zum Ziel zurück" << endl;
                                                        ergebnis++;
                                                        
                                                        
                                                        }break;
                                        case('n'):
                                                {
                                                        cout << " Du hast die quest nicht angenommen" << endl;
                                                        return ergebnis=0;
                                                        }break;
                                    default:
                                            {
                                                        cout << " Falsche Eingabe" << endl;
                                                        }
                                                        }
                                                        }





return ergebnis;
                                                        
}   
void bewegen()
{
   cout << " Gehe mit (s)runter oder (d)zur seite rechts (a)nach links (w)nach oben" << endl;

    c = getch();

   switch (c)
   {
        case('s'):
                    {
                            spielerh++;
                            }break;
        case('d'):
                    {
                            spielerb++;
                            }break;
        case('w'):
                    {
                            spielerh--;
                            }break;
        case('a'):
                    {
                            spielerb--;
                            }break;
        default:
                {
                            cout<<"Falsche Eingabe"<< endl;
                            }
                }
   
  
}  
void spielfeld()
{
            for(int y=0; y<breite; y++)
                    {
            
        for(int x=0; x<hoehe; x++)
                    {
                            
                            
                
        if(y==spielerh && x==spielerb)
                    {
                                
                                    
                                    
                    cout <<"S";
                    
                    
                    
                    }else{
        if(y==Zielh && x==Zielb)
                    {
                                
                                
                    cout <<"Z";
                    
                    
                    
                    }else{
                        
                    
        if(y==questh && x==questb)
                        {

                    cout <<"Q";

                            
                        
                    }else{
                    
                    
        
                            
                            
                cout << ".";}}}}

   
                        
                        
                cout << endl;}
                
 }
            
int kampf(int Spielerleben,int Spielerdefense,int Spielerdmg,int enemyleben,int enemydefense ,int enemydmg)
{
    //Variablen
    //////////////////
   Spielerleben = 100;
    Spielerdefense = 50;
   Spielerdmg = 45;

   enemyleben = 200;
   enemydefense = 20;
   enemydmg = 10;
   if(spielerh==Zielh && spielerb==Zielb)
   {

   if(ergebnis>=1)
   {
                Spielerleben+= 100;
                }
                                    do
{
                                    
    cout << "Ein Monster attackiert dich" << endl;
    cout << "Fuehre eine attacke aus!!!" << endl;
    cout <<" gebe (a) ein um die attacke zu starten" << endl;
    c = getch();
    switch (c)
   {
        case('a'):
                    {
                        enemyleben -=  Spielerdmg;
                            }break;
                            default: 
                                    {
                                        cout << " Falsche Eingabe" << endl;
                                        
                                        }


            
    
        }
    cout << " Leben Des Gegners" << enemyleben << endl;
    cout << " Der gegner greift dich an " << endl;
    Spielerleben-= enemydmg;
    cout <<"Spielerleben" << Spielerleben << endl;
    Spielerleben - enemydmg;
    cout <<"Dein restlichen Leben" << endl;
   
    }while(Spielerleben >0 && enemyleben >0);
    cout << "Du hast denn gegner besiegt " << endl;
    }else{
        }
    }
    
 
int main()
{
    
    
    //Variablen
    //


do{
    
cout << ergebnis << endl;   
bewegen();   

spielfeld();

aufgabe(spielerh, spielerb);



 kampf(Spielerleben,Spielerdefense,Spielerdmg,enemyleben,enemydefense ,enemydmg);
}while (spielerh!=Zielh || spielerb!=Zielb);
cout << "Du hast das Ziel erreicht" << endl;




        

    system("pause");
    return 0;
}

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

6

06.02.2013, 12:44

Du kannst deine Beiträge editieren und so erweitern ohne jedes mal neu posten zu müssen;)
Hast du ein vernünftiges Buch mit welchem du C++ gelernt hast? Da sollten so Klassenbeispiele eigentlich drin gemacht werden. Wenn du außerhalb von Spieler auf die Koordinaten zugreifen willst, dann mach doch eine Methode welche die Koordinaten zurück liefert.

C-/C++-Quelltext

1
2
3
4
5
6
7
class Spieler
{
private:
Vector2 position;
public:
Vector2 GetPosition(){return position;}
};

Hab lange kein C++ mehr programmiert. Hoffe der Code ist einigermaßen korrekt;) Den Getter kannst du glaube ich auch const machen.
Ich glaube auch zu sehen, dass du dir da etwas zu viel für den Anfang vornimmst. Eine Klasse für Daten, eine für Berechnungen, eine für die Anzeige etc, kann eine super Sachen sein. Dann sollte man aber wissen was man da tut. Für den Anfang wäre es wohl besser wenn du ein paar weniger Klassen machst. Teil die einfach so ein als wenn du ein Brettspiel machen würdest. Dort gibt es eine Spielfigur, ein Spielfeld und so weiter. Und auch noch mal mein Vorschlag vielleicht ein Pong oä zu schreiben.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

7

06.02.2013, 13:05

Habe jetzt ein wenig rumexperimentiert, und es erstmal global gehalten also public.

Vielleicht könnt ihr mal drüberschauen, und gucken ob das so Regelgerecht ist.

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
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
#include <iostream>
using namespace std;
int setx = 0;
int sety = 0;

class CRaumschiff
{

public:
    int x_Pos;
    int y_Pos;
    void setzeRaumschiff(int x, int y);
    void ZeigeDaten();
};
void CRaumschiff::setzeRaumschiff(int x, int y)
{

   x_Pos=x;
   y_Pos=y;


    cout << "Die Koordindaten Deines Raumschiffes wurden gesetzt" << endl;
    cout <<"x Koordindate: " <<x_Pos << endl;
    cout <<"y Koordinate :  " << y_Pos << endl;

}
void CRaumschiff::ZeigeDaten()
{
    cout <<"Schiff Koordindaten "<< endl;
    cout <<"x_Koordindate" << x_Pos << endl;
    cout <<"y Koordindarte" << y_Pos << endl;
}
int main()
{
CRaumschiff Schiff1;
CRaumschiff Schiff2;

//Besetzten
cout << "Besetze das raumschiff" << endl;
cin >>setx;
cin >>sety;

Schiff1.setzeRaumschiff(setx, sety);
setx = 0;
sety =0;
cout << "Besetze das raumschiff" << endl;
cin >>setx;
cin >>sety;
Schiff2.setzeRaumschiff(setx,sety);

Schiff1.ZeigeDaten();
Schiff2.ZeigeDaten();
int Hoehe = 20;
int Breite =20;


for(int i=0; i<Hoehe; i++)
{


    for(int j=0; j<Breite; j++)
{
    if(i==Schiff1.x_Pos && j ==Schiff1.y_Pos)
    {
        cout <<"X";
    }
    else
    {
    if(i==Schiff2.x_Pos&&j==Schiff1.y_Pos)
    {
        cout <<"G";
    }
    else
    {


 cout <<"-";
    }
    }
}
cout << endl;
}
return 0;

}



Nun möchte ich mich ja mit dem x sozusagen bewegen können, wie könnte ich das jetzt wieder rum realisieren?

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »leridan« (06.02.2013, 13:21)


Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

8

06.02.2013, 13:32

Codedesign ist immer abhängig vom Problem. Ich könnte dir jetzt hier irgendein Klassendesign zeigen, das wird dann aber nicht besonders gut auf dein Problem zugeschnitten sein. Hinzu kommt, dass du davon nicht lernst dir deine Klassen zu strukturieren.
Du hast eine public Methode zum setzen der Koordinate und die Variablen sind public. Eins von beidem ist vermutlich über. Gewöhn dir für den Anfang vielleicht erst mal an mit Gettern und Settern zu arbeiten. Wenn du also außerhalb der Klasse auf Variablen zugreifen musst, dann benutzt du dafür Methoden und lässt die Variablen selbst private.
Zum Thema Bewegung, was ist da genau deine Frage? Wie du eine Bewegung umsetzt? Hast du ein Buch mit dem du C++ lernst? Wenn ja welches ist das? In einem Buch über Spieleprogrammierung sollte sowas normalerweise angesprochen werden. Wenn es dir nur darum geht, wie du das bei den Klassen realisierst, du kannst das innerhalb der Klasse machen und dir dafür eine Methode schreiben, oder über die Getter und Setter lösen indem du halt den Wert holst, dann deine Berechnungen machst und den Wert danach wieder setzt. Das ist halt alles Geschmackssache. Am einfachsten ist einfach auszuprobieren was dir gefällt. Man muss erst mal ein Gefühl für die Sache kriegen. Wenn das vorhanden ist, kannst du dir ja vielleicht mal ein Buch zu OOP oder so angucken. Da gibts sicherlich noch einige Sachen die man lernen kann. Aber Grundwissen muss sitzen. Und noch mal mein Hinweis vielleicht erst ein Pong zu versuchen. Man muss sich lösbare Ziele setzen und wenn du schon Probleme hast Bewegungen zu designen, dann solltest du dir vielleicht für den Anfang etwas einfacheres suchen.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

9

06.02.2013, 14:59

Also habe jetzt mal ein bisschen rumprobiert.

Die erste frage, die ich mir stelle, was genau meinst du denn mit gettern und settern?



hab bisschen rumprobiert, das laufen klappt schon, möchte aber auch lieber das die variablen privat sind, deswegen frag ich mal ins blinde was getter und setter sind.

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
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
#include <iostream>
#include <conio.h>
#include <stdio.h>

using namespace std;
//Klasse Gegner

//Klassen
class Spieler
{
public:
    //Membervariablen
    int x_Pos;
    int y_Pos;
    int Leben;

    //Memberfunktionen
    Spieler();
   int SetzeNeueKoordinaten();
};
//Konstruktor
Spieler::Spieler()
{
    cout << "Raumschiff wird erstellt" << endl;
    y_Pos = 1;
    x_Pos = 1;
    cout << "Koordinaten gesetzte, auf " << x_Pos<< "und  " << y_Pos << endl;
    cout << "LebensPunkte 200" << endl;
    Leben = 200;
}
int Spieler::SetzeNeueKoordinaten()
{

cout <<"Bewege deinen Spieler mit (w),(a),(s),(d), " << endl;
char b;
b=getch();
switch(b)
{
case('w'):
    {
        x_Pos--;
    }break;
case('s'):
    {
        x_Pos++;
    }break;
case('a'):
    {
        y_Pos--;
    }break;
case('d'):
    {
        y_Pos++;
    }break;
}
}
//Funktionen
void ZeichneMap(int Breite, int Hoehe, int NKordx, int NKordy);
//Variablen
int Mapbreite = 20;
int Maphoehe = 20;

int Auswahl=0;

int main()
{
    cout <<"Wilkommen im Spiel Die Erste Reise" << endl;
    cout <<"----------------------------------" << endl;
    cout <<"Waehle bitte was du tun moechtest " << endl;
    cout <<"(1)Neues Spiel (2) Optionen, (3)Spiel Beenden" << endl;
    cin >> Auswahl;
    switch(Auswahl)
    {
    case(1):
        {
            cout << "Spiel wird gestartet" << endl;
            Spieler Peter;

            do
            {

            ZeichneMap(Mapbreite, Maphoehe,Peter.x_Pos, Peter.y_Pos );
            Peter.SetzeNeueKoordinaten();
            }while(Peter.x_Pos!=20&&Peter.y_Pos!=0&&Peter.x_Pos&&Peter.y_Pos!=20);
        }break;
    case(2):
        {
            cout << "Optionen werden geoffnet" << endl;

        }break;
    case(3):
        {
            cout << "Spiel wird heruntergefahren" << endl;
        }break;
    }


    return 0;
}
void ZeichneMap(int Breite, int Hoehe, int NKordx, int NKordy)
{
    for(int i=0; i<Breite; i++)
    {


        for(int j=0; j<Hoehe; j++)
        {

            if(NKordx==i&&NKordy==j)
            {
                cout <<"X";
            }
            else
            {


            cout <<"-";
            }
        }
        cout << endl;
    }

}

10

06.02.2013, 15:40

könntest du mir dazu ein beispiel vielleicht posten? :)

weil das hört sich genau nach dem an, was ich bräuchte werte heraus bekommen und rein zu kriegen die privat sind

Werbeanzeige