Ich mache gerade ein MMORPG.
Im Moment arbeite ich am Währungsteil des Spiels, aber ich bin verwirrt, ob ich für jede Einheit der generierten Währung eine eindeutige Seriennummer vergeben soll.
Ich hoffe, mit diesem System einen Missbrauch der virtuellen Währung nachvollziehen zu können. Ist dies jedoch eine gängige Praxis, und wenn nicht, wäre dies aus betrieblicher Sicht und / oder unter Performance-Gesichtspunkten eine gute Idee?
Antworten:
Es ist unwahrscheinlich, dass es Sinn ergibt.
Wenn ich 100 Zorkmids von Spieler A und 100 Zorkmids von Spieler B bekomme, habe ich 200 Zorkmids.
Wenn ich dann 50 Zorkmids an Spieler C zahle, bekommt C sie dann von den Zorkmids, die ich von Form A bekommen habe, oder von denen, die ich von B bekommen habe? Habe ich die Kontrolle darüber? Ist es überhaupt wichtig? Ein Zorkmid ist ein Zorkmid.
Für reale Banken und Buchhalter spielt es definitiv keine Rolle, dass alle die Transaktionshistorie von Konten verfolgen, nicht die Transaktionshistorie einzelner Währungseinheiten. Auf diese Weise ist es immer noch möglich, einen Missbrauch zu erkennen.
Abgesehen davon könnte ich mir ein Spiel vorstellen , bei dem einzelne Münzen als Inventargegenstände behandelt werden. Wenn Sie also mit jemandem handeln, müssen Sie sicherstellen, dass Sie Ersatzgeld haben. Dies würde einige interessante Funktionen ermöglichen, wie das Markieren, Verzaubern oder Fälschen von Münzen. In diesem Fall ist es sinnvoll, jede Münze einzeln zu verfolgen. Aber ich kann mir kein Spiel vorstellen, das das tatsächlich macht.
quelle
HC40415464
geschrieben ist, so dass es eindeutig von Vorteil ist, einen eindeutigen Ausweis zu haben, und dass es die Regierungen der realen Welt interessiertNein, das solltest du nicht.
Sie sollten zwar Systeme erstellen, mit denen Sie Währungstransaktionen nachverfolgen können (insbesondere, wenn diese Währung ein Echtgeld-Verschleierer ist), Sie müssen jedoch nicht jede einzelne Einheit dieser Währung nachverfolgen. Das, woran Sie interessiert sind, ist die Gesamtbewegung von Geldern, insbesondere in großen Mengen (da dies ein Indikator für potenzielle externe / nicht sanktionierte Echtgeldtransaktionen sein könnte). Die Verfolgung einzelner Währungseinheiten hilft dabei nicht weiter (dies kann sogar schaden) und erschwert die Verwaltung der relevanten Daten, indem Sie viele IDs generieren und relativ große Datenmengen in Ihrer Datenbank speichern müssen.
Diese Idee hat einen gewissen Wert für Echtgeld-Verschleierungswährungen (das ist etwas, was Sie mit echtem Geld kaufen, das zum Kauf von In-Game-Inhalten verwendet wird, wie zum Beispiel den Edelsteinen in Guild Wars 2). Insbesondere könnte dieser Wunsch entstehen, um zwischen Währungseinheiten, die "frei" in die Wirtschaft eingeführt wurden, und solchen, die über eine reale Transaktion eingeführt wurden, zu unterscheiden. Im Allgemeinen können Sie Einnahmen letztendlich nur für letztere erfassen, daher ist es wichtig, diese getrennt zu halten.
Sie können die benötigten Informationen jedoch einfach nachverfolgen, indem Sie die Zahlen in ihrer Gesamtheit speichern (Gesamteinheit, Gesamteinheit heraus, sowohl für "kostenlose" als auch für "bezahlte" Instanzen der Währung). Dies geht einher mit der allgemeinen Vorstellung , dass man diese Dinge in ihrer Gesamtheit verfolgen möchten, in der Regel eine der Transaktionsebene und nicht den aktuellen Stand, da sie beide Spuren , die Daten , die Sie wirklich brauchen , und macht es einfacher , große Teile der Mittel zu verfolgen , wie sie sich zerstreuen in Ihrem gesamten System.
quelle
Anmerkung des Autors: Bei dieser Antwort wurde davon ausgegangen, dass Sie nicht außerhalb des Netzwerks handeln und dann wieder mit den Servern synchronisieren.
Sie müssen einzelne Seriennummern von Währungen nicht speziell verfolgen, da Transaktionen zwischen einzelnen Spielern über Ihre Server erfolgen müssen. Mit anderen Worten, Ihre Server sind die maßgebliche Quelle für den Kontostand. Ihre Server werden den Benutzer nicht fragen, wie viel Geld er hat. Die mit den Servern verbundenen Clients fragen den Server über einen API-Anruf, wie viel Geld mein Spieler hat. Dies setzt die Annahme voraus, dass Spieler nicht handeln, während sie nicht im Netzwerk sind und dann wieder auf den oder die Server synchronisieren. [Das wäre zwar neu, aber ich empfehle es nicht, es sei denn, Sie möchten theoretisch viel Zeit damit verbringen ].
Im Beispiel der Regierungswährung ist die Währung die einzige maßgebliche Quelle, wenn sie nicht mit dem Konto verbunden ist sie haben sich die Mühe gemacht, es zu ertragen. Wenn die Rechnung bei einer Bank eingeht, können Sie feststellen, ob Seriennummern als nicht mehr im Umlauf sind usw.]. Ihre Transaktionen ähneln jedoch eher mehreren Benutzern in einer einzelnen Filiale, die Geld zwischen Konten transferieren, ohne jemals die Währung zu sehen.
Die wichtigste zu veranschaulichende Geschichte ist, wer Ihre maßgebliche Quelle ist: Ich werde versuchen zu veranschaulichen: Ein Benutzer möchte Geld aus dem Geldautomaten herausholen. Der Benutzer geht nicht in die Filiale und erklärt "Ich habe 500 Dollar, vertrau mir, das sind die Serien". Stattdessen gibt er den Schlüssel [Kontonummer / Schlüssel] weiter und die Filiale / der Server kann den Benutzer über sein Guthaben benachrichtigen und ihm erlauben, Geld abzuheben, während sein Kontostand verringert wird. Egal, was ein Benutzer unternimmt, um die Bank zu überzeugen "Wirklich, ich habe 500 Dollar", es sei denn, die maßgebliche Quelle (der Server) überprüft den Kontostand, es passiert nichts.
Prost.
quelle
Wenn Sie versuchen, eine Spielsimulation basierend auf der Funktionsweise der realen Welt zu programmieren, werden Sie auf einige große Probleme stoßen, wenn es darum geht, wie viele Informationen ein Computer verarbeiten kann.
Nehmen wir zum Beispiel die folgende Seite, die versucht zu berechnen, wie viele Atome sich in einem Sandkorn befinden.
http://www.thenakedscientists.com/forum/index.php?topic=6447.0
Ich habe viele Probleme wie diese beim Studium der Chemie und Physik gesehen, und die lächerlich hohe Zahl, zu der die Person auf dieser Seite gekommen ist, befindet sich im Ball Park dessen, was ich bei verschiedenen Lehrern und Lehrbüchern gesehen habe. -> 78 000 000 000 000 000 000
Selbst wenn dies weit entfernt ist und Sie 6 dieser Nullen entfernen, haben Sie immer noch eine Zahl, die viel zu groß ist, als dass ein durchschnittlicher Computer sie mit interaktiven Raten verarbeiten könnte. Insbesondere, wenn zu einem bestimmten Zeitpunkt Tausende dieser Transaktionen stattfinden.
Wie könnten wir möglicherweise den Impuls, die Positionen, die Geschwindigkeit, die momentanen Beschleunigungen, die Feldladungen usw. jedes Atoms in jedem Sandkorn an einem Strand berechnen und verfolgen, wenn nur ein Korn 78 000 000 000 000 000 Einzelkomponenten aufweist? (Oder noch mehr, wenn Sie die subatomaren Komponenten betrachten.)
Ich habe einmal ein nVidia-Grafikprogrammierdokument gelesen, in dem etwa Folgendes angegeben ist.
Tun Sie, was die beste Annäherung an das Aussehen ergibt, denn niemand kann wirklich erkennen, ob die Simulation nicht 100% genau ist. Effizienz muss berücksichtigt werden.
Gleiches gilt für jede Spielesimulation, auch wenn es sich nicht um eine Grafik handelt. Sie sollten wahrscheinlich nur das Nötigste tun, um die Dinge zum Laufen zu bringen. Wenn Sie hier alles geben, begraben Sie den Computer in einer Komplexität, die er nicht bewältigen kann.
Sie müssen auch versuchen, Code dieser Komplexität zu schreiben und zu pflegen.
Sie könnten jeder Währungseinheit eindeutige Seriennummern zuweisen, aber Sie werden alle Ressourcen des Computers nur für dieses eine Detail verbrauchen.
Eine bessere Möglichkeit, dies zu handhaben, besteht darin, für jede Transaktion nur eine eindeutige Kennung anzugeben.
Spieler 1 zahlt also Spieler 2 $ 1000000.
Wenn Sie jedem Dollar eine eindeutige Kennung geben, werden die Computer vieler Leute große Probleme haben, ganz zu schweigen von dem gesamten Netzwerkverkehr und der Verzögerung, die dies verursachen wird.
Oder Sie können nur einen Wert erstellen, der die gesamte Transaktion darstellt.
uint transferFunds_Player1ToPlayer2 = 1000000;
Sogar ein 20 Jahre alter Taschenrechner kann so etwas verarbeiten.
quelle