Fehlerhaftes Snake! hoffentlich nicht mehr lange ;-)



  • Hallo!
    Ich bin schon so weit, dass ich bei einem ganz einfachen Snake, die Schlange bewegen kann, und sie auch das mach, was sie machen soll. Nur habe ich jetzt noch genau 2 Probleme:

    1. Wie kann ich das Spiel beenden,
    wenn man sich selber frisst oder sie an den Rand stößt?
    2. Brauche ich bitte kleine Tipps, wegen dem "Futter".
    3. Kann ich einfach, wenn sie nach links läuft, wieder nach rechts lenken.
    Am besten ihr probiert es!

    Ich danke euch sehr im Voraus!
    Ich weiß, dass ich hier jetzt viel verlange, aber ich möchte es auch kapieren, wies wirklich geht!
    Wenn jemand so freundlich ist, und mir hilft 😃 , dann soll es bitte nur so unkompliziert als möglich sein!
    Ich sag es immer wieder, aber Danke im Voraus!
    Hier ist das, was ich bis jetzt habe:

    #include <iostream.h>
    #include <conio.h>
    #include <stdio.h>
    #include <iomanip.h>
    #include <dos.h>
    #include <stdlib.h>
    #include <time.h>
    #include <string.h>
    #include <vcl.h>
    #pragma hdrstop
    #pragma argsused
    
    //------------------------- Variblendeklaration -------------------------------
    void snake_show(void);
    void DrawFrame(int x1,int y1,int x2,int y2,int line);
    struct snake_pos
    {
        int x_pos;
        int y_pos;
        char sign;
    };
    
    int dx=1, dy=0, x=30, y=10;
    void snake_move(int xdir, int ydir, snake_pos snake2[]);
    snake_pos snake1[]={{x,y,'\x20'},
                        {x+1,y,'\xB1'},
                        {x+2,y,'\xB1'},
                        {x+3,y,'\xB1'},
                        {x+4,y,'\xB1'},
                        {x+5,y,'\xDB'}};
    
    //-------------------------- Unterprogramme ----------------------------------
    void DrawFrame(int x1,int y1,int x2,int y2, int line)
    {
       int temp;
       if (x1>x2)
       {
          temp=x1;
          x1=x2;
          x2=temp;
       }
       if (y1>y2)
       {
          temp=y1;
          y1=y2;
          y2=temp;
       }
    
       if (line==2)
       {
          gotoxy(x1,y1);
          cout<<'\xC9'<<setw(x2-x1)<<setfill('\xCD')<<'\xBB';
          gotoxy(x1,y2);
          cout<<'\xC8'<<setw(x2-x1)<<setfill('\xCD')<<'\xBC';
          for (int i=y1+1;i<=y2-1;i++)
          {
             gotoxy(x1,i);
             cout<<'\xBA';
             gotoxy(x2,i);
             cout<<'\xBA';
          }
       }
    }
    
    void snake_show(void)
    {
        for(int i=0; i<6;i++)
        {
            gotoxy(snake1[i].x_pos,snake1[i].y_pos);
            cout<<snake1[i].sign;
        }
    
    }
    
    void snake_move(int xdir, int ydir, snake_pos snake2[])
    {
        snake2[5].x_pos+=xdir;
        snake2[5].y_pos+=ydir;
        for(int i=0; i<5; i++)
        {
            snake2[i].x_pos=snake2[i+1].x_pos;
            snake2[i].y_pos=snake2[i+1].y_pos;
        }
    }
    
    //---------------------------------------------------------------------------
    
    int main(int argc, char* argv[])
    {
        clrscr();
        _setcursortype(_NOCURSOR);
        DrawFrame(1,1,80,23,2);
    
        do
        {
            for(int k=0; k<2; k++)
            {
                k--;
                Sleep(200);
                if(kbhit())
                {
                    switch(getch())
                    {
                        case 77:  dx=1;  dy=0;   break ;
                        case 75:  dx=-1; dy=0;   break ;
                        case 72:  dx=0;  dy=-1;  break ;
                        case 80:  dx=0;  dy=1;   break ;
                    }
                }
    
                gotoxy(1,25);
                snake_move(dx,dy,snake1);     snake_show();
            }
        }
        while(getch()!='q');
        return 0;
    }
    //---------------------------------------------------------------------------
    


  • Hallo

    Zuerst solltest du mal deine Header aktualisieren und dir dann überlegen, was es für Abbruchbedingungen gibt und diese beipielsweise in einer while Schleife abfragen.

    chrische



  • chrische5 schrieb:

    Hallo

    Zuerst solltest du mal deine Header aktualisieren und dir dann überlegen, was es für Abbruchbedingungen gibt und diese beipielsweise in einer while Schleife abfragen.

    chrische

    Ich weiß jetzt nicht ganz, was du meinst.



  • Na Du fragst doch auf getch()!='q' ab, da könntest du doch die anderen abbruchbedingungen gut unterbringen.



  • Hallo

    Deine inkludierten Header sind nicht aktuell. (z. Bsp.: wurde aus iostream.h 1998 iostream ohne .h)

    chrische



  • Martin__S schrieb:

    Na Du fragst doch auf getch()!='q' ab, da könntest du doch die anderen abbruchbedingungen gut unterbringen.

    Ich weiß aber nicht ganz, wie?
    Soll ich das mit if machen?
    Bitte zeige mir ein bisschen was.



  • Hallo

    Du kannst doch mehrere Bedingungen per && oder || verknüpfen.

    chrische



  • chrische5 schrieb:

    Hallo

    Du kannst doch mehrere Bedingungen per && oder || verknüpfen.

    chrische

    Ich weiß aber nicht, wo ich das wie einbauen soll...
    Ich weiß, ich bin doof 😉



  • Könnte mir vielleicht irgendwie weiterhelfen 😕 👍 😞
    Danke. 🤡



  • Am geilsten sind in deinem Code sachen wie:

    if(dx==1 && dy==0);
    if(dx==-1 && dy==0);
    if(dx==0 && dy==1);
    if(dx==0 && dy==-1);
    

    Denn die kannst du auch einfach rauslassen .. so wie die da stehen machen die nix. Du schließt mit dem Simikolon das bedingte Ausführen ab.



  • (D)Evil schrieb:

    Am geilsten sind in deinem Code sachen wie:

    if(dx==1 && dy==0);
    if(dx==-1 && dy==0);
    if(dx==0 && dy==1);
    if(dx==0 && dy==-1);
    

    Denn die kannst du auch einfach rauslassen .. so wie die da stehen machen die nix. Du schließt mit dem Simikolon das bedingte Ausführen ab.

    Danke, habe es bereits aktualisiert!

    Ich bräuchte noch diese Sachen:
    1. Wie kann ich das Spiel beenden,
    wenn man sich selber frisst oder sie an den Rand stößt?
    2. Brauche ich bitte kleine Tipps, wegen dem "Futter".
    3. Kann ich einfach, wenn sie nach links läuft, wieder nach rechts lenken.
    Am besten ihr probiert es!

    ich hoffe auf eine gute Antwort, die auch ich verstehe 😉
    Danke



  • Du mußt dir ansehen, was auf dem neuen Kopffeld eingetragen ist (am besten stellst du dein Spielfeld als 2D char-Array dar). Wenn dort ein Stück der Schlange oder eine Wand steht, knallt's, wenn dort etwas zu Essen ist, wird die Schlange entsprechend verlängert und ein neues Stück Futter zufällig ausgelegt.

    (@3: Mit dieser Kollisionserkennung kannst du auch eine 180-Grad Wende abfangen)



  • Hallo

    Friedfischer schrieb:

    chrische5 schrieb:

    Hallo

    Du kannst doch mehrere Bedingungen per && oder || verknüpfen.

    chrische

    Ich weiß aber nicht, wo ich das wie einbauen soll...
    Ich weiß, ich bin doof 😉

    Du musst dir überlegen, was alles dazu führt, dass das Programm beendet wird und diese Dinge musst du in der while Schleife überprüfen.

    chrische



  • Habs im Mom. soweit:

    Jetzt bräuchte ich noch folgendes:

    1. Wie kann ich das Spiel beenden, wenn man sich selber frisst?
    2. Brauche ich bitte kleine Tipps, wegen dem "Futter".
    3. Kann ich einfach, wenn sie nach links läuft, wieder nach rechts lenken.

    Müsste es bis Mittwoch schaffen.
    Bitte helft mir so, dass auch ich es schaffe 😉

    SEITE 3
    


  • hmm so ... also deine Header stimmen alle nicht. Und du solltest dir überlegen, ob du wirklich Sleep nutzen willst, oder dir da nicht was eigenes schreiben willst, denn alleine diese Funktion braucht den Header windows.h. Desweiteren scheinst du eine ImprovedConsole zu verwenden. Standard C++ kennt gotoxy usw nicht.

    std::cout anstelle von cout ... usw ..

    aja die korrekten Header heißen:

    #include <iostream>
    #include <windows.h> // NUR FÜR Sleep(); ... nicht sinnvoll!
    #include <conio.h> // Darin ist gotoxy nicht enthalten! Scheinst conioex.h zu nutzen.
    

    ...



  • (D)Evil schrieb:

    hmm so ... also deine Header stimmen alle nicht. Und du solltest dir überlegen, ob du wirklich Sleep nutzen willst, oder dir da nicht was eigenes schreiben willst, denn alleine diese Funktion braucht den Header windows.h. Desweiteren scheinst du eine ImprovedConsole zu verwenden. Standard C++ kennt gotoxy usw nicht.

    std::cout anstelle von cout ... usw ..

    aja die korrekten Header heißen:

    #include <iostream>
    #include <windows.h> // NUR FÜR Sleep(); ... nicht sinnvoll!
    #include <conio.h> // Darin ist gotoxy nicht enthalten! Scheinst conioex.h zu nutzen.
    

    ...

    Danke erstmal.

    Wir haben von unserem Lehrer eine Vorlage bekommen, in dem diese vorkommen:

    #include <iostream.h>
    #include <conio.h>
    #include <stdio.h>
    #include <iomanip.h>
    #include <dos.h>
    #include <stdlib.h>
    #include <time.h>
    #include <string.h>
    #include <vcl.h>
    #include <ctime.h>
    #pragma hdrstop
    #pragma argsused
    

    Er sagte, dass wir das immer so nehmen sollen, da bei dieser Vorlage anscheinend nichts wichtiges fehlt.

    Das mit dem std: lernen wir erst, das kapier ich noch überhaupt nicht...

    Aber das ist Nebensächlich. bräuchte bitte diese Hilfen:

    1. Wie kann ich das Spiel beenden, wenn man sich selber frisst?
    2. Brauche ich bitte kleine Tipps, wegen dem "Futter".
    3. Kann ich einfach, wenn sie nach links läuft, wieder nach rechts lenken.



  • Nein das ist nicht nebensächlich. Das eine ist korrekt und deins ist so nicht Standard konform bzw falsch.

    Und wäre schon ganz gut das du uns sagst woher du die Punktion gotoxy nimmst usw. damit wir wissen was wir brauchen um es zu testen.



  • (D)Evil schrieb:

    Nein das ist nicht nebensächlich. Das eine ist korrekt und deins ist so nicht Standard konform bzw falsch.

    Und wäre schon ganz gut das du uns sagst woher du die Punktion gotoxy nimmst usw. damit wir wissen was wir brauchen um es zu testen.

    Wie meinst du das jetzt genau? 😕 😕 😕



  • Ich habe jetzt alles getestet, welche include - Dateien ich nicht brauche.
    Ich hoffe, ich habe das richtig gemacht!

    Übrig bleiben würden nur diese:

    #include <conio.h>
    #include <iomanip.h>
    

    Ich hoffe, dass ihr das braucht?

    Vielleicht braucht ihr auch folgende Angaben:

    Ich programmiere in Borland 5 mit der Konsole.

    Ich freue mich auf Antworten !



  • Darum ging es nicht. Es ging darum, dass iostream**.h** veraltet ist und nicht mehr genutzt werden soll. Da heiszt jetzt einfach nur noch iostream, also #include<iostream> (ohne .h) gleiches gilt für string, time (wird ctime glaub ich) und ctime (wird cctime, bin mir aber nicht sicher)



  • <ctime.h> ist kompletter Müll, es gibt nur <time.h> (C-Version) und <ctime> (C++-Version). Zu den übrigen Headern: <iostream> wurde ja schon erwähnt, das selbe gilt für <iomanip>, <cstdlib> und <cstring> (OK, von den C-Headern könntest du beide Varianten nehmen, aber die C-Version ist bei C++-Programmierern (hmm) unbeliebt).

    Zu deinen Fragen:
    Stell dein Spielfeld intern als zweidimensionales char-Array dar und die Schlange als std::list<std::pair<int,int> > - bei jedem Schritt prüfst du nach, was vor dem aktuellen Kopffeld (in der gerade gültigen Richtung) für ein Wert steht, bei '#' (Schlange), '|' '-' (Wand) bringst du die Game-Over-Meldung (@Frage 1), bei '*' (Futter) setzt du ein neues Stück Futter für die Schlange, erhöhst den Punktestand und lässt sie etwas wachsen (@Frage2). Nach der Überprüfung hängst du die Koordinanten des kontrollierten Feldes ans Kopfende (push_front()) an, kürzt eventuell die Schlange am Schwanz ( if(snake.size()>length)snake.pop_back(); ) und zeichnest dein Spielfeld neu.

    (@Frage3: Bei einer 180°-Drehung ist "vor" dem Kopf das erste Halsfeld. Ohne Sonderbehandlung wird die Kollisionsabfrage (s.o.)zuschlagen und die Schlange stirbt)

    Und bevor du nochmal die selben Fragen stellst, lies dir diesen Beitrag bitte durch und versuch ihn zu verstehen. Andernfalls...


Anmelden zum Antworten