Problem mit der Kollisions Prüfung



  • Hallo zusammen ^^, ähhm ganz eigenartig, wenn ihr das Programm selber mal kompiliert bemerkt ihr dass das geschoss nicht das macht was es eigendlich tun sollte.

    ich glaube das bei der Zuweißung etwas schief geht daher das geschoss stehen bleibt wenn auch in dem Feld nichts ist. vielleicht könnt ihr mir helfen, die kollision prüfung des Spielers wird nochmal überarbeitet, und ich muss an dem Gegner rumprogrammieren das er noch was macht, und die level Gestaltung - was ich damit sagen will es is eigendlich noch nichts fertig aber solang mein geschoss nicht richtig funktioniert und ich auch keine ahnung habe warum will ich auch nicht weiter arbeiten. (Das geschossscript ist in den Routen drinnen) ^^

    DANKE FÜR DIE HILFE

    #include <iostream> 
    #include <windows.h> 
    #include <conio.h> 
    
    const int MAX_X=40; //Spielfeld Größe
    const int MAX_Y=15;
    
    void spielfeld(int spielerx, int spielery); // Deklaration der Funktionen
    int eingabe();
    void gotoxy(int x, int y);
    
    int main()
    {
        int i, x, y;
        int ausis = 0;
    
        spielfeld(20,8); /aufruf der Funktion, Spieler positionen
    
        return 0;
    }
    
    void spielfeld(int spielerx, int spielery)
    {
        int i, k;
        int spieleraltx, spieleralty;
        int eingabe1;
    
        int geschoss, richtung, abgefeuert;
        int geschossy, geschossx;
        int geschossalty, geschossaltx;
    
        int gegnerhit, movep;
    
        richtung = 1; //Werte zuweißen, daher sonst Fehler entsteht
        geschoss = 0;
    
        char spielfeld1[MAX_X][MAX_Y]; // Spielfeld Array deklarieren
    
        bool zuviel=true; // endlosschleife
    
        for(i=0;i<MAX_Y; i++)
        {
            for(k=0;k<MAX_X; k++)
            {
                if ( i == 0 || k == 0 || i == 15 - 1 || k == 40 - 1)
                    {spielfeld1[i][k] = 'X';}
                else
                    {spielfeld1[i][k] = ' ';}
                std::cout << spielfeld1[i][k];
            }
          std::cout << std::endl;
        } // Spielfeld deklaration
        gotoxy(spielerx, spielery); //Spieler auf das Spielfeld positionieren
        spielfeld1[spielery][spielerx] = 'S';
        std::cout << spielfeld1[spielery][spielerx] << std::endl;
    
        gotoxy(10, 5); //Gegner1
        spielfeld1[spielery][spielerx] = 'G';
        std::cout << spielfeld1[spielery][spielerx] << std::endl;
    
            gotoxy(20, 5); //Gegner2
        spielfeld1[spielery][spielerx] = 'G';
        std::cout << spielfeld1[spielery][spielerx] << std::endl;
    
            gotoxy(30, 5); //Gegner3
        spielfeld1[spielery][spielerx] = 'G';
        std::cout << spielfeld1[spielery][spielerx] << std::endl;
    
        do{ //beginn der endlos schleife
    
        eingabe1 = eingabe(); //eingabe des spielers in eingabe1 speichern
        if (eingabe1 == 1) // Spielereingabe überprüfen (Nur die bewegungen, kein Feuer)
        {
            i = spielery;
            spieleraltx = spielerx;
            if (i<14) //Alte kollisions abfrage das spieler nicht ausserhalb der Spielfeld begrenzung ist
            {
                 spielery++;
                 spieleralty = i;
                 if(geschoss==0){richtung = 1;} // Wenn ein Geschoss existiert, darf die richtung nicht mehr verändert werden
                 movep = 1; // Spielerbewegt sich 1
            }
        }
        else if (eingabe1 == 2)
        {
             i = spielery;
             spieleraltx = spielerx;
             if(i>2)
             {
                 spielery--;
                 spieleralty = i;
                 if(geschoss==0){richtung = 2;}
                 movep = 1;
             }
    
        }
        else if (eingabe1 == 3)
        {
             i = spielerx;
             spieleralty = spielery;
             if(i<39)
             {
                 spielerx++;
                 spieleraltx = i;
                 if(geschoss==0){richtung = 3;}
                 movep = 1;
             }
        }
        else if (eingabe1 == 4)
        {
             i = spielerx;
             spieleralty = spielery;
             if(i>2)
             {
                 spielerx--;
                 spieleraltx = i;
                 if(geschoss==0){richtung = 4;}
                 movep = 1;
             }
    
        }
    
        if(movep==1)//wenn sich spieler bewegt hat
        {
            gotoxy(spielerx, spielery); //konsolenpointer setzen auf neue Position
            spielfeld1[spielery][spielerx] = 'S'; // Felddeklariern
            std::cout << spielfeld1[spielery][spielerx] << std::endl; //schreiben
            spielfeld1[spieleralty][spieleraltx] = ' '; // Altes Feld deklarieren
            gotoxy(spieleraltx, spieleralty); //konsolenpointer setzen auf alte Pos.
            std::cout << spielfeld1[spieleralty][spieleraltx] << std::endl; //schreiben
            movep = 0; // bewegung abgeschlossen
        }
        if(eingabe1 < 5)//totaler müll setzt nur die eingabe auf 0 zurück wenn diese kleiner wie 5 ist
        {eingabe1 = 0;}
    
        Sleep(10); // Programm wird verlangsamt damit man Geschoss verfolgen und sehen kann
        //######################################################################
        //######################################################################
        //######################################################################
        //######################################################################
        //######################################################################
    
        if(eingabe1 == 6) //wenn die Eingabe6 war dann
        {
            if(geschoss != 1)//wenn ein geschoss schon nicht existiert dann
            {
                if (richtung == 1) // richtung des Spielers abfragen
                {
                geschossy = spielery; // Geschosspos. von spieler übernehmen
                geschossx = spielerx;
                geschossy++; // Geschosspos. jenach Richtung ändern
                }
    
                else if (richtung == 2)
                {
                geschossy = spielery;
                geschossx = spielerx;
                geschossy--;
                }
    
                else if (richtung == 3)
                {
                geschossy = spielery;
                geschossx = spielerx;
                geschossx++;
                }
                else if (richtung == 4)
                {
                geschossy = spielery;
                geschossx = spielerx;
                geschossx--;
                }
    
                if (spielfeld1[geschossy][geschossx] == ' ') // Nur wenn der spieler in ein freies Feld feuert wird geschoss erzeugt.
                    {geschoss=1; abgefeuert=1;}
                else{geschoss=0;abgefeuert=0;}
    
            }
        }
        if (geschoss==1) // wenn ein geshcoss existiert
        {
            if(abgefeuert == 1) // Wenn das geschoss abgefeuert wurde(vor dem spieler ist)
            {            
                spielfeld1[geschossy][geschossx] = '0';
                gotoxy(geschossx, geschossy); // erzeugt geschoss, setzt abgefeurt zurück
                std::cout << spielfeld1[geschossy][geschossx] << std::endl;
                abgefeuert=0;
            }
            else if (abgefeuert == 0) // wenn ein geschoss schon unterwegs ist.
            {
                geschossalty = geschossy;//geschossalt übernimmt aktuelle Pos.
                geschossaltx = geschossx;
    
                if(richtung == 1)// Pos. wird verändernt jenach Richtung
                {
                    geschossy++;
                }
                else if(richtung == 2)    
                {
                    geschossy--;
                }
                else if(richtung == 3)    
                {
                    geschossx++;
                }
                else if(richtung == 4)    
                {
                    geschossx--;
                }
                if(spielfeld1[geschossy][geschossx] == 'X') // Kollisions Prüfung
                    {// wenn in dem nächsten Feld ein X ist wird alte Pos gelöscht (mit ' ' ersetzt)
                        spielfeld1[geschossalty][geschossaltx] = ' ';
                        gotoxy(geschossaltx, geschossalty);
                        std::cout << spielfeld1[geschossalty][geschossaltx] << std::endl;
                        geschoss = 0; //Geschoss wird zurückgesetzt
                    }
                else if (spielfeld1[geschossy][geschossx] == 'G')
                { // wenn das nächste Feld einen (G)egner enthält wird Gegner gelöscht und alte Position
                    spielfeld1[geschossy][geschossx] = ' ';
                    gotoxy(geschossx, geschossy);d
                    std::cout << spielfeld1[geschossy][geschossx] << std::endl;
                    spielfeld1[geschossalty][geschossaltx] = ' ';
                    gotoxy(geschossaltx, geschossalty);
                    std::cout << spielfeld1[geschossalty][geschossaltx] << std::endl;
                    geschoss = 0; // Geschoss wird gelöscht zurückgesetzt
                    gegnerhit = 1; // Gegnertreffer wird gezählt
                }
                else if (spielfeld1[geschossy][geschossx] == ' ')
                { // Wenn das Feld LEER ist wird das Geschoss eins weiter gesetzt und alte Pos wird geschlöscht (' ')
                    spielfeld1[geschossy][geschossx] = '0';
                    gotoxy(geschossx, geschossy);
                    std::cout << spielfeld1[geschossy][geschossx] << std::endl;
                    spielfeld1[geschossalty][geschossaltx] = ' ';
                    gotoxy(geschossaltx, geschossalty);
                    std::cout << spielfeld1[geschossalty][geschossaltx] << std::endl;
                    geschoss = 1; // Geschoss existiert weiter
                }
            }
        }
    
        //######################################################################
        //######################################################################
        //######################################################################
        //######################################################################
    
        //Sleep(0);
    
        }while (zuviel=true); // Endlosschleife
    
        std::cin >> i;// ergibtkeinen sinn
    
    }
    
    int eingabe()
    {
        char eingabe;
        if(kbhit()){
        eingabe = getch();
    
            switch (eingabe)
            {
                case 'S':
                case 's':
                    return 1;
                    break;
                case 'W':
                case 'w':
                    return 2;
                    break;
                case 'D':
                case 'd':
                    return 3;
                    break;
                case 'A':
                case 'a':
                    return 4;
                    break;
                case 'E':
                case 'e':
                    return 5;
                    break;
                case ' ':
                    return 6;
                    break;
            }
    }return 0;
    
    }
    
    void gotoxy(int x, int y)
    {
    HANDLE hCon = GetStdHandle(STD_OUTPUT_HANDLE);
    COORD pos;
    pos.X=x-1;
    pos.Y=y-1;
    SetConsoleCursorPosition(hCon, pos);
    }
    


  • //bitte löschen
    ausversehen entstanden
    danke



  • kann es sein das du manche blöcke aus meinem programm verwendest???
    die darstellung des spielfeldest und die "bewegun" ähneln sich sehr stark sogar in der form

    meins aus meinem snake programm (welches ich gekalut haben soll!!!):

    spielfeld[Alt_y][Alt_x]= ' ';
    spielfeld[beweg_y][beweg_x]= '\x01';
    gotoxy(beweg_x,beweg_y);
    cout<<spielfeld[beweg_y][beweg_x];
    gotoxy(Alt_x,Alt_y); //Löscht altes feld
    cout<<spielfeld[Alt_y][Alt_x];

    und deins hat:

    gotoxy(spielerx, spielery); //konsolenpointer setzen auf neue Position
    spielfeld1[spielery][spielerx] = 'S'; // Felddeklariern
    std::cout << spielfeld1[spielery][spielerx] << std::endl; //schreiben
    spielfeld1[spieleralty][spieleraltx] = ' '; // Altes Feld deklarieren
    gotoxy(spieleraltx, spieleralty); //konsolenpointer setzen auf alte Pos.
    std::cout << spielfeld1[spieleralty][spieleraltx] << std::endl;

    hat eine starke ähnlich keit mit meinem auser das du erst darstelst und dann löscht sonst hat das schon starke ähnlich keiten sogar spielfeld wurde fast 100% übrnommen 😃
    das micht mir eig nix aus fühl mich erher noch geehrt wenn man cod stücke die poste verwenet

    ok jetzt zu deiner frage die ich nicht verstehe was soll dein programm machen
    zudem kannst eig das std: wenn man es so oft verwendet durch einen nammensraum am anfang sparen 😉
    deine int in der main sind nutzlos also löschen oder auskommentieren wenn du sie später verwenden möchtest
    dann hast du am anfang ein prob mit einem \ da gehört noch eins rein das es ein kommentar wird und ein d ist nach einem ;



  • Fehler hab ich schon längst gefunden, Array is falsch dimensioniert.

    Ich hab mir die Funktion geklaut aber mittlerweile läuft das Programm auch anders...



  • This is a automatic generated message from c&&p Detector V.1.04

    System has detected scriptkiddie at adress [germany 186.234.120.96 - \"qriz\"] The following event has occured: 006: copy'n paste event.



  • was soll das programm machen wenn du auf ein feld mit einem G kommst???
    bin zufaul um dein programm ansatz durchzulessen



  • Copy&&paste Detec schrieb:

    This is a automatic generated message from c&&p Detector V.1.04

    System has detected scriptkiddie at adress [germany 186.234.120.96 - \"qriz\"] The following event has occured: 006: copy'n paste event.

    Ich mein ich find ja misstrauen im Internet gut, währe ich in eurer Position würd ich mir selber nicht trauen. ^^

    Scriptkiddie, jetzt im ernst ich bin 20 Jahre alt bin in einem Handwerklichen Beruf, den ich noch nie ausüben wollte und lerne Programmieren aus spaß und weil ich schon in der Hauptschule noch n00biger QBasic "programmiert" habe. Ich weiß das meine scripts kacke sind, ich weiß auch das euch niemand dazu zwingt meine "kacke" zuverbessern, anzuguggen, vorallem weil mein script wahrscheinlich unübersichtlich, scheisse strukturiert ist und weil es massig an Unterfunktionen fehlt und weil ich natürlich kein OOP benutze. Ich programmiere wahrscheinlich genau so kacke wie alle hier als sie ihre ersten scripts programmiert haben. Ich schäme mich nicht wenn ich eine Fremde Funktion für mein Programm benutze, denn diese eine Funktion ändert nichts daran das ich das Programm geschrieben habe. Ich finde es nur schade weil ich mir hier angemeldet habe in der Hoffung das ich mich verbessern kann, stattdessen werde ich nur wegen Sachen angeflamed. sorry das ich wie die meisten keinen FIAE gemacht hab oder Informatik studiere, und mich dadurch nicht im Detail mit dem Programmieren auskenne(und jeden C++ Befehl kenne, und jede Funktion). Wird wahrscheinlich auch mein letzter Post sein, dann bleibt wohl mein C++ Buch mein einziger Ratgeber nur blöd das der mir nicht antworten kann..

    bb qriz


Anmelden zum Antworten