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

drakon

Supermoderator

  • »drakon« ist der Autor dieses Themas

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

1

22.10.2006, 16:58

Eigenes Spiel (Name noch unnbekannt )

Hallo zusammen.

Ich arbeite im Moment gerade das Buch C++ für Spieleprogrammierer durch und habe zur Übung begonnen ein Spiel zu programmieren.
Ich bin mir was das Spielprinzip angeht noch nicht 100% sicher, aber es wird so in die Richtung eines Brettspieles, wie Schach gehen.

Hier der gesamte Quellcode:

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
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
#include <iostream>
#include <conio.h>
#include <windows.h>

using namespace std;

struct S_Feld //Strukturen

{
    unsigned int Besitzer; //Spieler 1 = 1, Spieler 2 = 2

    unsigned int Typ;       //Typenbezeichnung folgt

};

//Prototypen

void Spielfeld_fuellen (S_Feld Spielfeld[10][10]);
void Spielfeld_zeichnen (S_Feld Spielfeld[10][10]);
void Ausgabe_Spieler1 (S_Feld Spielfeld[10][10], unsigned int x,unsigned int y);
void Ausgabe_Spieler2 (S_Feld Spielfeld[10][10], unsigned int x,unsigned int y);
void Spieler_Zug (unsigned int Aktiver_Spieler, S_Feld Spielfeld[10][10]);
void Figur_bewegen (unsigned int Aktiver_Spieler, S_Feld Spielfeld[10][10],
                    unsigned int Figur_X, unsigned int Figur_Y);
int KeyInput (int SleepTime);
//Prototypen


int main (void)
{
    //Variabeln

unsigned int Punkte_Spieler1 = 0;
unsigned int Punkte_Spieler2 = 0;
unsigned int Aktiver_Spieler = 1;
    //Variablen

S_Feld Spielfeld[10][10];



Spielfeld_fuellen (Spielfeld); // Spielfeld initialisieren

Spielfeld_zeichnen (Spielfeld); //Spielfeld zeichnen


//Spielerauswahl/Austausch

if ( Aktiver_Spieler == 2)
{
Spieler_Zug (Aktiver_Spieler, Spielfeld);
Aktiver_Spieler--;
}

if( Aktiver_Spieler == 1)
{
Spieler_Zug (Aktiver_Spieler, Spielfeld);
Aktiver_Spieler++;
}
//Spielerauswahl/Austausch


    return 0;
}

void Spielfeld_fuellen (S_Feld Spielfeld[10][10])
{
        //Spielfelder löschen

    for(int i = 0 ; i < 10; i++)
        for ( int y = 0; y < 10; y++)
        {
            Spielfeld[i][y].Typ = 0;
            Spielfeld[i][y].Besitzer = 0;
        }
        //Spielfelder löschen


    //Spielfeld initialisieren

Spielfeld[0][0].Besitzer = 1;
Spielfeld[1][0].Besitzer = 1;
Spielfeld[2][0].Besitzer = 1;
Spielfeld[3][0].Besitzer = 1;
Spielfeld[4][0].Besitzer = 1;
Spielfeld[5][0].Besitzer = 1;
Spielfeld[6][0].Besitzer = 1;
Spielfeld[7][0].Besitzer = 1;
Spielfeld[8][0].Besitzer = 1;
Spielfeld[9][0].Besitzer = 1;

Spielfeld[0][0].Typ = 1;
Spielfeld[1][0].Typ = 2;
Spielfeld[2][0].Typ = 3;
Spielfeld[3][0].Typ = 4;
Spielfeld[4][0].Typ = 5;
Spielfeld[5][0].Typ = 6;
Spielfeld[6][0].Typ = 7;
Spielfeld[7][0].Typ = 8;
Spielfeld[8][0].Typ = 9;
Spielfeld[9][0].Typ = 10;

Spielfeld[0][9].Besitzer = 2;
Spielfeld[1][9].Besitzer = 2;
Spielfeld[2][9].Besitzer = 2;
Spielfeld[3][9].Besitzer = 2;
Spielfeld[4][9].Besitzer = 2;
Spielfeld[5][9].Besitzer = 2;
Spielfeld[6][9].Besitzer = 2;
Spielfeld[7][9].Besitzer = 2;
Spielfeld[8][9].Besitzer = 2;
Spielfeld[9][9].Besitzer = 2;

Spielfeld[0][9].Typ = 1;
Spielfeld[1][9].Typ = 2;
Spielfeld[2][9].Typ = 3;
Spielfeld[3][9].Typ = 4;
Spielfeld[4][9].Typ = 5;
Spielfeld[5][9].Typ = 6;
Spielfeld[6][9].Typ = 7;
Spielfeld[7][9].Typ = 8;
Spielfeld[8][9].Typ = 9;
Spielfeld[9][9].Typ = 10;
    //Spielfeld initialisieren

}

