Zum Inhalt springen

Spiel: Schiffe versenken


fr33g

Empfohlene Beiträge

Hey Leute, hab mir ein Spiel programmiert, nämlich Schiffe versenken, nach einigen Stunden Fehlersuche lief es endlich=) Jetzt habe ich noch eine Funtkion eingebaut damit das Spiel den Sieg meldet und sich beendet.

Jedoch funktioniert es einfach nicht und ich weiß nicht warum=(

Das Spiel macht einfach weiter.

Hoffe ihr könnt mir helfen:

main.cpp


#include "classBretter.h"


#include <iostream>

#include <iomanip>

#include <string>


using namespace std;


void anzahlZweierSchiffe(Bretter&, const int&, const int&, int&);

void anzahlDreierSchiffe(Bretter&, const int&, const int&, int&);

void anzahlViererSchiffe(Bretter&, const int&, const int&, int&);


const int size1 = 10;

const int size2 = 10;

const int size3 = 4;

bool stop = false;

int choiceGes;

int choiceGes1;

int choiceGes2;

int choiceGes3;


int main()

{

    srand((unsigned)time(NULL));

    cout << setw(60) << "Herzlich Willkommen bei Schiffeversenken\n";

    cout << "\n";

    cout << "\n";

    cout << setw(61) << "Ein '.' bedeutet noch nicht hingeschossen\n";

    cout << setw(56) << "Ein 'X' bedeutet das war nur Wasser\n";

    cout << setw(79) << "Ein 'S' bedeutet da ist ein Schiff, die Klammer sagt wie lang das Schiff ist\n";

    cout << "\n\n";


    Bretter Brett1(size1,size2,size3);

    anzahlZweierSchiffe(Brett1, size1, size2, choiceGes1);

    anzahlDreierSchiffe(Brett1, size1, size2, choiceGes2);

    anzahlViererSchiffe(Brett1, size1, size2, choiceGes3);

    Brett1.brettAusgeben(size1, size2);


    choiceGes = (choiceGes1 * 2) + (choiceGes2 * 3) + (choiceGes3 * 4);

    int x;

    int y;


    while(stop == false)

    {

        cout << "\n";

        cout << "Wo moechtest du hinschiessen: x= ";

        cin >> x;

        cout << "\n";

        cout << "Wo moechtest du hinschiessen: y= ";

        cin >> y;

        cout << "\n";


        Brett1.check(x,y);

        Brett1.brettAusgeben(size1, size2);

        if(Brett1.endGame(Brett1, choiceGes))

        {

            stop = true;

        } 

    }


    cout.width(47);

    cout << "Herzlichen Glückwunsch, sie haben das Spiel erfolgreich beendet!";

}

classBretter.h

#include <string>


#ifndef CLASSBRETTER_H_INCLUDED

#define CLASSBRETTER_H_INCLUDED


class Bretter

{

    public:

        Bretter(const int, const int, const int);

        ~Bretter(){};

        void brettAusgeben(const int&, const int&)const;

        void zweierSchiffeSetzen(Bretter&, const int, const int);

        void dreierSchiffeSetzen(Bretter&, const int, const int);

        void viererSchiffeSetzen(Bretter&, const int, const int);

        void check(int&, int&);

        bool endGame(Bretter&, int&);


    private:

        std::string Brett[10][10][4];

};



#endif // CLASSBRETTER_H_INCLUDED


classBretter.cpp

#include "classBretter.h"


#include <iostream>

#include <iomanip>

#include <string>


using namespace std;


Bretter::Bretter(const int size1, const int size2, const int size3)

{

    for (int i = 0; i < size1; i++)

    {

        for (int j = 0; j < size2; j++)

        {

            Brett[i][j][0] = ".    ";

        }

    }


    for (int i = 0; i < size1; i++)

    {

        for (int j = 0; j < size2; j++)

        {

            Brett[i][j][1] = "0";

        }

    }


    for (int i = 0; i < size1; i++)

    {

        for (int j = 0; j < size2; j++)

        {

            Brett[i][j][2] = "0";

        }

    }


    for (int i = 0; i < size1; i++)

    {

        for (int j = 0; j < size2; j++)

        {

            Brett[i][j][3] = "0";

        }

    }

}


void Bretter::brettAusgeben(const int& size1, const int& size2)const

{

    cout << setw(67) << "  0    1    2    3    4    5    6    7    8    9\n";


    for (int i = 0; i < size1; i++)

    {

        for (int j = 0; j < size2; j++)

        {

            if(j == 0)

            {

                cout << setw(19) << i << " ";

            }

            cout << Brett[i][j][0];

        }


    cout<<"\n";

    }

}


bool Bretter::endGame(Bretter& Brett1, int& choiceGes)

{

    int tempCheck = 0;


    for(int i = 0; i < 10; i++)

    {

        for(int j = 0; j < 10; j++)

        {

            if((Brett[i][j][3] == ("2") || ("3") || ("4")) && (Brett[i][j][0] == ("S(2) ") || ("S(3) ") || ("S(4) ")))

            {

                tempCheck += 1;

            }

        }

    }


    if(tempCheck == choiceGes)

    {

        return true;

    }

    else

    {

        return false;

    }


}


void Bretter::zweierSchiffeSetzen(Bretter& Brett1, const int size1, const int size2)

{

    unsigned int x = rand() % (size1 - 2 + 1);

    unsigned int y = rand() % size2;

    int tempx = x;

    int tempy = y;


    if ((Brett[tempy][tempx][2] == "0") && (Brett[tempy][tempx+1][2] == "0"))

    {

        for (int i = 0; i < 2; i++)

        {

            Brett[tempy][tempx][2] = "1";

            tempx++;

        }

        tempx = x;

        for (int i = 0;i < 2; i++)

        {

            Brett[tempy][tempx][3] = "2";

            tempx++;

        }

    }

    else

    {

        Brett1.zweierSchiffeSetzen(Brett1,size1,size2);

    }

}


void Bretter::dreierSchiffeSetzen(Bretter& Brett1, const int size1, const int size2)

{

    unsigned int x = rand() % size1;

    unsigned int y = rand() % (size2 - 3 + 1);

    int tempx = x;

    int tempy = y;

    if ((Brett[tempy][tempx][2] == "0") && (Brett[tempy+1][tempx][2] == "0") && (Brett[tempy+2][tempx][2] == "0"))

    {

        for (int i = 0; i < 3; i++)

        {

            Brett[tempy][tempx][2] = "1";

            tempy++;

        }

        tempy = y;

        for (int i = 0;i < 3; i++)

        {

            Brett[tempy][tempx][3] = "3";

            tempy++;

        }

    }

    else

    {

     Brett1.dreierSchiffeSetzen(Brett1,size1,size2);

    }

}



void Bretter::viererSchiffeSetzen(Bretter& Brett1, const int size1, const int size2)

{

    unsigned int x = rand() % size1;

    unsigned int y = rand() % (size2 - 4 + 1);

    int tempx = x;

    int tempy = y;


    if((Brett[tempy][tempx][2] == "0") && (Brett[tempy+1][tempx][2] == "0") && (Brett[tempy+2][tempx][2] == "0") && (Brett[tempy+3][tempx][2] == "0"))

    {

        for (int i = 0; i < 4; i++)

        {

            Brett[tempy][tempx][2] = "1";

            tempy++;

        }

        tempy = y;

        for (int i = 0;i < 4; i++)

        {

            Brett[tempy][tempx][3] = "4";

            tempy++;

        }

    }

    else

    {

        Brett1.viererSchiffeSetzen(Brett1,size1,size2);

    }

}


void Bretter::check(int& x, int& y)

{

    if(Brett[y][x][1] == "0")

    {

        if(Brett[y][x][2] == "1")

        {

            if(Brett[y][x][3] == "2")

            {

                cout << "Treffer\n";

                Brett[y][x][0] = "S(2) ";

                Brett[y][x][1] = "1";

            }

            if(Brett[y][x][3] == "3")

            {

                cout << "Treffer\n";

                Brett[y][x][0] = "S(3) ";

                Brett[y][x][1] = "1";

            }

            if(Brett[y][x][3] == "4")

            {

                cout << "Treffer\n";

                Brett[y][x][0] = "S(4) ";

                Brett[y][x][1] = "1";

            }

        }

        else

        {

            Brett[y][x][0] = "X    ";

            Brett[y][x][1] = "1";

            cout << "Leider nur Wasser\n";

        }

    }

    else

    {

        cout << "Dort hast du schonmal hingeschossen\n";

    }

}


funktionen.cpp

#include <iomanip>


using namespace std;


void anzahlZweierSchiffe(Bretter& Brett1, const int& size1, const int& size2, int& choiceGes1)

{

    marke:;

    cout << "Wie viel zweier Schiffe moechtest du(mindestens 1, maximal 3)";

    int choice;

    cin >> choice;

    choiceGes1 = choice;

    if ((choice < 4) && (choice > 0))

    {

        for(int i = 0; i < choice; i++)

        {

            Brett1.zweierSchiffeSetzen(Brett1, size1, size2);

        }

    }

    else

    {

        cout << "Falsche Eingabe!\n";

        goto marke;

    }

}


void anzahlDreierSchiffe(Bretter& Brett1, const int& size1, const int& size2, int& choiceGes2)

{

    marke:;

    cout << "Wie viel dreier Schiffe moechtest du(mindestens 1, maximal 3)";

    int choice;

    cin >> choice;

    choiceGes2 = choice;

    if ((choice < 4) && (choice > 0))

    {

        for(int i = 0; i < choice; i++)

        {

            Brett1.dreierSchiffeSetzen(Brett1, size1, size2);

        }

    }

    else

    {

        cout << "Falsche Eingabe!\n";

        goto marke;

    }

}


void anzahlViererSchiffe(Bretter& Brett1, const int& size1, const int& size2, int& choiceGes3)

{

    marke:;

    cout << "Wie viel vierer Schiffe moechtest du(maximal 3)";

    int choice;

    cin >> choice;

    cout << "\n\n";

    choiceGes3 = choice;

    if ((choice < 4) && (choice > 0))

    {

        for(int i = 0; i < choice; i++)

        {

            Brett1.viererSchiffeSetzen(Brett1, size1, size2);

        }

        cout << setw(58) << "Dann kann es ja losgehen!\n";

    }

    else if (choice == 0)

    {

        cout << setw(58) << "Dann kann es ja losgehen!\n";

    }

    else

    {

        cout << "Falsche Eingabe!\n";

        goto marke;

    }

}

Ich weiß is n langer Code, aber wär echt lieb wenn ihr mir trotzdem helfen könntet:)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ja würd ich gern wenn ich das mit dem debuggen checken wird aber der läuft bei ihr immer nur einfach komplett durch trotz den einstellungen für den debugger.

