Online High score - namensgleichheit bei verschiedenen Spielern

    • Diskussion

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

    • Online High score - namensgleichheit bei verschiedenen Spielern

      Ich habe da eine ganz spezifische Frage bezüglich online Highscores.

      Ich versuche seit einiger Zeit ein eigenes OHS System mit PHP und Mysql (später steige ich möglicherweise auf PostgreSQL um) zu schreiben.
      Funktioniert soweit relativ gut.
      Habe da jedoch ein kleines Problem bei dem Desing der Highscore.

      Und zwar:
      Wenn ein Spieler eine Punktezahl (oder bei mir eine gewisse Zeit) in einem Level geschafft hat, wird diese Zeit mitsamt seinem Spielernamen an den Webserver
      geschickt der die Zeit + namen in eine Liste einträgt...

      Nun, was soll aber passieren wenn ein Spieler eine Zeit hochladet und bereits ein Eintrag mit dem jeweiligen Usernamen existiert?

      Es gibt 2 möglichkeiten:
      1. Der Eintrag wird (falls eine bessere Zeit erreicht wurde) auf die neue Zeit "geupdated". Somit gibt es nur weiterhin 1 Eintrag mit dme USernamen der aber nun die bessere Punktezahl/Zeit besitzt.
      2. Der Spieler bekommt einen neuen Eintrag in die Highscore. Dadurch hätten wir mehr als nur 1 Eintrag mit demselben Usernamen.

      Es gibt aber nun bei beiden Möglichkeiten Probleme:
      Zu 1:
      Eigentlich wäre die Nr1 die perfekte lösung, das Problem was nun aber auftauchen kann ist Namensgleichheit bei verschiedenen Spielern.
      Da ich kei nAccountsystem nutze, sondern die Spieler im Spiel ihren Profilnamen wählen lasse (der für die OHS auch verwendet wird) kann es sehr leicht
      dazu kommen dass mehrere Spieler denselben namen haben. Da das OHS System nun denkt, dass es derselbe Spieler sei, existiert aber nur 1 Eintrag auf der Online Highscore.
      Dadurch überschreiben sic hdie jeweiligen Spieler denselben eintrag.

      Natürlich könnte ich ein Accountsystem machen der die Namensgleichheit ausschliest, aber sich extra für solch ein Spiel irgendwo registrieren zu müssen ist etwas... umständlich.

      Zu 2:
      Wenn ein User mehrere Einträge in einer Highscore gleichzeitig haben kann, kann die OHS sehr leicht zugespammt werden.
      Wenn z.B: ein Spieler extremst gut im Spiel ist und leicht in die Top 10 kommt, und dann noch das Level 100 Mal wiederholt um seine bestzeit zu toppen,
      haben wir am ende in den Top 100 immerwieder denselben Spieler in der OHS stehen.
      Was für ein Problem entsteht? Wenn wir annehmen dass jeder Spieler mindestens 10 Versuche pro Level unternimmt, werden auch pro Spieler 10 Einträge in die OHS eingetragen.
      Das System wird dadurhc sehr stark zugespamt und am ende weis kein Spieler mehr wirklich wo er nun mit der Punktezahl eigentlich steht.


      Hat jemand einen Rat? Werde ich auf Accountsystem (um die Namensgleichheit zu unterbinden) zurückgreifen müssen?

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

    • Zwei Ideen, die mir spontan beim Durchlesen deines Posts kamen:
      1. Eine zuverlässigere Möglichkeit einen Spieler zu identifizieren, ohne gleich auf ein Accountsystem zurückzugreifen, wäre die Verwendung seiner E-Mail Adresse. Natürlich wollen die wenigsten gleich ihre E-Mail Adresse preisgeben nur um sich in einen Online Highscore einzutragen. Von daher wäre es sinnvoll den Spieler darauf hinzuweisen, dass seine Adresse ausschließlich für den Zweck der Identifizierung verwendet wird und nicht in der Tabelle öffentlich angezeigt wird (oder man bietet eine Checkbox an, um den Spieler selber entscheiden zu lassen). Zusätzlich kann man dann noch die Angabe der E-Mail Adresse optional machen und gegebenenfalls auf den Spielernamen als Identifizierung zurückgreifen. Ist wie gesagt nur eine spontane Idee, die natürlich nicht perfekt ist.
      2. Wenn du zu deiner zweiten Möglichkeit greifen willst, könnte man zwei Varianten für die Anzeige der Highscore Tabelle anbieten. In der ersten wird nur jeweils der beste Eintrag für jeden Spielernamen angezeigt und in der zweiten Anzeige auch alle anderen Versuche der Spieler. Wenn beispielsweise der gleiche Spieler die ersten 100 Plätze belegt, dann wird in der ersten Anzeige nur sein erster Platz angezeigt und dann die nächst besseren Spieler. (intern musst du also mehr als nur 100 Einträge erfassen)
    • Eine zuverlässigere Möglichkeit einen Spieler zu identifizieren, ohne gleich auf ein Accountsystem zurückzugreifen, wäre die Verwendung seiner E-Mail Adresse. Natürlich wollen die wenigsten gleich ihre E-Mail Adresse preisgeben nur um sich in einen Online Highscore einzutragen. Von daher wäre es sinnvoll den Spieler darauf hinzuweisen, dass seine Adresse ausschließlich für den Zweck der Identifizierung verwendet wird und nicht in der Tabelle öffentlich angezeigt wird (oder man bietet eine Checkbox an, um den Spieler selber entscheiden zu lassen). Zusätzlich kann man dann noch die Angabe der E-Mail Adresse optional machen und gegebenenfalls auf den Spielernamen als Identifizierung zurückgreifen. Ist wie gesagt nur eine spontane Idee, die natürlich nicht perfekt ist.

      Hinzu kommt da auch noch die problematik, dass die Online Highscores bei Custom maps auch auf anderen (nicht von mir) gesteuerten Servern existieren können.
      Zumindest habe ich mir das so gedacht, dass jeder User der eine eigene Map baut, sich auch eine Online Highscore auf einem eigenen Server installieren kann. (Ich würde dazu die nötigen Mysql und PHP skripts anbieten)
      Das wiederum heisst, dass solche "kritischen" informationen wie E-mail adressen auch auf deren Servern abgespeichert wären.
      (Vielleicht sollte ich mir das konzept der custom maps nochmal überdenken...)

      Wenn du zu deiner zweiten Möglichkeit greifen willst, könnte man zwei Varianten für die Anzeige der Highscore Tabelle anbieten. In der ersten wird nur jeweils der beste Eintrag für jeden Spielernamen angezeigt und in der zweiten Anzeige auch alle anderen Versuche der Spieler. Wenn beispielsweise der gleiche Spieler die ersten 100 Plätze belegt, dann wird in der ersten Anzeige nur sein erster Platz angezeigt und dann die nächst besseren Spieler. (intern musst du also mehr als nur 100 Einträge erfassen)

      Man müsste dazu schauen ob man in MYSQL oder PostgreSQL solch eine Tabelle auch filtern kann, sodass jeder eintrag nur 1 mal vorkommt. (Sollte eigentlich gehen. Hab irgendetwas in dieser richtung schonmal gemacht.)
      Die Frage ist blos, ob die Tabelle für das DBMS nicht irgendwann zu groß sein wird wenn jeder eintrag gespeichert wird. Dementsprechend werden solche Filteroperationen auch richtig viel Performance kosten.

      Vielleicht wäre die beste Variante wirklich ein Accountsystem zu bauen das auf einem Server laufen würde. Dort kann man sich einen Usernamen (mit einer e-mailadresse als verifikation) einrichten und diesen dann nutzen.
      So wären die E-mail adressen wie bei der Variante 1 nicht auf allenmöglichen Rechnern verteilt, sondern auf einen Zentralserver über den ich noch halbwegs kontrolle hätte. Ansonsten wäre variante 2 eine interessante Idee.

      Ich stelle mir blos die Frage wie spiele wie Trackmania damit klarkommen. Die nutzen bei den Online Servern auch Profilnamen und diese werden nicht auf verfügbarkeit geprüft.

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

    • Ich weiß nicht wie gut es umsetzbar ist, aber wenn das Spiel beim ersten Start eine zufällige ID generiert und diese mitsendet kannst du zumindest doppelte Einträge vom selben System erkennen. Wenn du das ganze noch mit dem Profilnamen vergleichst sollte es auch sehr unwahrscheinlich sein das zwei verschiedene Spieler die selbe ID+den selben Namen haben.
    • LEWA schrieb:

      Man müsste dazu schauen ob man in MYSQL oder PostgreSQL solch eine Tabelle auch filtern kann, sodass jeder eintrag nur 1 mal vorkommt. (Sollte eigentlich gehen. Hab irgendetwas in dieser richtung schonmal gemacht.)
      Die Frage ist blos, ob die Tabelle für das DBMS nicht irgendwann zu groß sein wird wenn jeder eintrag gespeichert wird. Dementsprechend werden solche Filteroperationen auch richtig viel Performance kosten.

      Mit SQL lässt sich so eine Abfrage auf jeden Fall formulieren. Um die Performance würde ich mir keine Gedanken machen. Datenbanksysteme sind ja gerade darauf optimiert mit großen Datenmengen zurechtzukommen. Wenn die Anzahl der Einträge nicht gerade in die Millionen geht, sollte das kein Problem sein. Zudem musst du auch nicht alle Einträge abspeichern, sondern kannst solche verwerfen, die es nicht unter die 100 (oder wie viele auch) besten Spieler geschafft haben.

      Die Idee von andre111 finde ich auch nicht schlecht nur ist die ID dann an das System und nicht den Spieler gekoppelt, was aber denke ich zu verkraften wäre.
    • Die Idee von andre111 finde ich auch nicht schlecht nur ist die ID dann an das System und nicht den Spieler gekoppelt, was aber denke ich zu verkraften wäre.

      Das Problem ist dass man trotzdem dieses System "umgehen" kann. Sofern dann einige User noch hinter die funktionalität des Systems kommen, kann es passieren dass einige Spieler einfach aus fun zwischen verschiedenen PCs switchen und dadurch verschiedene Accounts erstellen (die sie womöglich nur kurz nutzen und später dann liegen lassen) wodurch die usernamen die sie anlegen für andere belegt sein werden. Letztendlich werde ich solche vergleiche so oder so auf einem Zentralen server ablaufen lassen (müssen). Anders geht es ja nicht, da die IDs die bereits schon verwendet wurden irgendwo verglichen werden müssen. (Es muss irgendow eine Datenbank geben.)
      Da muss ich mir noch gedanken darüber machen.

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

    • Wenn du auf jeden Fall einen zentralen Server verwendest, könnte das Spiel auch beim ersten Start den Server nach einer eindeutigen ID fragen. Dadurch müsste nichts mehr mit dem Namen verglichen werden und verschiedene Nutzer können den selben Namen nutzen.

      Dann ist das ganze zwar immer noch pro System und nicht pro Spieler, aber ich glaube das lässt sich ohne ein Accountsystem nicht vermeiden.