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

Sc4v

Alter Hase

  • »Sc4v« ist der Autor dieses Themas

Beiträge: 376

Beruf: Student

  • Private Nachricht senden

1

28.08.2010, 20:44

Problem bei Kartenerstellung für Snakeklon

Hey Leute,

um ein wenig mehr Erfahrung zu bekommen habe ich mich an einen Snakeklon für die Konsole gemacht und habe dabei ein Problem.
Das ganze soll wie ein Tile Based Spiel funktionieren... ich denke das wäre bei einem solchem Spiel angebracht. Leider ist das Tutorial dort für Flash geschrieben und nicht für C++ und somit funktioniert das meiste irgendwie nicht (oder ich stelle mich tierisch doof an).
Ich habe ein Array für mein Feld erstellt:

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
    int field [] = {   // 30 * 20
                         1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
                         1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
                         1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
                         1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
                         1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
                         1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
                         1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
                         1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
                         1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
                         1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
                         1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
                         1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
                         1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
                         1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
                         1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
                         1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
                         1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
                         1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
                         1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
                         1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
                         1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
                         1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
                    };


Allerdings weiß ich nicht wie ich das händeln soll... Irgendwie muss es doch möglich sein was zu coden, damit er für jede 1 ein "=" und für jede 0 nichts zeichnet? Mir fehlt dafür irgendwie die richtige Lösung und ich komme einfach nicht drauf. Ich wollte zunächst ein 2 dimensionales Array erstellen aber damit komme ich noch weniger weiter.

Ich bitte um freundliche Unterstüzung =)

Lg
Sc4v

//edit
Ich glaube sogar, dass ich prinzipiell total falsch an die Sache herangehe. Ich weiß noch nicht wie ich später die Schlange bewegen lassen soll aber das ist derzeit egal :P

denjo

Treue Seele

Beiträge: 163

Wohnort: BLB

  • Private Nachricht senden

2

28.08.2010, 21:08

Hi Sc4v,

du hast ja in deinem Codeausschnitt bereits beschrieben (Array), dass es ein 20*30 Spielfeld seien soll (nicht 30*20 wie im Kommentar). D.h. ja nichts anderes als, dass es 20 Zeilen hat mit je 30 Spalten. Deshalb ist es gar nicht verkehrt, aus dem Spielfeld field[] ein Zweidimensionales Array zu machen:

C-/C++-Quelltext

1
2
3
int field[20][30];

// Feld füllen


Wie du dein Feld jetzt füllst, ist dir überlassen. Das könnte ja z.B. aus einer Textdatei oder ähnlichem stammen, so dass du verschiedene Level in dein Spielfeldarray laden kannst.

Wenn du dein Spielfeld nun auf dem Bildschirm (Konsole) ausgeben willst, brauchst du das Array einfach nur zu durchlaufen und zu entscheiden, wenn eine "1" im Feld steht, ein "=" auszugeben oder bei einer "0" eben die "0".

Die Iteration durch das "Spielfeld" könnte wie folgt aussehen:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
// Zeilen durchlaufen (20)
for( int i = 0; i < 20; i++ ) {
    // Spalten pro Zeile durchlaufen (30)
    for( int j = 0; j < 30; j++ ) {
        // Bei gesetzter "1" => "=" zeichnen
        if( field[ i ][ j ] == 1 )
            std::cout << "=";
        else
            std::cout << "0";
    }
    // Spielfeldzeile beenden
    std::endl;
}


Hoffe, dass es alles verständlich war und ich dir weiterhelfen konnte.
"Irren ist menschlich, Vergeben göttlich."
- Alexander Pope -

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

3

28.08.2010, 21:10

schreibst du das snake in der konsole? für so ein spiel wär die sfml schon angebracht und einfacher.
dann erstellst du für jedes feld ein rect(mit sf::Shape) und gibst ihm die entsprechende farbe.

du solltest ein zweidimensionales array nehmen weil das einfach logischer aufgebaut ist. wenn du allerdings schon beim zeichnen solche probleme hast wär vllt pong oder ein 2d shooter mit zielschreiben für die maus ein besseres übungsprojekt. vorallem das bewegen der schlange ist viel schwerer als das zeichnen...
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

Sc4v

Alter Hase

  • »Sc4v« ist der Autor dieses Themas

Beiträge: 376

Beruf: Student

  • Private Nachricht senden

4

28.08.2010, 21:19

ja du wirst recht haben... ein snake für die Konsole könnte schwer werden ich gucke mal wie weit ich komme und dann entscheide ich.

