In einem 2D Array bestimmte Buchstaben färben



  • Hallo, Ich habe eine Aufgabe und glaube sie schon richtig gelöst zu haben. Die Aufgabe ist in einem 2D array nach Tiernamen zu suchen (in alle Richtungen, auch rückwerts, diagonal etc.). Das Programm habe ich in QT geschrieben. Mit dem Debugger findet das Programm das eingegebene Wort auch im Array nur ist jetzt meine Frage wie ich es hinbekomme, dass die gefundenen Buchstaben sich in eine andere Farbe ändern.
    Hier mein Code:

    const int MAX=20;
    const QChar Quadr[MAX][MAX]=
    {{'A','M','S','E','L','L','E','R','O','F','M','R','U','W','D','N','A','B','O','A'},
     {'L','E','G','I','U','H','E','G','N','A','L','H','C','S','N','A','N','D','U','L'},
     {'B','O','C','K','B','U','E','N','A','Y','H','O','R','N','I','S','S','E','H','L'},
     {'N','H','A','H','E','H','S','U','A','L','U','C','H','S','T','S','R','L','U','I'},
     {'R','P','N','E','Z','N','A','W','R','E','H','D','R','A','P','O','E','L','R','G'},
     {'E','A','I','S','R','E','W','I','E','S','E','L','R','E','C','H','L','I','U','A'},
     {'P','V','V','C','E','T','R','A','D','W','A','P','C','H','C','E','S','R','G','T'},
     {'I','I','G','H','T','S','O','B','N','A','L','H','S','S','O','C','T','G','N','O'},
     {'V','A','N','W','T','U','D','A','A','P','T','E','U','Z','Y','H','E','B','A','R'},
     {'M','N','I','A','A','G','N','R','R','M','I','M','S','I','O','T','R','L','K','H'},
     {'M','I','P','N','N','N','O','S','A','I','L','E','L','E','T','T','A','R','C','S'},
     {'E','U','L','R','S','A','K','C','W','H','T','T','N','G','E','M','A','S','U','H'},
     {'R','B','W','B','E','L','L','H','H','C','I','A','N','E','A','N','I','A','K','C'},
     {'E','B','B','E','E','I','E','E','E','S','S','U','T','O','I','F','R','N','C','V'},
     {'I','E','L','O','F','T','E','W','D','H','E','N','B','C','I','B','E','T','V','F'},
     {'H','V','M','L','R','F','O','G','O','V','E','R','H','A','O','P','D','I','K','A'},
     {'E','L','E','E','L','L','A','R','A','U','P','E','I','K','R','F','R','L','R','H'},
     {'R','E','G','E','L','E','N','M','K','N','W','E','S','P','E','A','A','O','A','C'},
     {'R','I','N','D','E','B','U','A','T','E','S','I','E','M','A','U','M','P','C','S'},
     {'T','F','L','O','W','P','A','N','T','H','E','R','N','R','E','T','S','E','E','S'}};
    
    void MainWindow::ErstelleBild() {
        int lblSize = MAX+5;
        QRect rect; // für Werte der groupBox
        // Größe und Position der groupBox anpassen
        rect=ui->groupBox->geometry();
        ui->groupBox->setGeometry(rect.left(),rect.top(),(MAX)*lblSize,MAX*lblSize);
        ui->groupBox->setFlat(false);
        //Quadrat erstellen
        for(int i=0;i<MAX;i++) {
            for(int k=0;k<MAX;k++) {
                lbl[i][k]=new QLabel(this); // erstellt neues QLabel-Objekt
                lbl[i][k]->setGeometry(lblSize*k,lblSize*i,lblSize-1,lblSize-1);
                lbl[i][k]->setFont(QFont("Arial",16));
                lbl[i][k]->setAlignment(Qt::AlignHCenter | Qt::AlignVCenter );
                lbl[i][k]->setStyleSheet("color:black;font-weight:bold");
                lbl[i][k]->setFrameStyle(QFrame::Box);
                lbl[i][k]->setText(Quadr[i][k]);
                lbl[i][k]->setParent(ui->groupBox); //in die groupBox zeichnen
                lbl[i][k]->show(); // anzeigen
            }
        }
    }
    void MainWindow::RestlicheBuchstaben(int richtung, int Zeile, int Spalte, QString Wort)
    {
        bool buchstabeRichtig=true;
        int alleRichtungen [2][8] = {{-1,-1,+0,+1,+1,+1,+0,-1},
                                     {+0,+1,+1,+1,+0,-1,-1,-1}};
        int zaehler=0;
    
        Zeile=Zeile+alleRichtungen[0][richtung];
        Spalte=Spalte+alleRichtungen[1][richtung];
    
        while (buchstabeRichtig&&Wort.length()-2>zaehler) {
            if (Quadr[Zeile+alleRichtungen[0][richtung]] [Spalte+alleRichtungen[1][richtung]] == Wort.mid(zaehler+2,1)) {
            }
            else
                buchstabeRichtig=false;
            zaehler++;
        }
    }
    
    void MainWindow::zweiterBuchstabe (int &richtung, int Zeile, int Spalte, QString Wort) {
        int alleRichtungen [2][8] = {{-1,-1,+0,+1,+1,+1,+0,-1},
                                     {+0,+1,+1,+1,+0,-1,-1,-1}};
        for (richtung=0;richtung<8;richtung++) {
            if (Quadr[Zeile+alleRichtungen[0][richtung]][Spalte+alleRichtungen[1][richtung]] == Wort.mid(1,1)) {
                RestlicheBuchstaben(richtung,Zeile,Spalte,Wort);
            }
        }
    }
    
    void MainWindow::ErsterBuchstabe (QString Wort) {
        int richtung;
        for(int Zeile=0;Zeile<MAX;Zeile++) {
            for(int Spalte=0;Spalte<MAX;Spalte++) {
                if (Quadr[Zeile][Spalte] == Wort.mid(0,1)) {
                    zweiterBuchstabe(richtung,Zeile,Spalte,Wort);
                }
            }
        }
    }
    
    void MainWindow::on_pushButton_suchen_clicked()
    {
        for(int i=0;i<MAX;i++) {
            for(int k=0;k<MAX;k++) {
                lbl[i][k]->setStyleSheet("color:black;font-weight:bold");
            }
        }
        QString Wort = ui->lineEdit_Eingabe->text().toUpper();
        ErsterBuchstabe(Wort);
    }
    


  • Ich würde vermuten, indem du das Stylesheet des Labels durch eines mit der gewünschten Farbe ersetzt.



  • Das ist doch gar nicht meine Frage. Den Befehl etc. um die Farbe des Labels zu ändern kenne ich ja. Ich will nur wissen, wie ich die gefundenen Buchstaben am Ende in eine andere Farbe ändern kann. (Also klar mit dem Befehl die Farbe zu ändern, aber wie ich jetzt weiß was genau ich färben muss und vor allem wie ich dann genau die Buchstaben färbe die gefunden wurden, das ist mir noch unklar)



  • c++Freak12345 schrieb:

    Das ist doch gar nicht meine Frage.

    Nein? Dann solltest du dir deine "Frage" mal genau durchlesen.

    Wenn du einen Buchstaben gefunden hast, kennst du doch i,k für dein Labelarray.



  • Könntest du mir dann vielleicht genau erklären wie das geht? Und vor allem wie ich in der "Funktion RestlicheBuchstaben" dann mehrere Buchstaben färbe. Weil dort ja mehr als nur ein i,k gebraucht wird. Und außerdem wie mache ich das denn beim ersten und zweiten Buchstaben?



  • Der Index von Quadr wenn ein Buchstabe gefunden wurde ist doch wohl i,k. Keine Ahnung, warum du drei Funktionen hast, aber in restlicheBuchstaben könntest du die Paare i,k in einen vector schreiben und im Erfolgsfall alle umfärben. Anschließend lieferst du nach zweter und danach erster true zurück und färbst da das jeweilige Paar.



  • Ich würde auch den gesamten Check in einer Funktion machen. Also eine bool MatchesWord(wort, startpunkt, richtung) Funktion. Und dann halt eine Funktion void ColorWord(länge, startpunkt, richtung, farbe) Funktion zum Einfärben.
    Und dann halt

    für alle startpunkte p
       für alle richtungen d
           if (MatchesWord(word, p, d))
              ColorWord(word.Length, p, d, highlightFarbe)
    


  • Dachte mit drei Funktionen wäre es leichter. Habe versucht es in nur eine Funktion zu ändern, hat aber irgendwie nicht geklappt. Aber wenn ich die Buchstaben in meinem Programm färben möchte, sollte ich das einzeln machen (Also in jeder Funktion) oder irgendwo am Ende? Weil ich hatte die Idee die Länge des Wortes zu nehmen, die Richtung zu gucken und dann vom Ende des Wortes in die entgegengesetzte Richtung die Anzahl der Buchstaben zu färben, weiß aber nicht genau wie das funktionieren soll(und ob es überhaupt funktioniert). Falls das nicht geht, könnte mir einer bitte mit einem Code helfen wie genau das in meinem Programm funktionieren könnte, die gefundenen Buchstaben zu färben?



  • Hast du meinen Beitrag gelesen?



  • Ja habe ich. Allerdings habe ich das probiert und es nicht hinbekommen. Wie schaffe ich es denn in meinem Programm das zu färben? Also kannst du mir vielleicht mit richtigem Code (bezogen auf mein Programm) helfen?



  • Na mit lbl[x][y]->setStyleSheet("was-auch-immer"); ?


Anmelden zum Antworten