# Programmiere Browsergame mit Java, brauche Hilfe -> Produktion in Betrieben



## Andron (19. Februar 2007)

Hallo,
ich habe vor kurzem angefangen ein Online Spiel für mich zu programmieren, als kleines Hobby.
Ein Problem kann ich aber nicht so ganz lösen:
Ein Spieler besitzt mehrere Gebäude, die eins oder mehrere Produkte produzieren. Die Produktionszeiten sind auch vom Produkt zum Produkt unterschiedlich. Wie kann ich das am besten realisieren?
Ich hatte bis jetzt an zwei Ansätze gedacht:
1. Ein Thread für alle Spieler. Der muss dann aber immer laufen und ständig die Zeiten in Betrieben überprüfen, ob etwas produziert wurde oder nicht. Das kann unter Umständen auch etwas länger dauern.
2. Ein Thread pro Spieler. Diese Lösung scheint mir besser zu sein, aber nach 100 Spieler habe ich dann 100 Threads laufen. Und was, wenn sich 1000 Spieler anmelden?

Vielleicht fällt jemandem etwas besseres ein. 
Danke.


----------



## big_boom_bang (20. Februar 2007)

Hallo, eine kleine Frage zur besseren Verständlichkeit:
Das Spiel soll auf einem Server laufen oder soll das ein Applet sein
Wenn es ein Applet ist, hast du mit deinem Server ja keine probleme mit den Threads.

MfG bigboombang


----------



## Andron (20. Februar 2007)

Das Spiel sollte auf einem Server laufen.


----------



## Thomas Darimont (20. Februar 2007)

Hallo,

also ich denke das kannst du sogar mit einem Thread für alle Spieler machen.
Wenn das ganze als Webanwendung entworfen werden soll könnte man das ganze
wie folgt aufziehen (für die Produktionslogik).

Man hat eine Art Tabelle in der die Informationen abgelegt sind, welches Gebäude
welche Produkte in welcher Zeit zu welchen Kosten erzeugen können.
Will der Spieler nun ein in Auftrag geben (der Spieler trägt diese Information beispielsweise in ein 
HTML Formular ein/klickt auf ein Icon und drückt submit),
so wird die Zeit der Anfrage vermerkt, die benötigten Resourcen brerechnet und bei ausreichender
Menge vom entsprechenden Konto abgezogen, dann wird die Produktion als gestartet markiert.
Ruft der Spieler nun die Ergebnisseite auf (manuell oder automatisch etwa durch einen automatischen Page Refresh) so wird ein neuer Request an den Server gesendet.
In diesem Request werden nun die betrachteten Produktionsstätten nach den Produktionsergebnissen befragt.
Dabei wird einfach die Zeitdifferenz zwischen Produktionsstart und dem Empfangszeitpunkt des 
aktuellen Requests (System.currentTimeMillis()) durch die Anzahl der notwendigen Zeiteinheiten pro
Produkt geteilt. Ist der Quotient > 1, so ist die Produktion (in der entsprechenden Produktionsstätte) abgeschlossen und wird als frei markiert. 

Bei diesem Ansatz erfolgt die Aktualisierung der Produktionsinformationen eines Spielers Just-In-Time, sprich die Werte werden erst dann Berechnet wenn sie auch wirklich benötigt werden. Das ist natürlich nicht für alle Daten sinnvoll. Umfangreiche und komplizierte Statistiken sollte man in einem Rutsch über alle Daten als Batch Job laufen lassen.

Gruß Tom


----------



## Andron (20. Februar 2007)

Danke für die Tipps.

Ich habe an folgendes Szenario gedacht:

Jedes Gebäude kann mehrere Produkte gleichzeitig herstellen. Der Spieler kann die Verhältnisse der Produkte ändern.
Ein Gebäude A hat 100% Ausbringungsmenge und produziert genau 16 Stunden pro Tag.
In diesem Gebäude können bis zu 4 verschiedene Produkte hergestellt werden, wobei:
Produkt 1 braucht 20min. pro Stück - 48 Stück bei 100% in 16h
Produkt 2 braucht 30min. pro Stück - 32 Stück bei 100% in 16h
Produkt 3 braucht 4stunden pro Stück - 4 Stück bei 100% in 16h
Produkt 4 braucht 8stunden pro Stück. - 2 Stück bei 100% in 16h

Nun kann der Spieler sich entscheiden, wie er die Last verteilen möchte.
Würde er je Produkt 25% einstellen, so hätte er nach 16 Stunden:
Produkt 1: 12 Stück
Produkt 2: 8 Stück
Produkt 3: 1 Stück
Produkt 4: wäre nur zu 25% fertig.

Der Spieler hat jede Zeit die Möglichkeit die produktion abzubrechen und die Verteilung neu einstellen, alle nicht fertige Produktionen wären dann weg.
Wenn er die Produktion nicht abbricht, so läuft die am nächsten Tag weiter mit vorherigen Einstellungen.


Oder meint ihr, das ist zu kompliziert? Ich möchte halt etwas, was noch nicht gibt und dem Spieler viele Möglichkeiten offen lässt.
Vielleicht habt ihr auch andere Vorschläge?


----------



## Andron (22. Februar 2007)

hat niemand eine Idee oder ein Tipp?


----------

