Sollte ich einzelnen Einheiten der Spielwährung eine eindeutige ID zuweisen?

22

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?

dK3
quelle
8
Wie oft kommt es in Ihrem Spiel vor, dass ein Spieler ungefähr eine Million Zorkmids auf einen anderen Spieler überträgt? Müssen Sie in diesem Fall eine Million Entitäten in Ihrer Datenbank aktualisieren?
Philipp
1
Das ist eigentlich eine interessante Idee. BitCoin macht so etwas für beliebige Währungsbeträge. Möglicherweise gibt es eine Lösung / Möglichkeit.
Asche999
4
@ ashes999 Die Leute von BitCoin StackExchange sagen, dass BitCoin auch Kontostände und nicht einzelne Währungseinheiten verfolgt.
Philipp
1
Wenn Geld völlig fungibel ist, ist ein Zorkmid wie jedes andere.
Joe
1
Nicht wahr, Joe. Reine Goldbarren sind vollständig fungibel, werden jedoch häufig serialisiert, um eine Veruntreuung zu verhindern.
Carl Smith

Antworten:

26

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.

Philipp
quelle
5
Ich habe mich gerade an ein Spiel erinnert, das tatsächlich jede einzelne Münze nachzeichnet, aber es ist kein Online-Spiel: Dwarf Fortress . Aber genau wie so viele Dinge, die es simuliert, nutzt es dieses Potenzial nicht wirklich aus.
Philipp
4
Ich muss beachten, dass mein echter Zehn-Pfund-Schein darauf HC40415464geschrieben ist, so dass es eindeutig von Vorteil ist, einen eindeutigen Ausweis zu haben, und dass es die Regierungen der realen Welt interessiert
Richard Tingle,
2
@RichardTingle, echte Banknoten haben Seriennummern, um zumindest eine gewisse Möglichkeit zur Nachverfolgung von Transaktionen zu bieten und Fälschungen zu erschweren (wenn Sie auf jeder Banknote dieselbe Nummer drucken, kann dies jemand bemerken). In einem Spiel werden jedoch alle Währungstransaktionen von einer zentralen Behörde überwacht und Fälschungen sind nicht möglich.
cjm
Ich liebe die Idee eines Spiels, das das Nachrüsten von Münzen ermöglicht. Es würde einen ganzen Markt nur für Zaubersprüche und Gegenstände geben, die sie entdecken könnten, und natürlich einen ganzen Gegenmarkt für "nicht nachweisbare" Fälschungen! Es besteht auch die Möglichkeit, eine "Where's Zork" -Website zu haben ...
Tim Holt,
3
Diese "richtige" Antwort ist falsch. Banken in der realen Welt investieren viel Geld in die Nachverfolgung einzelner Geldeinheiten.
Carl Smith
6

Nein, 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.

Josh
quelle
4

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.

pnewnan
quelle
2

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.

MarcClintDion
quelle