Array erzeugt Programmabsturz



  • Hallo

    Ich habe mal vor langem C++ "gelernt" und wollte nun ein kleines Poker-Programm schreiben. Aber irgendwie fehlts bei mir noch an den Basics...

    Ich kann bei folgendem Programm, welches für eine beliebige anzahl Spieler Karten austeilen sollte, keinen Fehler mehr finden.
    Das Programm stürzt beim Ausführen mit einer Windows-Fehlermeldung ab, compiliert wird es einwandfre. Anscheinend verträgt es die Ausgabe über ein Array nicht, aber keinen Plan wiso:

    //cout << conflicts << "Konflikte" << endl;
        for (int i=0; i<players; i++) {
            cout << "Spieler " << i+1 << ": " << cards[ hand[i][0][0] ][ hand[i][0][1] ];
            cout << " " << cards[ hand[i][1][0] ][ hand[i][1][1] ] << endl;
        }
    

    Da ich nicht weis, ob das ein Logikfehler ist oder nicht gebe ich mal den ganzen Code an. Zuerst definiere ich die möglichen Karten, danach wird per Zufall eine Karte gezogen und kontrolliert, ob diese nicht schon vergeben ist. Danach werden in einem anderen Array mit allen Spieler-Händen die beiden Karten eingetragen und am Schluss ausgegeben. Der Code könnte auch logisch nicht funktionieren, aber mir geht es darum das Ganze mal compilieren zu können.

    #include <cstdlib>
    #include <iostream>
    
    using namespace std;
    
    // Kartendeck besteht aus 4x13 = 52 Karten
    const char cards[13][4][3] = {  { "Ah", "As", "Ap", "Ak" },
                                    { "Kh", "Ks", "Kp", "Kk" },
                                    { "Qh", "Qs", "Qp", "Qk" },
                                    { "Jh", "Js", "Jp", "Jk" },
                                    { "1h", "1s", "1p", "1k" },
                                    { "9h", "9s", "9p", "9k" },
                                    { "8h", "8s", "8p", "8k" },
                                    { "7h", "7s", "7p", "7k" },
                                    { "6h", "6s", "6p", "6k" },
                                    { "5h", "5s", "5p", "5k" },
                                    { "4h", "4s", "4p", "4k" },
                                    { "3h", "3s", "3p", "3k" },
                                    { "2h", "2s", "2p", "2k" }};
    
    int main(int argc, char *argv[])
    {
        int players, conflicts;                // Anzahl Spieler
        bool carddeck[13][4];                  // Ausgeteilte Karten
        bool unique = false;                   // Verifizierungsvariable
    
        // Programm
        cout << "Anzahl Spieler: ";
        cin >> players;
        int hand[players-1][2][2];               // [Spieler 0 bis x][Karte 0 oder 1][Wert oder Art]
    
        srand((unsigned)time(NULL));
    
        // carddeck reseten
        for (int i=0; i<13; i++) {
            for (int j=0; j<4; j++) {
                carddeck[i][j] = false;
            }
        }    
    
        conflicts = 0;
    
        //Karten austeilen
        for (int i=0; i<players; i++) {                         // Spieler durchlaufen
            for (int j=0; j<2; j++ ) {                          // 2 Karen ziehen
                while (!unique) {                                     // Solange bis eine gültige Karte gezogen wurde
                      unique = true;
                      hand[i][j][0] = rand()%13;                      // Kartenwert ziehen
                      hand[i][j][1] = rand()%4;                       // Kartenart ziehen
                      if (carddeck[ hand[i][j][0] ][ hand[i][j][1] ]) {            // Kontrolle ob Karte bereits vergeben ist
                         unique = false;                                           // Ja
                         conflicts++; }                                         
                      else { carddeck[ hand[i][j][0] ][ hand[i][j][1] ] = true; }   // Nein => eintragen
                }
            }
        }
    
        //cout << conflicts << "Konflikte" << endl;
        for (int i=0; i<players; i++) {
            cout << "Spieler " << i+1 << ": " << cards[ hand[i][0][0] ][ hand[i][0][1] ];
            cout << " " << cards[ hand[i][1][0] ][ hand[i][1][1] ] << endl;
        }
    
        system("PAUSE");
        return EXIT_SUCCESS;
    }
    

    Ich lasse mich auch gerne belehren, wie man solche fehler selber analysieren kann (mit Dev-C++)...

    Besten Dank für deine Aufmerksamkeit 😉

    greez gieraffe



  • Hi,

    ein Array mit z. B. 5 Elementen benutzt Index 0 bis Index 4 (=5 Elemente).

    mfg theosoft



  • ahhrg, jo, genau!!

    Anscheinend ist die erste Karte in Ordnung, die restlichen haben viel zu hohe Werte... Keinen Plan wieso, aber das dürfte man rausfinden.

    danke und gruss


Anmelden zum Antworten