cin.get >> Endlosschleife ??? // noch ne Frage



  • 😕

    Hallo, ich bin gerade dabei mit C++ ein kleines 2D Feld zu schreiben welches mittels 2D Array erstellt wird.
    Jede Zelle hat einen bool-wert der besagt ob das feld schon belegt ist oder nicht... je nach dem werden bei der Grafischen ausgabe" . " oder " x " dargestellt.

    Außerdem soll noch jede Zelle einen Namen speichern, den ich mittels Abfrage festlegen möchte. Und hier sind wir auch schon beim Problem...

    Aus irgendeinem Grund erzeugt diese Zeile eine Endlosschleife...

    cin.get (Spielfeld[x][y].Name, 29);
    

    Warum ???

    Hier mal mein Quellcode:

    // 2D-Array Aufgabe
    // 
    #include <cstdlib>
    #include <iostream>
    #include <string>
    
    using namespace std;
    
    // Strukturen
    //
    struct S_Feldinfo
    {
     bool Besetzt;
     char Name[30];             
    };
    
    // Konstaten
    //
    const int Breite = 5;
    const int Hoehe = 5;
    
    // Variablen
    //
    S_Feldinfo Spielfeld[Breite][Hoehe];
    
    // Prototypen
    //
    void LoescheSpielfeld ();
    void ZeigeSpielfeld ();
    void ZeigeFelddaten ();
    void BesetzeFeld ();
    
    int main()
    {
        int Auswahl;    // Gewaehlter Menuepunkt
    
        LoescheSpielfeld ();
    
        // Verarbeitung des Menues
        do
        {
          // Menue ausgeben
          //
          cout << "  2D MiniSpiel - Menue  " << endl;
          cout << "------------------------" << endl;
          cout << "(1) - Spielfeld anzeigen" << endl;
          cout << "(2) - Feld besetzen" << endl;
          cout << "(3) - Felddaten anzeigen" << endl;
          cout << "(4) - Spielfeld loeschen" << endl;
          cout << "(5) - Programm beenden" << endl;
    
          // Eingabe abfragen
          cout << "\nAuswahl: ";
          cin >> Auswahl;
    
          // Verzweigung der Auswahl
          switch (Auswahl)
          {
                 // Spielfeld anzeigen
                 case (1):
                      {
                          cout << "\n\n Spielfeld " << endl;
                          cout << "-----------" << endl;
                          ZeigeSpielfeld ();
                          cout << endl << endl << endl << endl << endl;  
                      } break;
    
                 // Feld besetzten
                 case (2):
                      {                     
                          cout << "\n\n  Feld besetzen  " << endl;
                          cout << "------------------" << endl;
                          BesetzeFeld ();
                          cout << endl << endl << endl << endl << endl;
                      } break;
    
                 // Felddaten anzeigen
                 case (3):
                      {
                          cout << "Felddaten anzeigen" << endl;
                          cout << "------------------" << endl;
                          ZeigeFelddaten ();
                          cout << endl << endl << endl << endl << endl;
                      } break;
    
                 // Spielfeld loeschen
                 case (4):
                      {
                          cout << "\n\nSpielfeld loeschen " << endl;
                          cout << "--------------------" << endl;
                          cout << "Feld wurde geloescht" << endl;
                          LoescheSpielfeld ();
                          cout << endl << endl << endl << endl << endl;      
                      } break;
    
                 // Programm beenden
                 case (5):
                      {
                          cout << "     Programm beenden    " << endl;
                          cout << "-------------------------" << endl;
                          cout << "Bis zum naechsten Mal ..." << endl;
                          system("PAUSE");    
                      } break;
    
                 // Falsche Eingabe
                 default:
                 {
                         cout << " Falsche Eingabe! " << endl;
                         cout << "------------------\n\n" << endl;                  
                 }
          }
    
        } while (Auswahl != 5); // Spiel beenden?
    
        cout << "Bis zum naechsten Mal" << endl;
    
        return 0;    
    }   // Main
    
    // Name: LoescheSpielfeld
    //
    // Aufgabe: Spielfeld zurück setzten
    //
    void LoescheSpielfeld ()
    {
      for (int y=0; y<Hoehe; y++)
      {
          for (int x=0; x<Breite; x++)
          {
          Spielfeld[x][y].Besetzt = false;
          }     
      }       
    } // LoescheSpielfeld
    
    // Name: ZeigeSpielfeld
    //
    // Aufgabe: Spielfeld anzeigen
    //
    void ZeigeSpielfeld ()
    {
         for (int y=0; y<Hoehe; y++)
         {
          for (int x=0; x<Breite; x++)
          {
              if (Spielfeld[x][y].Besetzt == true)
              {
               cout << "X ";
              }
              else
              {
               cout << ". ";              
              }
          }
          cout << endl;
         }                   
    } // ZeigeSpielfeld
    
    // Name: BesetzeFeld
    //
    // Aufgabe: Feld besetzten
    //
    void BesetzeFeld ()
    {
     int x = 0; // X, Y Kordinaten (Zwischenspeicher)
     int y = 0;
    
     do{
        cout << "\nBitte X-Korinate (Zwischen 1 und " << Breite << ") eingeben: ";
        cin >> x;
        cout << "\nBitte Y-Kordinate (Zwischen 1 und " << Hoehe << ") eingeben: ";
        cin >> y;
    
        if (x < 1 || x > Breite || y < 1 || y > Hoehe)
        {
         cout << "\nFalsche Eingabe !";
        }
        if (Spielfeld[x][y].Besetzt == true)
        {
         cout << "\nDieses Spielfeld ist schon besetzt, bitte waehlen sie ein anderes";
        }
    
       } while (x < 1 || x > Breite || y < 1 || y > Hoehe || Spielfeld[x][y].Besetzt == true);
    
        cout << "Bitte Name eingeben: ";
        cin.ignore (); // Habe ich vergessen beim ersten mal
        cin.get (Spielfeld[x][y].Name, 29);
        cout << endl;
    
        x = x -1;    // Korrekturwert fürs Feldarray
        y = y- 1;
    
        Spielfeld[x][y].Besetzt = true;
    
    } // BesetzeFeld
    
    // Name: ZeigeFelddaten
    //
    // Aufgabe: Inhalt eines Feldes ausgeben
    //
    void ZeigeFelddaten ()
    {
     int x = 0; // X, Y Kordinaten (Zwischenspeicher)
     int y = 0;
    
     do{    
        cout << "\nBitte X-Korinate (Zwischen 1 und " << Breite << ") eingeben: ";
        cin >> x;
        cout << "\nBitte Y-Kordinate (Zwischen 1 und " << Hoehe << ") eingeben: ";
        cin >> y;
    
        if (x < 1 || x > Breite || y < 1 || y > Hoehe)
        {
         cout << "\nFalsche Eingabe !";
        }
    
       } while (x < 1 || x > Breite || y < 1 || y > Hoehe);
    
       x = x -1;    // Korrekturwert fürs Feldarray
       y = y- 1;
    
       if (Spielfeld[x][y].Besetzt == false)
       {
          cout << "\nFeld wurde noch nicht besetzt" << endl;                            
       } 
       else
       {
       cout << "\nFeld ist besetzt von: " << Spielfeld[x][y].Name << endl;
       }
    } // ZeigeFelddaten
    

    Hoffe mir kann jemand helfen 🙂
    Danke schon mal im Voraus

    EDIT: // habe den Fehler bereits selber gefunden... danke trotzdem 🙂
    cin.ignore (); // Habe ich beim ersten Mal vergessen



  • hmmm, gibt doch noch ein kleines Problem, irgendwie gibt der mir den Namen eines besetzten Feldes nicht aus.

    weiß jemand warum ?????

    denke es liegt an Zeile 190 oder 231, doch ich weiß nicht, was da falsch sein soll...


Anmelden zum Antworten