Wert um x steigen lassen. php mysql

Godstyle

Erfahrenes Mitglied
Hallo,

ich bräuchte mal einen denk - lösungs ansatz.

Also ich bin auf der Suche nach einem Script (nein ihr sollt es mir nicht suchen ;) ).

Ihr kennt sicher browsergames, wo man Dinge bauen muss, ogame ds etc.

Nun wollte ich mal wissen, wie die es machen, dass die Rohstoffe nach höhe der ausbaustufe des Gebäudes dazu berechnet werden und wie es machbar ist, das dies auch funktioniert, wenn man offline ist.

Also die frage genau lautet:

Wie kann ich einen wert, der in einer db steht um einen Wert X die sekunde steigen lassen bis der Wert einen Festgesetzten Wert erreicht hat.


lg
 
Das könnte man so machen:

Tabellenstruktur in der Datenbank:

Gebäude:
ID | Name | Grundwert | Faktor pro level

Benutzer_Gebäude:
User_ID | Gebäude_ID | Level | Ressource_Anzahl

Dann einen Cronjob, der bspw. alle 10 Sek. läuft. Der ruft ein Script auf, was in der Datenbank eine Aktualisierung vornimmt nach diesem Schema:

UPDATE Benutzer_Gebäude SET Resource_Anzahl = Resource_Anzahl + (Grundwert + (Grundwert * Level / Faktor_pro_level ))

So oder so ähnlich ;-)
 
ok, ich weiß in etwa wie du es meinst, wäre eine herrausforderung es mal zu versuchen, werde mich morgen abend dran setzen, wenn jmd eine andere idee dazu hat, wäre ich auch für diese dankbar.

Werde alle die für mich logisch klingen versuchen umzusetzen und dann mal sehen mit welcher es am besten klappt.

Nur denke ich das es einfacher gehen muss, wenn ich mir die browsergames ansehe und mir vorstelle das da die ganze zeit ein script für alle dörfer/planeten/etc die updates vornimmt, müsste das system doch direkt anfangen zu hängen.

Dachte selbst an ein timestemp den ich setze wenn ich mit dem dorf/planten etwas mache oder ihn verlasse. beim nächsten zugriff ruft er diesen ab und berechnet die zeit die vergangen ist, das ganze in sek* faktor.

Würde in der theorie auch super klappen, nur da ist das problem, das ein gebäude in der zeit fertig werden kann wenn der user nicht am rechner ist. Dieses würde den faktor während der laufzeit ändern.

Was mich zu der idee bringt.

Das ich endtimestamp des auftrages dazwischen setze sprich:

if isset timestamp gebäude

timestamp (letzte aktion) bis Timestamp gebäude zeitdazwischen in sek * faktor 1
+
Timestamp gebäude bis jetzt zeit dazwischen in sek * fakter2

else
timestamp (letzte aktion) bis jetzt zeit dazwischen in sek * fakter1




könnte das so klappen?
Ich meine es würde den server doch erheblich entlasten oder sagen die profis unter euch direkt, das die idee nicht klappen kann?
 
In der Regel wird das aber nicht durch Cronjobs erledigt, sondern diese Werte werden nur scheinbar in deiner Abwesenheit weiter erhöht. Die Lösung ist recht leicht: die Werte werden erhöht, wenn du sie wieder abrufst, weil du dich wieder angemeldet hast. Dann sieht es so aus, als wären die Werte in deiner Abwesenheit weiter erhöht wurden.

EDIT: Ja, so ist das, wenn man den letzten Beitrag nicht ließt. Aber ich würde das Problem ebenfalls so lösen: Zeitpunkt, zu dem das Gebäude fertig gestellt wird, und wenn du dann wieder das Spiel aufrufst, dann wird ein neuer Datensatz eingefügt, welcher die Differenz ausgleicht.
 
Zuletzt bearbeitet:
also war mein gedanke gar nicht so dumm wie ich erst dachte, sondern im grunde eine richtige lösung für das problem?
 
Hey,

