Gleiche Platzierungen - Prioritäten

  • GM 7

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Gleiche Platzierungen - Prioritäten

    Hi, Leute,

    also ich mach ja im Moment ein Rennspiel und da werden die Platzierungen mittels den "placepts" ausgerechnet, also mal grob vereinfacht gesagt die Distanz über die Checkpoints bis zum Ziel. Nun kanns aber sein, dass man die gleichen Points hat, und damit wird mein gesamtes System praktisch durcheinandergebracht. Wie kann ichs jetzt so machen, dass es Prioritäten gibt: also z.B. Spieler > Gegner 1 > Gegner 2 > ... > Gegner 7. Wenn dann z.B. Gegner 3 auf Platz 2 ist und Gegner 7 auch, sollte Gegner 3 auf Platz 2 sein und Gegner 7 auf 3. Ich habe jetzt schon soviel rumprobiert, aber ich kriegs nich gebacken. Bitte um Hilfe ^^

    Danke im Voraus! :D
    :| < Hallo. Nein ich bin nicht die Signatur, ich putze hier nur.
  • Machs doch so,
    das stellst du bei jedem Auto ein:

    GML-Quellcode

    1. //step
    2. with obj_Auto
    3. {
    4. if Runde<other.Runde
    5. {
    6. other.Platz-=1
    7. }
    8. if Runde=other.Runde
    9. {
    10. if Nummer<other.Nummer
    11. {
    12. other.Platz-=1
    13. }
    14. else if Nummer=other.Nummer
    15. {
    16. if other.weite<weite
    17. {
    18. other.Platz-=1
    19. }
    20. }
    21. }
    22. }
    Alles anzeigen

    Runde ist die anzahl der Runden die das Auto gefahren ist, Nummer ist die anzahl der Checkpoints dieser Runde und weite die Entfernung zum nächsten Checkpoint.
    So sollte es dann automatisch funtzen weil es nie gleiche werte gibt.
    Twitter: @BytingGames
  • Ich glaub du hast da was falsch verstanden ^^ Das wird schon alles bei den "placepts" miteinkalkuliert, die Runden und die Checkpoints. Es geht mir nur darum, wenn die Autos z.B. direkt aufeinander kleben oder sonst irgendwie die gleiche Distanz herbekommen (wenn die Autos z.B. von der Strecke fallen haben viele CPU-Gegner die gleichen Werte)
    :| < Hallo. Nein ich bin nicht die Signatur, ich putze hier nur.
  • Nene, mit Platz mein ich die Platzierung im Rennen, die nach der Auswertung der placepts erfolgt. Die placepts berechne ich mit der Distanz zum nächsten Checkpoint, von dort aus wieder zum nächsten Checkpoint, etc. bis zum Ziel. Hat man eine höhere Rundenanzahl werden die placepts gesenkt (10 000/Runde), so dass das die Platzierungen nicht durcheinander bringen kann.

    Also wir haben z.B. folgende Situation:

    Player: 24 120 Points
    Gegner 1: 23 267 Points
    Gegner 2: 24 342 Points
    Gegner 3: 23 267 Points
    Gegner 4: 23 267 Points
    Gegner 5: 25 120 Points

    Ich will nun, dass diejenigen, die die gleichen Points haben nach einem Prioritätssystem (Player > Gegner 1 > ...) ausgewertet werden, also dass Gegner 1 auf Platz 1, 3 auf 2 und 4 auf 3 wäre. Player wäre hier auf 4, Gegner 2 auf 5 und Gegner 5 auf 6.

    Ists so verständlicher?
    :| < Hallo. Nein ich bin nicht die Signatur, ich putze hier nur.
  • GML-Quellcode

    1. placepts[0] = obj_kart.placepts;
    2. placepts[1] = obj_enemy_1.placepts;
    3. placepts[2] = obj_enemy_2.placepts;
    4. placepts[3] = obj_enemy_3.placepts;
    5. placepts[4] = obj_enemy_4.placepts;
    6. placepts[5] = obj_enemy_5.placepts;
    7. placepts[6] = obj_enemy_6.placepts;
    8. placepts[7] = obj_enemy_7.placepts;
    9. list = ds_list_create();
    10. ds_list_add(list,obj_kart.placepts);
    11. ds_list_add(list,obj_enemy_1.placepts);
    12. ds_list_add(list,obj_enemy_2.placepts);
    13. ds_list_add(list,obj_enemy_3.placepts);
    14. ds_list_add(list,obj_enemy_4.placepts);
    15. ds_list_add(list,obj_enemy_5.placepts);
    16. ds_list_add(list,obj_enemy_6.placepts);
    17. ds_list_add(list,obj_enemy_7.placepts);
    18. ds_list_sort(list,1);
    19. for (i = 0; i <= 8; i += 1) {
    20. if (obj_kart.placepts == ds_list_find_value(list,i)) {
    21. pos = i;
    22. obj_kart.pos = i;
    23. }
    24. if (obj_enemy_1.placepts == ds_list_find_value(list,i)) {obj_enemy_1.pos = i;}
    25. if (obj_enemy_2.placepts == ds_list_find_value(list,i)) {obj_enemy_2.pos = i;}
    26. if (obj_enemy_3.placepts == ds_list_find_value(list,i)) {obj_enemy_3.pos = i;}
    27. if (obj_enemy_4.placepts == ds_list_find_value(list,i)) {obj_enemy_4.pos = i;}
    28. if (obj_enemy_5.placepts == ds_list_find_value(list,i)) {obj_enemy_5.pos = i;}
    29. if (obj_enemy_6.placepts == ds_list_find_value(list,i)) {obj_enemy_6.pos = i;}
    30. if (obj_enemy_7.placepts == ds_list_find_value(list,i)) {obj_enemy_7.pos = i;}
    31. }
    32. with (par_kart) {obj_hud.mugshot[pos] = mugshot;}
    33. ds_list_destroy(list);
    Alles anzeigen
    :| < Hallo. Nein ich bin nicht die Signatur, ich putze hier nur.
  • Ich habe dir schnell ein Skript geschrieben, welches Scores und Namen (jeweils Arrays) anhand der Punktezahl sortiert:

    rank_sort(scores, names);
    Spoiler anzeigen

    GML-Quellcode

    1. // rank_sort(scores, names);
    2. var n, i, tmp_num, tmp_name, newn;
    3. n = 0;
    4. while (variable_local_array_get(argument0, n)) n += 1;
    5. while (n)
    6. {
    7. newn = 0;
    8. for (i = 1; i <= n-1; i += 1)
    9. {
    10. if (variable_local_array_get(argument0, i-1) < variable_local_array_get(argument0, i))
    11. {
    12. tmp_num = variable_local_array_get(argument0, i-1);
    13. variable_local_array_set(argument0, i-1, variable_local_array_get(argument0, i));
    14. variable_local_array_set(argument0, i, tmp_num);
    15. tmp_name = variable_local_array_get(argument1, i-1);
    16. variable_local_array_set(argument1, i-1, variable_local_array_get(argument1, i));
    17. variable_local_array_set(argument1, i, tmp_name);
    18. newn = i;
    19. }
    20. }
    21. n = newn;
    22. }
    Alles anzeigen

    Um die Erforderlichkeit eines Swaps zwischen der Namen der Spieler im Array zu ermitteln, reicht es aus, iteriert in einer for - Schleife, mit einem simplen if - Statement zuerst auf zwei gleiche Scores und danach auf die Prioritäten zu überprüfen. Doch dies bleibt der Übung halber dir überlassen.

    PS.: Eine Anwendung meines Skript kann beispielsweise dermaßen aussehen:
    Spoiler anzeigen

    GML-Quellcode

    1. scores[0] = 34214;
    2. scores[1] = 23452;
    3. scores[2] = ...
    4. ...
    5. names[0] = "Name 1";
    6. ...
    7. rank_sort("scores", "names");
    8. ...

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von luky300 ()

  • Hey, danke! Ich probiers gleich mal aus und meld mich wieder, wenns funktioniert oder net funktioniert hat! :D

    EDIT: Alsooo, dass Plätze zwei mal belegt werden is zwar schon mal weg und das freut mich auch, aber generell funktioniert das n bisschen komisch. An erster war ich am Anfang (ich start als letzter), dann der zweitletzte, dann der erste und dann der zweite. Komisch?

    GML-Quellcode

    1. placepts[0] = obj_kart.placepts;
    2. placepts[1] = obj_enemy_1.placepts;
    3. placepts[2] = obj_enemy_2.placepts;
    4. placepts[3] = obj_enemy_3.placepts;
    5. placepts[4] = obj_enemy_4.placepts;
    6. placepts[5] = obj_enemy_5.placepts;
    7. placepts[6] = obj_enemy_6.placepts;
    8. placepts[7] = obj_enemy_7.placepts;
    9. kart[0] = obj_kart;
    10. kart[1] = obj_enemy_1;
    11. kart[2] = obj_enemy_2;
    12. kart[3] = obj_enemy_3;
    13. kart[4] = obj_enemy_4;
    14. kart[5] = obj_enemy_5;
    15. kart[6] = obj_enemy_6;
    16. kart[7] = obj_enemy_7;
    17. rank_sort("placepts","kart");
    18. for (i = 0; i <= 7; i += 1) {
    19. if (kart[i] == obj_kart) {
    20. pos = i;
    21. obj_kart.pos = i;
    22. }
    23. if (kart[i] == obj_enemy_1) {obj_enemy_1.pos = i;}
    24. if (kart[i] == obj_enemy_2) {obj_enemy_2.pos = i;}
    25. if (kart[i] == obj_enemy_3) {obj_enemy_3.pos = i;}
    26. if (kart[i] == obj_enemy_4) {obj_enemy_4.pos = i;}
    27. if (kart[i] == obj_enemy_5) {obj_enemy_5.pos = i;}
    28. if (kart[i] == obj_enemy_6) {obj_enemy_6.pos = i;}
    29. if (kart[i] == obj_enemy_7) {obj_enemy_7.pos = i;}
    30. }
    Alles anzeigen


    Hier ist der Code. Benutz ich schon richtig, oder?

    EDIT 2: Ne, ich glaub da hab ich mich n bisschen verschaut. Die Platzierungen sind einfach nur umgedreht. Ich glaub mal das krieg ich selbst hin.

    EDIT 3: Passt, funktioniert alles. Muss mich nochmal recht herzlich bei luky300 bedanken. Du hast gerade meinen Freitag Abend gerettet :thumbsup: Hätte da vermutlich noch lange dran gehangen. Top Hilfe hier :D
    :| < Hallo. Nein ich bin nicht die Signatur, ich putze hier nur.

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von Lightning the Hedgehog ()