void Spielfeld_zeichnen (S_Feld Spielfeld[10][10])
{
        system ("cls");

    cout << "    1   2   3   4   5   6   7   8   9   10" << endl << endl; //Für die Koordinaten


    for (unsigned int y = 0; y < 10; y++)
    {
        if ( y !=9 )                // Für die 

            cout << y+1 << " ";     // Koordinaten

        else                        //

            cout << y+1;            //


            //Eigentliches Spielfeld ausgeben

        for (unsigned int x = 0; x < 10; x++)
        {

            if (Spielfeld[x][y].Besitzer == 1)
                Ausgabe_Spieler1 (Spielfeld, x, y);

            else if (Spielfeld[x][y].Besitzer == 2)
                Ausgabe_Spieler2 (Spielfeld, x, y);

            else if (Spielfeld[x][y].Typ == 50)
                cout << "  X ";
            else
                cout << "  . ";

        }
        cout << endl;
            //Eigentliches Spielfeld ausgeben

    }
    
}

void Ausgabe_Spieler1 (S_Feld Spielfeld[10][10], unsigned int x, unsigned int y)
{
        //Spielfiguren für Spieler 1 erstellen

    switch (Spielfeld[x][y].Typ)
    {
        case 1:
            cout << "  A ";
            break;

        case 2:
            cout << "  B ";
            break;
        case 3:
            cout << "  C ";
            break;
        case 4:
            cout << "  D ";
            break;
        case 5:
            cout << "  E ";
            break;
        case 6:
            cout << "  F ";
            break;
        case 7:
            cout << "  G ";
            break;
        case 8:
            cout << "  H ";
            break;
        case 9:
            cout << "  I ";
            break;
        case 10:
            cout << "  J ";
            break;
        case 50:
            cout << "  X ";
            break;
        case 0:
            cout << "  . ";
            break;
    }   //Spielfiguren für Spieler 1 erstellen


}

void Ausgabe_Spieler2 (S_Feld Spielfeld[10][10], unsigned int x,unsigned int y)
{
        //Spielfiguren für Spieler 2 erstellen

    switch (Spielfeld[x][y].Typ)
    {
        case 1:
            cout << "  a ";
            break;

        case 2:
            cout << "  b ";
            break;
        case 3:
            cout << "  c ";
            break;
        case 4:
            cout << "  d ";
            break;
        case 5:
            cout << "  e ";
            break;
        case 6:
            cout << "  f ";
            break;
        case 7:
            cout << "  g ";
            break;
        case 8:
            cout << "  h ";
            break;
        case 9:
            cout << "  i ";
            break;
        case 10:
            cout << "  j ";
            break;
        case 50:
            cout << "  X ";
            break;
        case 0:
            cout << "  . ";
            break;
    }   //Spielfiguren für Spieler 2 erstellen

}


void Spieler_Zug (unsigned int Aktiver_Spieler, S_Feld Spielfeld[10][10])
{
    unsigned int Figur_X = 0; // Ausgewählte

    unsigned int Figur_Y = 0; // Figur.

    unsigned int Ziel_X = 0;  // Ziel der

    unsigned int Ziel_Y = 0;  // Figur.


    do
    {
        Spielfeld_zeichnen (Spielfeld);

         // Figur abfragen

        cout << "\n\nSpieler " << Aktiver_Spieler << " ist am Zug" << endl;
        cout << "Welche Figur moechten sie bewegen?" << endl;

        do
        {
        cout << "X- Koordinate: " << endl;
        cin >> Figur_X;
        }while ( Figur_X-1 < 0 || Figur_X-1 > 9); //Ist die Figur im Spielfeld?


        do
        {
        cout << "Y- Koordinate: " << endl;
        cin >> Figur_Y;
        }while(Figur_Y-1 < 0 || Figur_Y-1 > 9); //Ist die Figur im Spielfeld?


        if ( Spielfeld[Figur_X-1][Figur_Y-1].Besitzer != Aktiver_Spieler) // Ist die Figur überhaupt dem Spieler?

        {
            cout << "Das ist nicht deine Figur!" << endl; 
            Sleep (3000);
        }
        else
        {
            Figur_X -= 1; //eingegebene Figru dem Array anpassen            // Wenn ja, dann weiter zu der Funktion Figur_bewegen

            Figur_Y -= 1; //

            Figur_bewegen (Aktiver_Spieler, Spielfeld, Figur_X, Figur_Y); 
        }

    } while(Spielfeld[Figur_X-1][Figur_Y-1].Besitzer != Aktiver_Spieler);  //Wenn nein, dann wiederholen

    
}