es kommt ja kein fehler, das programm läuft blos endlos. weil ich wohl in der funktion bool Bretter::endGame vermutlich einen Logikfehler hab.

denn sie soll true senden wenn der spieler alle schiffe getroffen hat und die while schleife aus dem main programm beenden.

den rest müsst ihr euch vermut ich mal eg auch nicht anschauen;-)

wär auf jeden fall cool wenn mir jemand helfen kann=)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ja würd ich gern wenn ich das mit dem debuggen checken wird aber der läuft bei ihr immer nur einfach komplett durch trotz den einstellungen für den debugger.
Hast du denn Haltepunkte gesetzt? Wie hast du den Debugger gestartet?

if((Brett[j][3] == ("2") || ("3") || ("4")) && (Brett[j][0] == ("S(2) ") || ("S(3) ") || ("S(4) ")))
Das funktioniert nicht. Wenn du mehrere Bedingungen verknüpfen willst, musst du sie alle komplett ausschreiben:

if((Brett[i][j][3] == ("2") || Brett[i][j][3] == ("3")
usw. Übrigens: Dir wurde schon vorher geraten, auf goto zu verzichten. Gewöhn dir das bitte schnellstens ab. Goto ist kein Ersatz für Schleifenkonstrukte! Und das hier
    if(tempCheck == choiceGes)
{
return true;
}
else
{
return false;
}[/code] ist eine unnötig ausschweifende Schreibweise für
[code]return tempCheck == choiceGes;

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ok Danke schön, werd ich ändern.

Zum Debuggen:

Also ich klick z.b. irgendwo in meinem quellcode hin und drück dann toogle breakpoint. vorne ist dann auch der rote punkt. so dann start ich den debugger in dem ich auf debug gehe und dann auf start. doch er ignoriert die haltepunkte völlig.

habs auch mit nem ganz kleinen programm versucht.


#include <iostream>


using namespace std;


int main()

{

    int a=66;

    int b=88;

    cout << a << b << endl;

    return 0;

}

Setzt ich jetzt in die zeile int b=88 ein haltepunkt, durchläuft er einfach alles=(

EDIT:

Danke hab den Quellcode geändert hat jetzt alles geklappt=)

Blos das Debuggen net vll kanst du mir ja sagen was ich falsche mache=(

Bearbeitet von fr33g
Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...