• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

24 Stunde Script

befubo

Mitglied
Hallo zusammen

Ich programmiere gerade ein auf MySQL und PHP basierendes Browsergame.
Bis jetzt konnte ich die meisten Probleme lösen, die so ein Projekt stellt. Jetzt bleib ich aber gerade iwie hängen:

Problem: Rohstoff Produktion

Das berechnen der Rohstofproduktion an sich ist leicht:

mysql abfrage: Stufe mine
mysql abfrage: Rohstoff für jeweilige Stufe

beides multiplizieren...
Das Problem:
Dieser vorgang muss sekündlich funktionieren und das auch, wenn der Spieler Offline ist.
Hab es zuerst mit timestamps versucht, ein und auslogzeiten miteinander verechnet...
Funktioniert logischerweise aber nicht, wenn sich der User nicht sauber ausloggt...

Auf meiner Google-Suche bin ich oft auf das Wort "cronejob" gestossen, und hab mich auch einmal bei einem Free-Cronejob angemeldet. Allerdings ist 5 min das kleinste und ich brauche aber sekündliches Aufrufen...

Meine verfügbaren Mittel:
Vollzugriff auf server, mysql datenbank, Kentnisse in PHP und MySQL.
Kann mir vieleicht jemand Helfen?
Danke und mfg

befubo
 
Werbung:
Wenn du die rechte dazu hast:
Bau dir eine Datei in PHP oder Perl die eine Laufzeit von unendlich hat und die jede Sekunde eine Funktion aufruft.

In PHP geht das so:
PHP:
<?
//Zeitlimit ausschalten
set_time_limit(0);
//Als erstes die Funktion aufrufen lassen 
cronfunktion();

//Funktion definieren
function cronfunktion(){
  //Hier kommt hin was gemacht werden soll
  
  //Schlafe 1 Sekunde und rufe dann die funktion erneut auf
  sleep(1);
  cronfunktion();
}
?>
Die Datei rufst du dann über die Shell mit dem Befehl:
php datei.php &
auf. Mit dem & wird der Prozess in den Hintergrund gestellt, sonst würde er immer abbrechen wenn du dich ausloggst aus der Shell.


Nicht getestet und auf eigene Verantwortung. Ein Cronjob der sekündlich ausgeführt wird kann den Server nämlich sehr belasten.
 
Hi seblon

Danke dir für die rasche Antwort. Das sieht ja schon ganz ordentlich aus. Jetzt kurz ne Frage: Shell???
Hab davon auch schon gelesen, bin aber nicht ganz draus gekommen...
mfg
befubo
 
Werbung:
@befubo

Du gehts an die Sache falsch ran du brauchst keine Sekunden abrechnung. Würde nur den Server unötig belasten und macht auch keinen sin.

Es hat schon seinen grund warum du bei den Free Cronjob nicht weniger als 5 min einstellen kannst.

Genauso ist es sinlos die Berechnung weiter zu führen wenn keiner Online ist.Wenn du jetzt schon mit den Rohstoffen anfangs so Serverlastige sachen zu machen dann wird der Server bald stehen wenn weitere Featuers dazu kommen oder sich die Spieler anzahl sich erhöt.

Spätersten dann wirste wieder alles umschreiben müssen.Daher lass es und mach es gleich vernüftig damit ersparst die viel Schreib Arbeit und jede menge Ärger.

Du mußt anfangen mehr wie ein Programmierer zu denken und nicht als ein Spieler. Momentan denkst du nur wie ein Spieler.

Mfg Splasch
 
nun, ich danke dir mal für die Antwort.
Kleine Frage:

Es is ja so, dass es mein erstes BG ist. Wenn ichs also nicht so machen kann/soll, währe ich froh, wenn du zu deiner Kritik (welche ich sehr gerne konstruktiv auffasse) einen Vorschlag machen kööntest, was ich für alternativen habe...

Danke
mfg

befubo
 
Dieser vorgang muss sekündlich funktionieren und das auch, wenn der Spieler Offline ist.
Hab es zuerst mit timestamps versucht, ein und auslogzeiten miteinander verechnet...
Funktioniert logischerweise aber nicht, wenn sich der User nicht sauber ausloggt...

Du könntest dieses Problem evtl damit umgehen, dass du ein Timeout erstellst, dann wird der Spieler nach einer bestimmten Zeit automatisch ausgeloggt. Nun könntest du einfach jedesmal wenn sich der Spieler neu einloggt die Rohstoffe berechnen.
 
Werbung:
Nein das funktioniert ganz anders.
Mathematik ist hier zu schon der richtige ansatz. Die Berechnung der Rohstoffe werden immer erst dann gemacht wenn ein Spieler auf der Seite klickt.