void Figur_bewegen (unsigned int Aktiver_Spieler, S_Feld Spielfeld[10][10],
                    unsigned int Figur_X, unsigned int Figur_Y)
{
    unsigned int Puffer = 0; //Puffer, damit wir ein X ausgeben können, und nachher trotzdem noch die Spielfigur haben

    int Auswahl = 0;        //Auswahl für die Tastaturabfrage


    do
    {
        Puffer = 0;  //Puffer auf 0 setzen.

        Puffer = Spielfeld[Figur_X][Figur_Y].Typ; //Puffer mit dem Typen der Figur füllen

        
        Spielfeld[Figur_X][Figur_Y].Typ = 50;   //Figur für "X" dem Array zuweisen. (Ich habe 50 wegen der besseren abhebung genommen ;-))


        Spielfeld_zeichnen (Spielfeld);
        Auswahl = KeyInput (150);               // Tastaturabfrage


        switch ( Auswahl)
        {
        case 1:
            Spielfeld[Figur_X][Figur_Y].Typ = Puffer; //Wir brauchen das "X" auf diesem Feld ja nicht mehr, daher wieder zurück mit unserem Puffer

            Figur_Y--;                                  //Neues Feld auswählen

            break;
        case 2:
            Spielfeld[Figur_X][Figur_Y].Typ = Puffer; //...

            Figur_Y++;                                  //...

            break;
        case 3:
            Spielfeld[Figur_X][Figur_Y].Typ = Puffer;
            Figur_X--;
            break;

        case 4:
            Spielfeld[Figur_X][Figur_Y].Typ = Puffer;
            Figur_X++;
            break;

        }


    }while ( Auswahl != 7); //So lange machen, bis "ESC" gedrückt wird


    
}

int KeyInput (int SleepTime) //Diese Funktkion habe ich Dragonflame "geklaut" aus dessen "Catcher" geklaut. ;-)

{
    //Variable

    int ReturnValue = 0;

    _getch ();

    if (GetAsyncKeyState (VK_UP))     ReturnValue = 1;
    if (GetAsyncKeyState (VK_DOWN))   ReturnValue = 2;
    if (GetAsyncKeyState (VK_LEFT))   ReturnValue = 3;
    if (GetAsyncKeyState (VK_RIGHT))  ReturnValue = 4;
    if (GetAsyncKeyState (VK_RETURN)) ReturnValue = 5;
    if (GetAsyncKeyState (VK_SPACE))  ReturnValue = 6;
    if (GetAsyncKeyState (VK_ESCAPE)) ReturnValue = 7;

    Sleep (SleepTime);
    return ReturnValue;
}


Ich hoffe, dass ich ihn gut genug kommentiert habe.
Nur so, es ist bei weitem noch nicht fertig, ich habe nämlich ein grösseres Problem. Nämlich bei der Tastaturabfrage. Ich möchte die Ausgewählte Figur mit einem X ersetzen und dann je nach Richtung verschieben.
Nachher sollte die Stelle, an der das X war wieder zurückgesetzt werden. (Das passiert in der Funktion: Figur_bewegen)
Nur mein Problem: Irgendwie durchläuft das Programm die Schlaufe 2 mal, anstatt einmal bis wieder die Tastaturabfrage kommt. Und genau hier werden die einzelenen Figuren nicht mehr auf ihr ursprünglichen Typ zurückgesetzt, und daher erscheinen auf dem Bildschrim dann immer noch die "X", welche schon längst weg sein müssten.
Ich habe sehr viel rumgebastelt und ausprobiert, bin aber zu keiner Lösung gekommen, aber was ich vermute ist, dass irgendetwas mit dem _getch (); nicht richtig funktioniert.

Ich hoffe, dass alles verständlich war, aber ich finde beim besten willen so alleine keine Lösung.

Als Anmerkung: Ich bin bei weitem noch nicht fertig, und viele ist noch überhaupt nich fertig, ich habe mich bis jetzt mit dem grösstem Problem (dieser Tastaturabfrage) auseinandergesetzt und hatte sonst noch nicht soo viel Zeit, um den Rest zu machen. Die anderen Probleme werde ich, so denke ich schon irgendwie hinbekommen und vorallem bemerken.
Wenn ich aber denke fertig zu sein, werde ich das Projekt nochmal posten und dann könne wir in die feinen Details gehen. Im Moment aber möche ich, dass wir den "Problemteil" anschauen.
Ich bin gerne bereit die Kritik für den Rest des Quellcodes anzunehmen, aber NOCH nicht.;-)- Solange ich dieses Problem habe, interessiert mich den Rest nicht wirklich.

