Mehrere Daten aus Dini auslesen und nach größe sortieren (Ranking)

Wichtiger Hinweis: Bitte ändert nicht manuell die Schriftfarbe auf schwarz sondern belasst es bei der Standardeinstellung. Somit tragt ihr dazu bei dass euer Text auch bei Verwendung unseren dunklen Forenstils noch lesbar ist!

Tipp: Ihr wollt längere Codeausschnitte oder Logfiles bereitstellen? Benutzt unseren eigenen PasteBin-Dienst Link
  • Servus...


    Nunja, das einzige was er dann ausspuckt ist 3x der selbe clan... :x
    Eventuell ist es nur ein denkfehler welchen ich nicht checke weil ich total hundemüde bin xD


    Naja, schaut es euch mal bitte an :)



    dcmd_ranking(playerid,params[])
    {
    #pragma unused params
    new CN1[128],CN2[128],CN3[128],CP1,CP2,CP3,string[256],cstring[128],ccstring[128],merken,merken2,merken3;
    for(new c=0;c<MAX_CLANS;c++)
    {
    format(ccstring,sizeof(ccstring),"pkt%d",c);
    if(merken < dini_Int("Clans/ranking.txt",ccstring))
    {
    merken=dini_Int("Clans/ranking.txt",ccstring);
    CP1=dini_Int("Clans/ranking.txt",ccstring);
    format(cstring,sizeof(cstring),"name%d",c);
    strmid(CN1, dini_Get("Clans/ranking.txt", cstring), false, strlen(dini_Get("Clans/ranking.txt", cstring)), 128);
    }
    if(merken2 < merken)
    {
    merken2=dini_Int("Clans/ranking.txt",ccstring);
    CP2=dini_Int("Clans/ranking.txt",ccstring);
    format(cstring,sizeof(cstring),"name%d",c);
    strmid(CN2, dini_Get("Clans/ranking.txt", cstring), false, strlen(dini_Get("Clans/ranking.txt", cstring)), 128);
    }
    if(merken3 < merken2)
    {
    merken3=dini_Int("Clans/ranking.txt",ccstring);
    CP3=dini_Int("Clans/ranking.txt",ccstring);
    format(cstring,sizeof(cstring),"name%d",c);
    strmid(CN3, dini_Get("Clans/ranking.txt", cstring), false, strlen(dini_Get("Clans/ranking.txt", cstring)), 128);
    }
    }
    format(string, sizeof(string),"Top 3 Clan's:\n \n1. Name: %s - Punkte: %d\n2. Name: %s - Punkte: %d\n3. Name: %s - Punkte: %d",CN1,CP1,CN2,CP2,CN3,CP3);
    ShowPlayerDialog(playerid, DIALOG_RANKING, DIALOG_STYLE_MSGBOX,".:: Clan Ranking ::.",string,"Schließen","");
    return 1;
    }


    Greetings

  • So kannst du es schreiben:


    dcmd_ranking(playerid,params[])
    {
    #pragma unused params
    new CN1[128],CN2[128],CN3[128],CP1,CP2,CP3,string[256],wert,name[128];
    for(new c=0;c<MAX_CLANS;c++)
    {
    format(string,sizeof(string),"pkt%d",c);
    wert = dini_Int("Clans/ranking.txt",string);
    format(string,sizeof(string),"name%d",c);
    format(name, sizeof(name), dini_Get("Clans/ranking.txt", string));

    if(wert > CP3)
    {
    CP3=wert;
    format(CN3, sizeof(CN3), name);
    }
    if(wert > CP2)
    {
    CP3 = CP2;
    CN3 = CN2;
    CP2=wert;
    format(CN2, sizeof(CN2), name);
    }
    if(wert > CP1)
    {
    CP2 = CP1;
    CN2 = CN1;
    CP1 = wert;
    format(CN1, sizeof(CN1), name);
    }
    }
    format(string, sizeof(string),"Top 3 Clan's:\n \n1. Name: %s - Punkte: %d\n2. Name: %s - Punkte: %d\n3. Name: %s - Punkte: %d",CN1,CP1,CN2,CP2,CN3,CP3);
    ShowPlayerDialog(playerid, DIALOG_RANKING, DIALOG_STYLE_MSGBOX,".:: Clan Ranking ::.",string,"Schließen","");
    return 1;
    }


    Bei drei Pätzen ist es relativ egal ob du es so machst oder mit einer Schleife.
    Angenommen du hättest 100 Plätze, dann kannst du ja nicht alles hinschreiben, da müsstest du eine Schleife verwenden.


    Ich habe dir es aber erst mal ohne Schleife gemacht, damit du den Unterschied zu deiner Variante siehst, und damit du es besser verstehst und nachvollziehen kannst.


    Mit einer Schleife würde es so aussehen:

    Spoiler anzeigen
    dcmd_ranking(playerid,params[])
    {
    #pragma unused params
    new CN[3][128],CP[3],string[256],wert,name[128];
    for(new c=0;c<MAX_CLANS;c++)
    {
    format(string,sizeof(string),"pkt%d",c);
    wert = dini_Int("Clans/ranking.txt",string);
    format(string,sizeof(string),"name%d",c);
    format(name, sizeof(name), dini_Get("Clans/ranking.txt", string));

    if(wert > CP[sizeof(CP)-1])
    {
    CP[sizeof(CP)-1] = wert;
    format(CN[sizeof(CP)-1], 128, name);
    }
    for(new i=sizeof(CP)-2; i>=0; i--)
    {
    if(wert > CP[i])
    {
    CP[i+1] = CP[i];
    format(CN[i+1], 128, CN[i]);
    CP[i]=wert;
    format(CN[i], 128, name);
    }
    else break;
    }
    }
    format(string, sizeof(string),"Top %d Clan's:\n \n",sizeof(CN));

    for(new i=0; i<sizeof(CN); i++)
    {
    format(string, sizeof(string),"%s%d. Name: %s - Punkte: %d\n",string,i+1,CN[i],CP[i]);
    }
    ShowPlayerDialog(playerid, DIALOG_RANKING, DIALOG_STYLE_MSGBOX,".:: Clan Ranking ::.",string,"Schließen","");
    return 1;
    }


    Wie du siehst macht es von der Größe und dem Aufwand kaum einen Unterschied, aber bei 100 Plätzen würde es einen erheblichen Unterschied machen.
    Es gibt sicher noch effizientere Sortiermöglichkeiten hier, aber diese ist relativ anschaulich, da sie das gleiche Prinzip verwendet wie der Code oben.


    Kannst ja beide mal ausprobieren, müsste bei beiden das gleiche rauskommen. ;)