Bubblesort - Anwendung in Pawno

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
  • Da ich mich mal umgeschaut habe und feststellen musste, dass es ja noch gar kein Tutorial ueber Sortierungen gibt, moechte ich euch den Bubblesort heute mal naeher erklaeren und mit Pawno verbinden.
    Mit dem Bubblesort lassen sich einfache Arrays sortieren. Damit koennt ihr auf eurem Server beispielsweise eine Liste der reichsten Spieler oder aehnlichem erstellen :)


    Über ein Feedback würde ich mich sehr freuen ! :D


    Bubblesort - Ein Sortieralgorithmus
    Der Bubblesort ist weit verbreitet. Er durchlaeuft Schritt fuer Schritt die Arrays und vergleicht dabei den rechten mit dem linken Nachbarn, der jeweiligen Spalte. Das kann man sich gut wie eine Blase vorstellen, die immer zwei Variablen gleichzeitig Überprüft. Stimmen den vorher definierten Sortierregeln nicht ueberein, wird einfach links mit rechts vertauscht. Die Schleife wird so lange durchlaufen, bis alles sortiert ist.


    Bubblesort - Umsetzung in Pawno fuer eine "Reichenliste"
    Um uns die Spieler auflisten zu lassen, brauchen wir zunaechst ein Array. Da ich in dem Fall der Reichenliste den Geldbetrag des Spielers benötige, benutze ich ein Enum:
    Das Array zum Sortieren nenne ich "sortrich".

    enum e_Rich
    {
    Spielername,
    Spielergeld
    }
    new sortrich[MAX_PLAYERS][e_Rich];

    Jetzt kann man auch schon gleich zum Befehl selbst springen. Hierfür benutze ich ocmd.
    Außerdem erstelle ich zwei strings, um dem Spieler später die Liste anzeigen zu können.
    Das Array rich[e_Rich] erstelle ich für später, da dies unsere Zwischenvariable zum tauschen des eigentlichen Arrays sortrich ist.

    ocmd:rich (playerid,params[])
    {
    new string[32];
    new rich[e_Rich];
    new richlist[218];
    return 1;
    }

    Nun weißen wir erst mal jedem Spieler seinen Geldbetrag und seine ID zu. Am besten funktioniert das mit einer Schleife. Die ID ist sehr wichtig, da sie zu einer Autentifizierung des Spielers sorgt und wir mithilfe dieser ID den Namen rausfinden können.

    for(new i = 0; i < MAX_PLAYERS; i++)
    {
    if(!IsPlayerConnected(i))continue; //Überprüfung, ob der Spieler online ist.
    sortrich[i][Spielername] = i; //ID wird dem Spieler zugewiesen
    sortrich[i][Spielergeld] = GetPVarInt(i,"Geld"); //Geldbetrag wird dem Spieler zugewiesen
    }

    Nachdem das erfolgt ist, hat unser Array sortrich alle Geldbeträge jedem Spieler der online ist erfasst und gespeichert. Jetzt müssen wir nur noch sortieren :)
    Wir erstellen eine erste Schleife, die wieder jeden Spieler durchläuft. Direkt in dieser Schleife erstellen wir eine weitere, die jedoch ihren Betrag +1 der ersten Schleife definiert. Klingt ganz schön kompliziert, ist aber ganz simpel :)

    for(new a = 0; a < MAX_PLAYERS; a ++)
    {
    for(new b = a+1; b < MAX_PLAYERS; b++)
    {

    }
    }

    Jetzt können wir mit dem sortiernen und tauschen anfangen. Wir fragen ab, ob die sortrich von a kleiner als sortrich von b ist. Wenn ja soll das ganze vertauscht werden. Wenn nicht, wird die Abfrage übersprungen.

    for(new a = 0; a < MAX_PLAYERS; a ++)
    {
    for(new b = a+1; b < MAX_PLAYERS; b++)
    {
    if(sortrich[a][Spielergeld] < sortrich[b][Spielergeld])
    {


    }
    }
    }

    Wenn die Bedingung wahr ist, also sortrich von a kleiner als sortrich von b, sollen die beiden Werte vertauscht werden. Dazu verwenden wir die schon vorher definierte variable rich.

    rich[Spielername] = sortrich[a][Spielername]; //Ablegen des Spielername und Geldes von der ID a in die Zwischenvariable
    rich[Spielergeld] = sortrich[a][Spielergeld]; //Ablegen des Spielername und Geldes von der ID a in die Zwischenvariable
    sortrich[a][Spielername] = sortrich[b][Spielername]; //-"-
    sortrich[a][Spielergeld] = sortrich[b][Spielergeld]; //-"-
    sortrich[b][Spielername] = rich[Spielername]; //-"-
    sortrich[b][Spielergeld] = rich[Spielergeld]; // -"-

    Da ich den Code in einem Dialog haben möchte, baue ich noch eine letzte Funktion ein, damit auch jeder Name in einer anderen Zeile steht.

    for(new p = 0; p < MAX_PLAYERS; p++)
    {
    if(!IsPlayerConnected(p))continue; //Wir gucken wieder, ob der Spieler online ist. Wenn nicht, wird die Nummer einfach übersprungen
    new param[3] = "\n"; // \n trennt eine Zeichenkette in zwei Spalten - also ein Umbruch
    format(string,sizeof(string)," %s: %i %s",SpielerName(sortrich[p][Spielername]),sortrich[p][Spielergeld],param);
    strcat(richlist,string); //Hier wird der string, der richlist hinzugefügt, da der string sonst zu groß werden würde bei vielen Spielern
    }

    Und zuletzt zeigen wir dem Spieler natürlich noch den Dialog. Dafür müssen wir den Dialog noch definieren. Das passiert ganz oben im Script, unter den #include 's :)

    #define DIALOG_RICHLIST 90


    ocmd:rich
    {
    .
    .
    .
    ShowPlayerDialog(playerid,DIALOG_RICHLIST,DIALOG_STYLE_MSGBOX,"Reichenliste",richlist,"Ok","");
    return 1;
    }

    Jetzt noch der ganze Code :)

    #define DIALOG_RICHLIST 90


    enum e_Rich
    {
    Spielername,
    Spielergeld
    }
    new sortrich[MAX_PLAYERS][e_Rich];


    ocmd:rich (playerid,params[])
    {
    new string[32];
    new rich[e_Rich];
    new richlist[218];
    for(new i = 0; i < MAX_PLAYERS; i++)
    {
    if(!IsPlayerConnected(i))continue;
    sortrich[i][Spielername] = i;
    sortrich[i][Spielergeld] = GetPVarInt(i,"Geld");
    }
    for(new a = 0; a < MAX_PLAYERS; a ++)
    {
    for(new b = b+1; b < MAX_PLAYERS; b++)
    {
    if(sortrich[a][Spielergeld] < sortrich[b][Spielergeld])
    {
    rich[Spielername] = sortrich[a][Spielername];
    rich[Spielergeld] = sortrich[a][Spielergeld];
    sortrich[a][Spielername] = sortrich[b][Spielername];
    sortrich[a][Spielergeld] = sortrich[b][Spielergeld];
    sortrich[b][Spielername] = rich[Spielername];
    sortrich[b][Spielergeld] = rich[Spielergeld];
    }
    }
    }
    for(new p = 0; p < MAX_PLAYERS; p++)
    {
    if(!IsPlayerConnected(p))continue;
    new param[3] = "\n";
    format(string,sizeof(string)," %s: %i %s",SpielerName(sortrich[p][Spielername]),sortrich[p][Spielergeld],param);
    strcat(richlist,string);
    }
    ShowPlayerDialog(playerid,DIALOG_RICHLIST,DIALOG_STYLE_MSGBOX,"Reichenliste",richlist,"Ok","");
    return 1;
    }

    Ich hoffe ich konnte euch weiterhelfen oder einfach nur den Bubblesort vorstellen :D Über Kommentare und Bewertungen würde ich mich freuen, da dies mein erstes Tutorial war.