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

BK Simon

Treue Seele

  • »BK Simon« ist der Autor dieses Themas

Beiträge: 151

Beruf: Student

  • Private Nachricht senden

1

08.10.2012, 23:01

Kleines Snake Game - Probleme mit der Kollision /abgeschlossen

Guten Abend liebe Community, :)

ich arbeite zurzeit an einem kleinen Snake - Game in der Konsole, doch komme ich zurzeit leider nicht damit weiter, da ich mich zurzeit an dem Körper versuche.

Bisher habe ich:
- 10x10 großes Spielfeld
- Schlangenkopf als Smiley
- Food als Herz
- Kollisionserkennung
- Steuerung mit W, A, S, D

Jetzt gerade versuche ich einen Fehler rauszufinden aber ich habe leider keine Ahnug wo er ist ^^

Denn
wenn meine Schlange das 2. Herz eingesammelt hat, wird kein neues Herz
auf der Map erzeugt. Dies Tritt immer erst ab dem 2. Herz auf und danach
kommt lange nichts und nach ca. 20 Sekunden setzt sich die Variable die
dafür da ist zu prüfen ob der Kopf der Schlange mit dem Herz kollidiert
ist sich auf true, ein neues Herz erscheint und kann wieder
eingesammelt werden.
Bei jedem weiterem Herz kommt das selbe Problem
auf, die Ursache dafür habe ich bis jetzt nicht rausgefunden und sitze
bis jetzt schon ne gute Stunde dran.

Falls jemand eine Idee hat wonach ich suchen könnte, würde ich mich freuen, wenn er mir dies mitteilt :)

So schaut der Kern des Programmes aus:
Im Ausschnitt sieht man den Teil zu dem verzweigt wird, wenn "W" gedrückt wurde:

kurze Erklärung:
- Spielfeld ist ein 2D Array mit int Werten. 1 = Kopf, 2 = Herz, 3 = Körper, 0 = ein Punkt ( also nichts)
- in eingabe wird der int - Wert gespeichert der von getch () zurückgelieft wird.
- Snake ist die Liste indem die Schlange gespeichert wird.
- Foodpoisiton ist ein 1D Array für 2 int Werte (x und y - Position des Herzes ).
- getroffen ist eine bool - Variable die auf true gesetzt wird falls der Kopf das Herz berührt.
- breite und hoehe sind die Maße des Spielfeldes

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
switch ( eingabe )
        {
        case 119:
            {
                while ( true )
                {   
                    Kopf_bewegen ( Spielfeld, eingabe, &Snake );

                    Check_Kollision ( Foodposition, &getroffen, &Snake );

                    Spielfeld_updaten ( Spielfeld, Foodposition, &getroffen, &Snake );

                    system("cls");

                    Spielfeld_ausgeben ( Spielfeld, breite, hoehe );

                    Sleep(300);

                    if ( kbhit() )
                    {
                        eingabe = getch();

                        if ( eingabe == 100 ||
                             eingabe == 115 ||
                             eingabe == 97
                             )
                        {
                            break;
                        }
                    }

                }
                break;
            }


Ich hoffe ihr könnt mir dabei Helfen :)

Gruß
Simon
»BK Simon« hat folgendes Bild angehängt:
  • Snake.jpg

Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von »BK Simon« (11.10.2012, 01:09)


Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

2

09.10.2012, 09:07

Dann solltest du dir vielleicht ein Buch zu C++ zulegen;) Das sind eindeutig Grundlagen und wenn die fehlen wird es dir unmöglich sein dein Spiel zu entwickeln.
Du muss die Liste doch einfach nur mit den Structs füllen und dann übergeben. Wenn du einen Zeiger übergeben willst und nicht weißt wie das geht, dann solltest du dir Zeiger dringend noch mal angucken. Die Liste kannst du dann als Zeiger oder als Referenz übergeben. Wenn dich das alles zu sehr überfordert wäre ein Blick auf eine andere Sprache vielleicht auch nicht schlecht. Das sind nun mal alles Sachen die es kompliziert machen und die man sich bei anderen Sprachen sparen kann. Vielleicht verstehe ich dein Problem aber auch nur falsch.
Wenn das so ist, beschreib es noch mal und gib mal ein Codebeispiel, wie du versuchst hast die Liste zu übergeben.

