Schiffe versenken - Problem

Marimi

Mitglied
Hallo Leute,

ich muss Schiffe versenken Programmieren und hab ein kleines Problem an der Stelle wo es darum geht das Spieler2 Koordinaten ein gibt zum Angriff. Hier ist der ganze Code den ich bis jetzt habe.
C++:
 #include <iostream>
using namespace std;

const int A=9;
const int B=7;

int main()
{
char Spielfeld[A][B];
int a, b;
char ca, cb;


    for (a=0; a<A; a++)
    {
        for (b=0; b<B; b++)
        {
            Spielfeld[a][b] = '.';
        }
    }
    // Anzeige und Eingabe
    bool SchleifenEnde=false;
    int xin, yin;
    do
    {
        cout << "      1  2  3  4  5  6  7  8  9" << endl;
        for (b=0; b<B; b++)
        {
            cout << (char)('A'+b) << "   ";
            for (a=0; a<A; a++)
            {
                cout << "  " << Spielfeld[a][b];
            }
            cout << endl;
        }
        cout << "Spieler 1 -- Koordinaten setzen: (ZZ eingeben wenn die Schiffe platziert sind)" << endl;
        cin >> ca >> cb;
        xin = ca - '1';
        yin = cb - 'A';
        if (xin>=0 && xin<9 && yin>=0 && yin<7)
        {
            Spielfeld[xin][yin] = '1';
        }
        else
        {
             SchleifenEnde = true;
        }
    }
    while (!SchleifenEnde);




char cy, cx;


    cout << "Spieler 2 -- Welches Feld befeuern?:"  << endl;
    cin >> cy >> cx;
        xin = cy - '1';
        yin = cx - 'A';
        if (xin>=0 && xin<9 && yin>=0 && yin<7)
        {
          Spielfeld[xin][yin] = '2';
        }
        else;

}

Ich will die Koordinaten wieder in Indizes umrechnen und prüfen, ob an dieser Stelle eine 1 steht (Treffer) oder nicht (Wasser). Getroffene Punkte im Array sollen durch '2.' ersetzt werden. Das ganze in einer Schleife, bis sich keine 1 im Feld mehr findet. Versuchs seit gestern und bekomms ned hin. Kann mir bitte jemand helfen?

Lieben Gruß
Marimi
 
Wenn du in dem Spielfeld Array '2.' speichern willst, dann musst du die Dimension vergrößern.
C++:
char Spielfeld[A][B][2];

Dann halt an erster Stelle die 2 rein und an zweiter den Punkt.
 
So die angeschossene Position kann ich jetzt speichern:
C++:
char cy, cx;


    cout << "Spieler 2 -- Welches Feld befeuern?:"  << endl;
    cin >> cy >> cx;
        xin = cy - '1';
        yin = cx - 'A';
        if (xin>=0 && xin<9 && yin>=0 && yin<7)
        {
         Spielfeld[xin][yin] = '2';
        }
        else;
        cout << "      1  2  3  4  5  6  7  8  9" << endl;
        for (b=0; b<B; b++)
        {
            cout << (char)('A'+b) << "   ";
            for (a=0; a<A; a++)
            {
                cout << "  " << Spielfeld[a][b];
            }
            cout << endl;

Jetzt kommt nur noch der Part mit Treffer, Versenkt und so. Ich wollte das so machen, dass ich eine for Schleife mit integrierter if Abfrage mache die alle Zeilen durch geht und prüfen lasse ob auf den Nachbarfeld noch wo eine 1 steht, wenn ja soll er "Treffer" ausgeben und sonst "Versenkt" naja und wenn da nur son '.' und irgendwie muss sich das Wasser noch einbauen ^^'

Leider arbeite ich das erste Mal mit mehrdimensionalen Arrays und weiß nicht recht wie ich da arbeiten muss. Bei meinem Versuch gabs so eine ISO Fehler meldung: ISo forbidds comparison between pointer und integer.

Kann mir bitte wer helfen?
Danke im Vorraus, lieben Gruß
Marimi
 
Kann es sein, dass bei deinem Code etwas fehlt? Die Abfrage kann ich jetzt nicht erkennen.

Aber nach dem was du schreibst, scheinst du ja eine Zahl mit einer Adresse vergleichen zu wollen das geht natürlich nicht. Bei einem solchen Vergleich müsstest du den Zeiger dereferenzieren also

C++:
 if(*p==k)

sofern p ein Zeiger auf int und k ein int.
 
da der ganze code sry da hat es was abgeschnitten:

C++:
#include <iostream>
using namespace std;

const int A=9;
const int B=7;

int main()
{
char Spielfeld[A][B];
int a, b;
char ca, cb;


    for (a=0; a<A; a++)
    {
        for (b=0; b<B; b++)
        {
            Spielfeld[a][b] = '.';
        }
    }
    // Anzeige und Eingabe
    bool SchleifenEnde=false;
    int xin, yin;
    do
    {
        cout << "      1  2  3  4  5  6  7  8  9" << endl;
        for (b=0; b<B; b++)
        {
            cout << (char)('A'+b) << "   ";
            for (a=0; a<A; a++)
            {
                cout << "  " << Spielfeld[a][b];
            }
            cout << endl;
        }
        cout << "Spieler 1 -- Koordinaten setzen: (ZZ eingeben wenn die Schiffe platziert sind)" << endl;
        cin >> ca >> cb;
        xin = ca - '1';
        yin = cb - 'A';
        if (xin>=0 && xin<9 && yin>=0 && yin<7)
        {
            Spielfeld[xin][yin] = '1';
        }
        else
        {
             SchleifenEnde = true;
        }
    }
    while (!SchleifenEnde);




char cy, cx;


    cout << "Spieler 2 -- Welches Feld befeuern?:"  << endl;
    cin >> cy >> cx;
        xin = cy - '1';
        yin = cx - 'A';
        if (xin>=0 && xin<9 && yin>=0 && yin<7)
        {
         Spielfeld[xin][yin] = '2';
        }
        else;
        cout << "      1  2  3  4  5  6  7  8  9" << endl;
        for (b=0; b<B; b++)
        {
            cout << (char)('A'+b) << "   ";
            for (a=0; a<A; a++)
            {
                cout << "  " << Spielfeld[a][b];
            }
            cout << endl;
        }
    for (int n=0; n; n++ ){ //Abfrage soll hier dann sein das war aber falsch

    }
return 0;

}
ich hab quasi ein Spielfeld die Koordinaten wo Spieler1 ein schiff hinhaben will wird mit '1' belegt und die Koordinaten wo Spieler 2 drauf schießt kommt eine 2 rein. ^^' Aber ich glaube das kann so generll nicht funktionieren.

Lieben Gruß
 
Das wollte ich auch längst angemerkt haben. Beim "echten" Schiffeversenken hat ja auch jeder ein eigenes Spielfeld. Du kannst durchaus ein einziges Spielfeld nehmen, aber du solltest dann wieder durch eine weitere Dimension die verschiedenen Spieler kennzeichnen, das wird dann jedoch irgendwann unübersichtlich.

Du kannst das natürlich auf verschiedene Weisen realisieren, die alle zum gleichen Ergebnis führen. Ich würde es z.B so realisieren das jedes Spielfeld eines Spielers mit 0=Wasser vorbelegt ist. Dann trägt jeder Spieler seine Schiffe (=1?) und wenn dann das Spiel beginnt kannst du mit einer weiteren Zahl Treffer signalisieren, und einer weiteren Zahl wiederum Nieten, so weißt du auch beim Betrachten einer Zahl sofort, was dort passiert ist.

Grüße
 
Zurück