Ok das mit dem 2 dimensionalem Array leuchtet wirklich ein aber ich weiß nicht wie ich das Feld genau füllen soll, sodass ich einsen und nullen an gewünschte Positionen schreiben kann. Ich teste das nacher mal mit einer If-Abfrage... wenns Probleme gibt melde ich mich nochmal

danke schonmal

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

5

28.08.2010, 21:26

bei einem einfachen rand kannst du das auch per schleife füllen.
da musst du alle vier ränder durchlaufen und sie auf 1 stellen.
beispiel für die letzte spalte(ganz rechts):

C-/C++-Quelltext

1
2
for(int i = 0; i < hoehe; ++i)
field[breite-1][i] = 1;

achja vergess nicht das array zu initialisieren^^
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

Sc4v

Alter Hase

  • »Sc4v« ist der Autor dieses Themas

Beiträge: 376

Beruf: Student

  • Private Nachricht senden

6

29.08.2010, 15:36

Hey,

Habs jetzt so gelöst:

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
void CField::initField()
{
    for(int y=0; y<mHoehe; y++)
    {
        for(int x=0;x<mBreite;x++)
        {
            if(y == 0 || y == (mHoehe-1) || x == 0 || x == (mBreite - 1))
                mField[x][y] = 1;
            else
                mField[x][y] = 0;   
        }
    }

}

void CField::renderField()
{
    for(int y=0; y<mHoehe; y++)
    {
        for(int x=0;x<mBreite;x++)
        {
            if(mField[x][y] == 1)
                std::cout << "=";
            else if(mField[x][y] == 0)
                std::cout << " ";
        }
        std::cout << "\n";
    }

}


Würde mal gerne wissen ob das eine gute Lösung ist (ich weiß noch besser wäre es das Feld extern zu lesen aber das ist mir atm zuviel) oder ob ich total schrecklichen Code geschrieben habe :D
Funktionieren tuts einwandfrei

lg

idontknow

unregistriert

7

29.08.2010, 15:45

schreibst du das snake in der konsole? für so ein spiel wär die sfml schon angebracht und einfacher.
dann erstellst du für jedes feld ein rect(mit sf::Shape) und gibst ihm die entsprechende farbe.

Warum soll SFML einfacher sein als die Konsole?

@Topic: Wenns funktioniert isses doch wunderbar..

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

8

29.08.2010, 16:08

weil man in der konsole nicht einfach über ein leeres feld zeichnen kann. man muss alles in einem ruck zeichnen. das kann ziemlich aufwendig sein. dagegen ist es ein klacks sich die sfml anzusehen und nen shape zu zeichnen. ausserdem sieht es einfach besser aus.
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

Architekt

Community-Fossil

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

9

29.08.2010, 17:07

weil man in der konsole nicht einfach über ein leeres feld zeichnen kann. man muss alles in einem ruck zeichnen. das kann ziemlich aufwendig sein. dagegen ist es ein klacks sich die sfml anzusehen und nen shape zu zeichnen. ausserdem sieht es einfach besser aus.

2D Programmierung via SFML vs. Konsole. Da gewinnt, was Anfänger-freundlichkeit und Einfachheit angeht, auf jeden Fall die Konsole.
Das ein Snake Klon nicht unbedingt geeignet für die Konsole ist, da stimme ich dir zu, aber um mit der jeweiligen Sprache (in diesem Fall wohl C++) umzugehen zu lernen sollten wirklich zunächst einmal Konsolen Basics gesammelt werden. Danach kann man dann in die Fenster und 2D Welt eintauchen. Und bei diesem Schritt empfehle ich, wie immer, Python mit Pygame, ist für Anfänger einfach Einfacher ;) (woher kommt dieser Slogan noch?). Aber das bleibt ja jedem selbst überlassen.

@Topic: Versuch doch erst einmal in der Konsole ein simples "Schiffe versenken" und nach jeder Koordinaten Eingabe wird das ganze neu in der Konsole gezeichnet, dann hast du die Komplexität des Wurm Zeichnen nicht.
Falls du das Bsp. nimmst und Hilfe brauchst stehe ich dir gerne zur Verfügung.
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

idontknow

unregistriert

10

29.08.2010, 17:38

Man muss nicht alles in einem Ruck zeichnen und dass man nicht übereinander zeichnen kann ist jetzt wohl bei einem Snake Klon nicht unbedingt das Problem oO

Werbeanzeige