Und zu deinen Structs, gibt es einen Grund dafür warum du Structs und keine Klassen verwendest? Solange du keinen guten Grund hast Strukturen zu benutzen, solltest du dir angewöhnen auf Klassen zurück zu greifen.
„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.“

BK Simon

Treue Seele

  • »BK Simon« ist der Autor dieses Themas

Beiträge: 151

Beruf: Student

  • Private Nachricht senden

3

09.10.2012, 14:21

Erstmal danke für deine Antwort :)

Ehm... Ich habe das Buch vom Herrn Kalista durchgearbeitet und das Problem, dass ich habe ist nicht, dass ich nicht weiß wie man prinzipiell mit Zeiger und Referenzen umgeht nur weiß ich leider nicht auf anhieb, wie ich das genau in die Parameter schreiben muss.
Ich muss zugeben, habe es noch nicht ausprobiert, da ich schon ohne die Zeiger auf ein Problem gestoßen mit, womit ich nicht weiterkomme.

Mein eigentliches Problem liegt darin dass,...

Wenn meine main.cpp ungefähr so ausschaut:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <list>
#include <iostream>
#include "Init.h"

struct Pos
{
    int x;
    int y;
};

void main ()
{

    list<Pos> Schlange;

      Init ( Schlange );

}



Der Kopf der Funktion Init könnte dann ja wie folgt aussehen:

C-/C++-Quelltext

1
void Init ( list<Pos> Schlange );


So, nun weiß die Funktion leider nichts mit dem Pos anzufangen und wird da leider ein paar Fehler ausspucken.
Und da fällt mir im Moment leider nicht ein wie ich das genau machen soll, obwohl mir gerade die Idee kommt, die Struktur in ne hedder-Datei zu packen und die einfach in der main sowie in der Init aufzurufen.
Im Buch vom Herrn Kalista habe ich leider keine direkte Lösung für das Problem gefunden, da dort seine einzige Übergabe mit einer int - Liste gemacht wurde.

---
Warum ich keine Klasse verwende:
Da hast du natürlich recht und Klassen wären sicherlich eine bessere Lösung und ich habe auch vor falls das Spiel so irgendwann richtig läuft, den Code umzuschreiben und Klassen zu verwenden.
Doch vorerst war es für mich so die einfachere Lösung.

Wieso C++:
Ein Wechsel zu einer anderen Sprache habe ich auf keinen Fall vor, da ich zurzeit auch auf schulischem Wege C++ lerne und es meiner Meinung nach dann doof wäre, mit einer anderen Sprache anzufangen.

BK Simon

Treue Seele

  • »BK Simon« ist der Autor dieses Themas

Beiträge: 151

Beruf: Student

  • Private Nachricht senden

4

10.10.2012, 02:52

Habe mich gerade nochmal drangesetzt und habe nun rausgefunden, wie ich es richtig mache, somit ist das Problem vorerst beiseite geräumt :)

Das, was ich heute in einer kleinen Test-Datei ausprobiert habe muss ich jetzt nurnoch in mein richtiges Spiel implementieren und werde dann sobald alles fertig ist und keine weitern Probleme aufkommen, das Snake - Game im Projekt Thread kurz vorstellen :)

BurningWave

Alter Hase

Beiträge: 1 106

Wohnort: Filderstadt/Konstanz

Beruf: Student

  • Private Nachricht senden

5

10.10.2012, 19:30

Wenn du main() nicht verlässt, bzw. die Liste nur in diesem Gültigkeitsbereich benötigst, wäre void Init ( list<Pos> &Schlange); sinnvoller (Übergabe als Referenz).

BK Simon

Treue Seele

  • »BK Simon« ist der Autor dieses Themas

Beiträge: 151

Beruf: Student

  • Private Nachricht senden

6

10.10.2012, 20:46

@BurningWafe
Ja, genau so habe ich es dann auch geklappt und nun funktioniert es super und die Schlange schlängelt sich samt Körper über meinen Bildschirm ( Konsole ).

Letztes Problem habe ich gelöst und nun habe ich das neue Problem im Anfangspost geschildert :)

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »BK Simon« (10.10.2012, 20:57)


BK Simon

Treue Seele

  • »BK Simon« ist der Autor dieses Themas

Beiträge: 151

Beruf: Student

  • Private Nachricht senden

7

11.10.2012, 01:08

Und nun habe ich auch dieses Problem gelöst bekommen :)

Werbeanzeige