Ich entwickle ein einfaches Kartenspiel, bei dem es ein Matchmaking-System gibt, mit dem Sie gegen einen anderen menschlichen Spieler antreten können. Dies ist der einzige verfügbare Spielmodus, ein 1vs1 gegen einen anderen Menschen, keine KI.
Ich möchte Betrug so weit wie möglich verhindern. Ich habe hier bereits viele ähnliche Fragen gelesen und weiß bereits, dass ich dem Client nicht vertrauen kann und alle Überprüfungen serverseitig durchführen muss. Ich beabsichtige, einen Server zu haben (brauche sowieso einen für das Matchmaking) und ich beabsichtige, einige Überprüfungen auf der Serverseite vorzunehmen, aber wenn ich alles auf der Serverseite überprüfen möchte, kann mein Server den Status aller aktuellen Spiele und Spiele verfolgen Überprüfen Sie jede Aktion, und ich habe nicht das Geld / die Infrastruktur, um diesen Server zu unterstützen.
Meine Idee ist es, Clients dazu zu bringen, einige der von ihrem Gegner * durchgeführten Aktionen zu überprüfen und zu verifizieren. Wenn sie illegale Aktionen finden, benachrichtigen Sie den Server über den möglichen Betrug und lassen Sie ihn vom Server überprüfen. Dies erfordert weiterhin, dass mein Server alle aktuellen Spiele im Auge behält, spart jedoch Ressourcen, indem nur einige Dinge überprüft werden, die auf Clientseite nicht überprüft werden können (z. B. die Kartenreihenfolge im Deck), und andere Dinge nur überprüft werden, wenn sie tatsächlich falsch sind.
* (nur diejenigen, die sie überprüfen können, ohne sich betrügen zu lassen! Zum Beispiel: Sie können nicht überprüfen, ob die gespielte Karte in der Hand war, da sie alle Karten in der Hand kennen müssen.)
Zusammenfassend sind meine Fragen : Ist dies ein praktikabler Ansatz? Werde ich dabei tatsächlich Ressourcen sparen oder lohnt sich die zusätzliche Komplexität des Servers und Clients für den Austausch dieser Nachrichten nicht? Kennen Sie ein Spiel, das einen ähnlichen Ansatz erfolgreich oder erfolglos ausprobiert hat?
Vielen Dank für das Lesen und Antworten
quelle
Antworten:
Abhängig von der Komplexität Ihres Spiels müssen Sie möglicherweise große Teile des Spiels zurückverfolgen, um zu überprüfen, ob eine Aktion legal ist oder nicht. Ein Beispiel: Spieler A sagt, dass Spieler B diese Karte momentan nicht spielen kann, weil er kein ResourceX hat. Spieler B sagt, er hat viel ResourceX. Wer hat Recht? Um dies herauszufinden, würden Sie das gesamte Spiel von Anfang bis Ende erneut simulieren, um die ResourceX zu zählen, über die der PlayerB gerade verfügt. Nur die Aktionen der Spieler zu überprüfen, wenn man "Foul" schreit, ist also möglicherweise keine so große Optimierung.
Aber lohnt sich der Aufwand wirklich?
Ich denke, Sie könnten hier einen Fall vorzeitiger Optimierung haben. Obwohl ich nicht genau weiß, was Sie vorhaben, ist ein Kartenspiel auf der Serverseite normalerweise nicht so rechenintensiv.
Kartenspiele sind normalerweise so konzipiert, dass sie ohne Computerunterstützung gespielt werden können. Daher ist ihre Spielmechanik normalerweise rechnerisch einfach genug, um von Menschen ausgeführt zu werden *. Außerdem brauchen menschliche Spieler normalerweise einige Sekunden, um einen Zug auszuführen, was sich für den Server wie eine Ewigkeit anfühlt. Das bedeutet, dass Ihr Server nur eine leichte Aufgabe hat, die alle paar Sekunden pro Spiel ausgeführt werden muss. Ich weiß nicht, wie viele gleichzeitige Spieler Sie erwarten, aber solange Sie sich noch in der Größenordnung eines nichtkommerziellen Hobbyprojekts befinden, bezweifle ich, dass selbst der billigste Server, den Sie finden können, nicht damit umgehen kann. Voraussetzung ist natürlich, dass Sie wissen, wie man effizient programmiert.
*) solange Sie die Entscheidungsfindung der Spieler ausschließen. Die meisten Spiele basieren auf der Prämisse, dass die ideale Gewinnstrategie theoretisch berechnet werden kann, dies ist jedoch so komplex, dass Spieler und oft sogar Computer dazu nicht in der Lage sind, weshalb sie Intuition verwenden müssen. Aber Sie sagten, Sie wollen keine KI und nur Spieler gegen Spieler, also liegt dies außerhalb des Rahmens dieser Frage. Aber es bringt einen auch dazu, über einen anderen Betrugsaspekt nachzudenken: Haben Sie in Betracht gezogen, dass ein Spieler ein Programm verwendet, um ihm bei der Entscheidungsfindung zu helfen? Wie eine, die ihnen die genaue Wahrscheinlichkeit sagt, dass der Gegner eine bestimmte Karte zur Hand hat?
quelle
"Ich möchte Betrug so weit wie möglich verhindern." - So sagen wir alle. :) :)
Vielleicht ist es sinnvoller, keine Zeit damit zu verschwenden, etwas zu tun, das über die vernünftigen und allgemein wirksamen Maßnahmen gegen Betrug hinausgeht.
Dies sind: Doppeltests auf Fehler, die es Spielern ermöglichen würden, illegale Aktionen auszuführen, nur verschlüsselte Daten (über https oder benutzerdefinierte Verschlüsselung) zu senden und die App selbst zu verschlüsseln, um das Hacken zu erschweren. Das ist es.
Spieler betrügen am ehesten Fehler im Spiel als alles andere.
Sie könnten es in Bezug auf die Entwicklung einfach besser machen, zu warten, ob es Ihren Spielern wirklich wichtig genug ist, zu betrügen. Wenn sich die App nicht in einem bildlichen "Top 500-Diagramm" befindet und Betrug nicht ganz einfach ist (dh Fehler), ist es den Spielern nicht wichtig genug, ihre Zeit damit zu verschwenden, durch andere Maßnahmen zu betrügen, z. B. den IP-Stream zu ändern oder den zu hacken App.
Es sei denn natürlich, Sie handeln hier mit echtem Geld und tatsächlichen Preisen.
Wenn Ihre App erfolgreich ist und Betrug zu einem Problem wird, sollten Sie es angehen. Aber an diesem Punkt wird es ein Katz-und-Maus-Spiel sein, und die Betrüger werden immer gewinnen.
Grundsätzlich sage ich, dass 100% Ihrer Spieler nicht schummeln, wenn dies nicht durch einen reproduzierbaren Fehler möglich ist und / oder Ihre App nicht sehr beliebt ist. Wenn Ihre App sehr beliebt wird, betrügen weniger als 1% Ihrer Spieler auf eine Weise, die Sie sich gar nicht vorstellen können.
Was das Betrügen angeht, sollten Sie sich vor den offensichtlichen Cheats (Fehlern, Verschlüsselung von App und IP-Stream) schützen und nur auf tatsächliche Cheats reagieren, von denen Sie erfahren, und diese direkt ansprechen. Was Sie wirklich wollen, ist, alle Spieleraktionen zu protokollieren, sie auf dem Server überprüfen zu lassen und herauszufinden, warum, wenn Sie eine illegale Aktion finden, die ziemlich häufig auftritt. Könnte ein Fehler sein, könnte ein Exploit sein, könnte ein technischer Hack sein.
Die wichtigste Maßnahme gegen Betrug ist das Lernen, dass Spieler tatsächlich betrügen und wie.
quelle
Ich denke, Sie haben hier einige andere Probleme. Was ist, wenn der Spieler vortäuscht, ein normaler Client zu sein (indem er Ihren Netzwerkverkehr simuliert) und Ihr Spiel durch falsche Validierung beschädigt?
Anstatt zu versuchen, ein kugelsicheres Client-System zu erstellen, das Sie zu einer kontinuierlichen Behebung und einem Verbot von Fehlern / Exploits führt, würde ich versuchen, das Serversystem zu vereinfachen. Ich weiß nicht genug über Ihre Spielmechanik, aber vielleicht können Sie die Informationen auf dem Server auf ein Minimum reduzieren.
Im Allgemeinen sollten Sie davon ausgehen, dass der Client, mit dem Sie sprechen, jeden Code und jede Spielmechanik bereitstellen kann, die Sie bereitstellen möchten. Dies macht eine clientseitige Validierung nahezu unmöglich
quelle
Es hängt ein wenig davon ab, was Sie als Betrug betrachten. Verwendet es ein Werkzeug, um die Bewegungen auszuführen / zu berechnen? Soll das Kartenspiel während des Spiels gewechselt werden? Das erste wird schwer zu bewältigen sein. Beim zweiten können Sie daran denken, dass jeder Benutzer seine Karten einlegt und einen Hash-Code erstellt, der auf beiden Seiten angezeigt wird. Am Ende kann der Server den Hash mit den gespielten Karten und den verbleibenden Karten berechnen. Wenn ein Hash nicht übereinstimmt, hat der Benutzer betrogen. Wenn die Regeln nicht befolgt wurden, können Sie dies auch auf Ihrem Server überprüfen. Sie können dies auf Benutzeranforderung tun, um Ressourcen zu sparen. Es werden keine Informationen auf den Karten verfügbar. Um die Generierung des Hashs etwas eindeutiger / komplexer zu gestalten, können Sie den Benutzernamen in den Hash aufnehmen.
quelle