Danke im Voraus!

Lg Drakon

T-VIRUS

Alter Hase

Beiträge: 548

Wohnort: Göttingen(West)/Nordhausen(Ost)

Beruf: Schüler

  • Private Nachricht senden

2

22.10.2006, 17:44

Kannst du nicht oben die Globalenvariablen nicht lokal machen?
Oder vllt Singletons/namespaces nutzen?
Meine Blog:)

Wer Bugs im Text findet kann sie melden, fix erscheint irgendwann :D

MFG T-VIRUS

drakon

Supermoderator

  • »drakon« ist der Autor dieses Themas

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

3

22.10.2006, 17:56

hmm..ich habe doch blos die Struktur globale.
Die Prototypen würden probleme machen, wenn ich die Lokal machen würde.
Oder wie meinst du das?
Ich weiss jetzt nicht, was Singletons/namespaseces genau sind...
würde das mein Problem lösen?

Anonymous

unregistriert

4

22.10.2006, 17:56

T-VIRUS
Er hat doch gar keine Globalen Variablen?!

drakon

Supermoderator

  • »drakon« ist der Autor dieses Themas

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

5

22.10.2006, 18:06

habe ich doch auch gedacht...

@unsigned long
Wenn du schon hier bist. Du kannst mir bestimmt helfen, nicht?

Anonymous

unregistriert

6

22.10.2006, 18:16

drakon
Dauer was, ich muss erstmal in diesem Wirwarr den durchblick finden :roll:

drakon

Supermoderator

  • »drakon« ist der Autor dieses Themas

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

7

22.10.2006, 18:18

ahh, ok, kein Problem, wenn noch unklarheiten sind, dann nur sagen.
Ich war nicht sicher, ob ich es genug beschreibe. Habe das ja noch nie so gemacht...
Ich habe gedacht, dass der Code nicht allzu kompliziert sein kann, da ihr ja etwas mehr erfahrung habt.;-)

Anonymous

unregistriert

8

22.10.2006, 18:32

drakon
Doch also ich muss schon sagen, erheblich kompliziert und redundant.

Ich versuch erstmal etwas zu optimieren, bevor ich noch an XYZ Stellen rumwerkle und den Fehler nicht finde. So finde ich ihn dann leichter.

Erstmal: Redundanz ausschalten.

z. B. hast Du 2x Ausgabe_Spieler (Für Spieler 1 und 2). Selber aufbau usw. Ich habs mal in eine Funktion geknallt mit 4. Parameter wo Du angibst ob es Spieler 2 ist oder Spieler 1.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
void Ausgabe_Spieler (S_Feld Spielfeld[10][10], unsigned long x, unsigned long y, bool player_two) 
{ 
    static const char value [2][11] =
    {
        {'.', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J'},
        {'.', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'},
    };

    if (Spielfeld[x][y].Typ < 11)
        std::cout << "  " << value[player_two][Spielfeld[x][y].Typ] << " " << std::endl;

    if (Spielfeld[x][y].Typ == 50)
        std::cout << "  " << (player_two ? 'x' : 'X') << " " << std::endl;
}


Das macht den Code da oben schon mal erheblich kleiner.

Ich guck mal weiter :roll:

Anonymous

unregistriert

9

22.10.2006, 18:35

drakon
Spielfeld füllen auch sehr sehr viel für wenig. Dazu fehlte dort die Referenz.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
void Spielfeld_fuellen (S_Feld &Spielfeld[10][10]) 
{ 
        //Spielfelder löschen 

    for(int i = 0 ; i < 10; i++) 
        for ( int y = 0; y < 10; y++) 
            Spielfeld[i][y].Typ = Spielfeld[i][y].Besitzer = 0; 

        //Spielfeld initialisieren 

    for (unsigned long i=0; i<10; ++i)
    {
        Spielfeld[i][0].Besitzer = 1; 
        Spielfeld[i][0].Typ      = 1 + i; 

        Spielfeld[i][9].Besitzer = 1; 
        Spielfeld[i][9].Typ      = 1 + i; 

    }
}

drakon

Supermoderator

  • »drakon« ist der Autor dieses Themas

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

10

22.10.2006, 18:39

heisst dass nicht i++?

Werbeanzeige