so ich saß eine ganze weile dran und bin derzeit bei folgendem ergebniss:

PHP:
<?php
include("db.php");

$sql = "SELECT town_id, holz, eisen, stein, lehm, mana, time  FROM village WHERE town_id = '".$_GET['town_id']."' ";
$result = mysql_query($sql) OR die(mysql_error()." => ".mysql_errno());
$rows = mysql_fetch_assoc($result); {
$timestamp_db = $rows['time'];
$holz = $rows['holz'];
$eisen = $rows['eisen'];
$stein = $rows['stein'];
$lehm = $rows['lehm'];
$mana = $rows['mana'];

mysql_close();
}
$sql2 = "SELECT town_id, holzfaeller, eisenmiene, steinbruch, lehmgrube, magiergilde FROM village_stufe WHERE town_id = '".$_GET['town_id']."' ";
$result2 = mysql_query($sql2) OR die(mysql_error()." => ".mysql_errno());
$rows2 = mysql_fetch_assoc($result2);{
$holzst = $rows2['holzfaeller'];
$eisenst = $rows2['eisenmiene'];
$steinst = $rows2['steinbruch'];
$lehmst = $rows2['lehmgrube'];
$manast = $rows2['magiergilde'];

mysql_close();
}
$sql3 = "SELECT id, holz FROM produktion WHERE holz = '$holzst' ";
$result3 = mysql_query($sql3) OR die(mysql_error()." => ".mysql_errno());
$rows3 = mysql_fetch_assoc($result3);{

$wert_holz = $rows3['holz'];
}
$sql4 = "SELECT id, eisen FROM produktion WHERE eisen = '$eisenst' ";
$result4 = mysql_query($sql4) OR die(mysql_error()." => ".mysql_errno());
$rows4 = mysql_fetch_assoc($result4);{

$wert_eisen = $rows4['eisen'];
}
$sql5 = "SELECT id, stein FROM produktion WHERE stein = '$steins' ";
$result5 = mysql_query($sql5) OR die(mysql_error()." => ".mysql_errno());
$rows5 = mysql_fetch_assoc($result5);{

$wert_stein = $rows5['stein'];
}
$sql6 = "SELECT id, lehm FROM produktion WHERE lehm = '$lehmnst' ";
$result6 = mysql_query($sql6) OR die(mysql_error()." => ".mysql_errno());
$rows6 = mysql_fetch_assoc($result6);{

$wert_lehm = $rows6['lehm'];
}
$sql7 = "SELECT id, mana FROM produktion WHERE mana = '$manast' ";
$result7 = mysql_query($sql7) OR die(mysql_error()." => ".mysql_errno());
$rows7 = mysql_fetch_assoc($result7);{

$wert_mana = $rows7['mana'];
}
mysql_close();

$timestamp = time(); // $timestamp ist die aktuelle Serverzeit in sek gespeichert
$diff_zeit = $timestamp - $timestamp_db ;  // ermittelt die vergangene zeit in sek


$holz_neu = $holz + (diff_zeit * wert_holz);
$eisen_neu = $eisen + (diff_zeit * wert_eisen);
$stein_neu = $stein + (diff_zeit * wert_stein);
$lehm_neu = $lehm + (diff_zeit * wert_lehm);
$mana_neu = $mana + (diff_zeit * wert_mana);


 mysql_query("UPDATE village SET holz = '$holz_neu', eisen = '$eisen_neu', stein = '$stein_neu', lehm = '$lehm_neu', mana = '$mana_neu',  time = '$timestamp'  
 			  WHERE holz = '$holz', eisen = '$eisen', stein = '$stein', lehm = '$lehm', mana = '$mana', time = '$timestamp_db'") 
			  OR die(mysql_error()); 
 
 
 mysql_close();


?>


ok ist alles andere als schön, jetzt sollte ich es noch in ein array packen, damit die abfrage nicht zu lang wird, nur array und ich sind totfeinde.
Hat evt jmd ein tut, wo selbst dumme leute wie ich es verstehen?

lg
 
Zurück