Browserspiel

Eroli

Erfahrenes Mitglied
Hallo,

ich möchte gerne ein kleines Browserspiel programmieren.
Dabei wollte ich zuerst am Anfang(also beim Serverstart oder so - unabhängig von den Seitenaufrufen) ein Array des Objekts Player erstellen.

Also
C#:
Player[] Player = new Player[long.MaxValue];
Damit auch möglichst viele mitspielen können.

Würdet ihr die Spieler als Objekte anlegen oder einfach nur so mit nakten Werten hantieren?
Ich denke Objekte sind praktischer. Später kriegen die Spieler ja auch noch andere Sachen zugewiesen ich denke auch dort daran, Objekte zu verwenden.

So, dieses Player-Array soll nun aber nur ein einziges mal erstellt werden. Wie mache ich sowas?
 
das mit dem Array würde ich bevorzugen:

1. Du erstellst eine Klasse Player

2. Du definierst Eigenschaften (Methoden wirst du da eigentlich kaum brauchen, eigentlich nur einen Konstruktor und vielleicht ein paar Statische)

3. Wenn der Spieler einen neuen Wert bekommen soll, dann fügst du ihn einfach zur Klasse hinzu.


Du willst das Player Array nur einmal erstellen
Welche Sprache verwendest du denn? Bei PHP kann ich das verstehen, aber dafür gibts ja ein eigenes Forum. Normalerweise definierst du einmal das Array und fertig.

Kleiner Tipp: Nehme nicht long.MaxValue sondern erstelle dir eine eigene Variable (da kannst du long nehmen) die die Aktuell gespeicherte Spielerzahl speichert, und verwende die Variable für das Array
 
Hi

Ein Array per Default mit der Länge von Max-Int64 :eek:
Ich nehme mal an, dass Player ein von dir geschriebene Klasse ist.
Nehmen wir mal an, diese Klasse hat 2 Propertys (Name, Email).
Allein dafür würdest du 9.223.372.036.854.775.807 x 3 Bytes beim Start reservieren, ohne je zu wissen, ob du sie brauchen wirst. Dabei sind die Daten, die ein Player eingibt für Name und Email noch nicht mal enthalten.
Ist nicht grad speicherschoned oder? ;-]

Besser ist, wenn du eine Collection nutzt, bei der du nach bedarf die Player-Instanzen hinzufügen und wieder entfernen kannst.
Beispiel dafür wären List<>, ArrayList, ggf. auch Dictionary

Zu deiner Frage bzgl. den Objekten.
Natürlich solltest du Instanzen deiner Klasse nutzen. Das herumjonglieren von einzelnen Namen würde dir sonst irgendwann das Genick brechen.
Vorallem da die Daten ja sicherlich auch persistent abgelegt werden sollen oder?!
 
Danke für die Antworten.
Welche Sprache verwendest du denn?
ASP.NET / C#

Ist nicht grad speicherschoned oder?
stimmt, deine Lösung mit den Lists ist mir noch gar nicht eingefallen, gefällt mir aber sehr gut.

Vorallem da die Daten ja sicherlich auch persistent abgelegt werden sollen oder?!
Jo, dazu wollte ich die Klasse serialisieren und in meiner SQL-Datenbank ablegen (in einem binären Feld)


Wie kann ich denn nun erreichen, dass diese Player-"List" nur einmal erstellt wird?
Weil ich darf die Liste ja nur einmal erstellen und immer wenn sich ein neuer Nutzer anmeldet, wird ein Add ausgeführt...

Ein Nachteil der mir eben aufgefallen ist, ist, dass bei einem Servercrash/Neustart alle Daten weg sind?! Gibts da auch irgendwie abhilfe?
Kann man die ganze Liste zum Beispiel auf HDD oder SQL Server speichern?
 
Zuletzt bearbeitet:
Also wenn du eine ArrayList nimmst, gibt es eine Funktion Add.

Du nennst deine ArrayList z.B. Players, und legst sie für alle Spieler an (keine Ahnung wie das geht aber es müssen alle Clients die gleiche Instanz der ArrayList verwenden).
Wenn sich ein neuer Spieler anmeldet, dann Speicherst du die Daten in der Datenbank und gibst ihm zusätzlich ebenfalls diese ArrayList. Dann führst du noch
Code:
Players.Add([Der Spieler]);
aus.

Das mit dem Servercrash stimmt, aber wenn du die Daten nicht nur im Ram ablegst, sondern wie du schon gesagt hast in einer Datenbank (ich lege mir dafür einfach einen Odner an, den ich Players nennen würde und da wären dann für jeden Spieler eine Datei drin, z.B. Eroli.brg; die endung kannst du natürlich auch selber wählen)
 
Das eine ArrayList sowas bietet war mir schon klar :)
So Newby bin ich nun auch nicht ;)


Mein Problem liegt zur Zeit hier:
([...]aber es müssen alle Clients die gleiche Instanz der ArrayList verwenden).

Außerdem darf diese ArrayList auch nur EINMAL (beim Start des Servers :confused: ) angelegt werden.
Wie mache ich das?
 
da kann ich dir auch nicht helfen, ich ´hab nicht so viel Ahnung von Netzwerkprogrammierung.

Aber wahrscheinlich einfach die ArrayList im Server Definieren, und dann darauf vom Client zugreifen (wie das geht weiss ich wirklich nicht)
 
Hmm, ich glaube das geht gar nicht Oo

Wahrscheinlich werde ich eine Starthilfe brauchen, also werde ich mir vllt ein kleines Programm schreiben, dass diese Objekte anlegt und dann serialisiert als Byte-Array auf der Festplatte speichert.
Von da an müsste ich wieder mit meiner ursprünglichen Webanwendung weitermachen können - hoffe ich...
 
Hi

Wie kann ich denn nun erreichen, dass diese Player-"List" nur einmal erstellt wird?
Nur einmal den Konstruktor aufrufen ;) :D
Im Ernst:
Normalerweise solltest du min. 1 Klasse haben, die sich um die Verwaltung deine Spiels kümmert. In der instanzierst du die Liste und arbeitest mit dieser weiter. Meldet sich ein neuer Spieler an, fügst du ihn der Liste hinzu, meldet sich ein Spieler ab, kriegt ein Session-Timeout was auch immer, entfernst du ihn aus der Liste.

Von Dateien für jeden User würde ich abraten. Das FileSystem ist für sowas zu langsam. Der Ansatz mit der Serialisierung in eine DB ist da schon der richtige.
 
Danke für die Antwort.

Okay, dann mache ich das halt mit Serialisierung und DB.

Aber wierufe ich den Konstruktor denn nur einmal auf?
Bei welchem Ereigniss? Muss ja eins sein, dass AUF JEDEN FALL NUR EINMAL(BEIM SERVERSTART ODER SO) auftritt.
Oder stehe ich gerade irgendwie auf dem Schlauch?



Eroli
 
Zurück