Spielergebnisse - Punkteberechnung c++



  • Ich brauche Hilfe bei meinem c++ Programm "Siedler-Punkterechner"

    Das Problem:
    ich habe bei einem StringGrid die werte ausgelesen und in einem Feld(String[]) gespeichert
    jetzt möchte ich dem spieler mit der größten punktezahl 5 dem 2. 3 Punkte dem 3. 1 Punkt und dem letzten keinen Punkt
    Aber! Wenn es 2 zweite plätze gibt dann sollen sie sich die punkte teilen:
    4/2 = 2 jeder 2 punkte

    Bis jetzt siehst es so aus:

    for(int i=1;i<=StringGrid1->RowCount;i++){
            int t = 0;
            for(int k=1;k < StringGrid1->ColCount;k=k+2){
                    if(StringGrid1->Cells[k][i]!="")
                    {
                    temp[t]= StringGrid1->Cells[k][i];
                    t++;
                    }}
    

    Die Punktezahl sollte dann in dem feld daneben angezeigt werden

    wie mache ich es jetzt am übersichtlichsten / besten ohne gleich mehrere seiten zu schreiben??

    ich habe auch schon TStringList probiert

    MFG SpiderX

    Ps:ich benutze borland habe windows



  • Wo stehen denn die Punke drin? In dem Grid? Wie sind die geordnet? Also was sind die zeilen was sind die spalten?
    Dein Code linearisiert das zweidimensionale cvells-array auf ein eindimensionales array temp[].
    Schreib mal nochmal genau, wo Punkte stehen und was sie bedeuten.

    Und wieso willst du dem spieler mit den meisten punkten 5 punkte geben? sind das dann andere punkte als die die er schon hat?



  • eis ist so angeordent:
    Datum || Spieler 1 SiegPunkte || Spieler 1 Punkte || ....
    und jede zeile ist ein neues spiel

    bei siedler ist es so das die spieler unterschiedliche punkte am schluss haben.
    Ich habe dann die siegpunkte und muss/darf die punkte rausbekommen.
    Mit 14 punkten hat man gewonnen.Also bekommt der erste in der Wertung 5 punkte.
    der zweit 3 punkte usw.
    ja es ist ein string grid.



  • dann würd ich dir erstmal empfehlen, die Punkte die im stringgrid stehen als erstes in eine besser verarbeitbare datenstruktur zu überführen, zB

    struct Spieler
    {
      int SpielerNr;
      int Punkte;
    };
    
    std::vector<Spieler> punkte;
    

    Dann kannst du dir noch einen operator < schreiben der zwei spieler anhand der punkte vergleicht.

    dann geht zB
    std::sort(punkte.begin(), punkte.end());

    Dann hast du die punkte schon sortiert. Der erste bekommt 5 punkte, der zweite 3 usw.
    Und zurückschreiben in das stringgrid



  • danke fur die antwort!!
    ich habe jetzt eine struktur spieler gemacht.
    aber das mit dem

    std::vector<Spieler> punkte;
    

    und dem

    std::sort(punkte.begin(), punkte.end());
    

    versteh ich noch nicht 😕



  • std::vector<Spieler> punkte_pro_spieler kannst du als array ansehen, welches fpür jeden Spieler die punkte speichert.

    Jetzt kannst du den vector sortieren, damit du nicht selber sortieren muss. Dazu rufst du

    std::sort(punkte.begin(), punkte.end());
    Auf. Damit wird der vector (sozusagen das array) von anfang bis ende aufteigend sortiert.



  • ich versteh jetzt das mit dem operator noch nicht!!
    sry

    Spieler spieler[4];
    
            spieler[0].norm_punkte = StrToInt(StringGrid1->Cells[1][i]);
             spieler[1].norm_punkte = StrToInt(StringGrid1->Cells[3][i]);
              spieler[2].norm_punkte=StrToInt(StringGrid1->Cells[5][i]);
               spieler[3].norm_punkte=StrToInt(StringGrid1->Cells[7][i]);
    
               std::vector <Spieler> norm_Punkte;
               std::sort(norm_Punkte.begin(), norm_Punkte.end());
    

    [C++ Fehler] _function_base.h(73): E2093 'operator<' ist im Typ 'Spieler' für Argumente desselben Typs nicht implementiert

    was soll ich machen?



  • -vector erstmal initialisieren. bisher hast du ja nur einen deklariert, das ding hat keine länge keine elemente kein gar nix

    -mit push_back schiebste deine ganzen spieler darein

    -zum sortieren muss du n operator< definieren, geht imho so in etwa:

    struct Spieler{
     unsigned int spielernummer;
     unsigned int punkte;
    };
    
    //operator < überladen, sodass du die spieler sortieren kannst:
    bool operator < (const Spieler& s1, const Spieler& s2){
     return (s1.punkte<s2.punkte);
    }
    

Anmelden zum Antworten