Das bedeudet für dich als Programmierer mußt du nur den Teil berechnen der vergangen ist.

Je nach Game gibst eine interwall wann neue Rohstoffe ankommen zb alle 15 min von jeder Einheit 10 mehr oder so je nach den wie bei Dir die Balanc ist.

Dazu brauchste nix anderes machen als dir einen Timestamp in der Db anlegen wann die letzte berechnung durchgeführt wurde für den Spieler.
Ist der Spieler nun länger offline gewessen und klick dann im Game oder log sich ein nach 2 std.

Dann mußte nur die differenz berechen. Also zuerst nachschauen wieviel Zeit vergangen. (Aktueller Timestamp - Alten Timestamp) Nun kannste anhang der vergangen Zeit die Rohstoffe berechnen die er dazu bekommt.

Am Schluss addiert du das zu den alten Rohstoffen dazu so hat der Spieler immer die aktuellen Rohstoffe.

Mfg Splasch
 
ok...
du meinst also, bei jeder aktion (formulareingabe, klick auf link usw...) wird ein Timestamp berechnet, welcher mit dem letzten verrechnet wird und anhand der diffenrenz eine Zahl in die DB einfüllt?
klingt so eig. recht logisch...
thx
 
Werbung:
Je nach dem wie dein Interwall für die Rohstoffe ist wenn das alle 15 min ist brauchst nur schauen ob die um sind wenn ja neu berechnen wenn nein alles beim alten lassen.

So kannst du später die Interwallen im Admin menü leicht verwalten und je nach Spiel geschwindikeit umstellen

Mfg Splasch
 
na ja, die Rohstoffe sollen ja laufend reinkommen... aber das ist so auch ok. timestamp rechnet ja mit sekunden und ich kann dann gleich festlegen, wieviel ress pro Sekunde geschickt werden soll...
 
Die Rohstoffe kommen ja laufend der Spieler bekommt die nur zugebucht wenn das interwall um ist.

Bring ja wenig wenn du ihm 0.5 pro Sekunde dazu buchst mit dem er nix anfangen kann. Bedenke das je Ausbau stuffe dann immer mehr dazu kommt und das du am ende dann nicht mit millarden großen zahlen handieren mußt

Überlege dir daher wieviele Rohstoffe man pro Ausbau stufe pro Interwall dazu bekommen soll.
Überprüfe dein Ergebniss in dem du die Rohstoffe für 24 Std berechnest je Ausbau stufe.

So bekommst du die Zahlen etwas in den Griff.

Mfg Splasch
 
Werbung:
OK. Ich danke euch allen.

Soweit so gut:
Ich würde hier gleich noch kurz ne andere Frage anhängen und mache nicht gleich wieder n neues Thema:


$abfrage = "SELECT user FROM db";
$ergebnis = mysql_query($abfrage);
while($row = mysql_fetch_object($ergebnis))
{
echo $row->user;
}


Diese Abfrage habe ich.
Ich der Spalte "db" sind einige Namen gespeichert.
die daten werden jetz tausgelesen und auch angezeigt. allerdings alles aneinander (also: befubobenialexheini)
aber ich möchte es gerne so:

befubo
beni
alex
heini

usw...

Wie stelle ich das an?
mfg
befubo
 
Hi!
Füge doch mit dem Namen noch einfach ein bisschen HTML-Code (in diesem Fall einen Zeilenumbruch) mit ein, z.B.:
PHP:
$abfrage = "SELECT user FROM db";
$ergebnis = mysql_query($abfrage);
while($row = mysql_fetch_object($ergebnis)) 
{ 
echo $row->user.'<br />'; 
}
LG nif7
 
Hey, danke. Jetzt noch n kleiner Zusatz:

PHP:
$abfrage = "SELECT user FROM db"; 
$ergebnis = mysql_query($abfrage); 
while($row = mysql_fetch_object($ergebnis)) 
{ 
$user = $row->user; 
}

dieses Script speichert ja jetzt den eintrag in einer variable. Ich möchte jetzt jeden Eintrag als Variable speichern (also, dass der eintrag "befubo" nacher als $befubo vorliegt...

Geht das?
THX
 
Werbung:
Ich würde in dem Fall nicht jeden Namen als eigene Variable speichern, sondern einen Array verwenden (dazu sind sie schließlich da):
PHP:
$user = Array();
$abfrage = "SELECT user FROM db"; 
$ergebnis = mysql_query($abfrage); 
while($row = mysql_fetch_object($ergebnis)) 
{ 
    $user[] = $row->user; 
}

foreach ($user as $index => $name) {
    echo $name.'<br />';
}

LG nif7
 
Zurück
Oben