Timestamp und werte in DB

Volki91

Mitglied
Hallo,

ich habe einige fragen.
Ich will so ein ganz kleines Browsergame machen...:)
Einen Login hab ich schon fertig gemacht.
Ich habe nur "Gold" als "Rohstoff/ Geld" sozusagen.
Ich habe auch schon gemacht, dass jeder User seinen eigenen Goldstand sieht.

Meine Frage ist jetzt.

Ich will so eine einzige "Mine" machen, die dann mein Gold produziert.
Ich weis bloß nicht, 1. Wie ich das mit den Sekunden genau mache.
Also den code dazu kann ich nicht realisieren...
Ich weis nur das ich den Timestamp in die DB eintragen muss(ich weis nicht ob ich eine eigene tabelle machen muss), dann die aktuelle zeit - die zeit aus der db...
meine db heißt 'pbmbp' und tabelle users -> gold

Und dann weis ich garnicht, wie ich das mit der Goldmine machen soll.
Weil Goldmine Stufe 0 produziert 20 Gold pro stunde und um das auf stufe eins zu machen benötigt man 5 Gold...
Stufe 1 produziert 30 Gold pro stunde und kostet 10 gold
Stufe 2 produziert 50 Gold pro stunde und kostet 20 gold

wie mach ich das?


Auf eine antwort würde ich mich sehr sehr freuen

Dankeschön

MFG, Volkan
 
Weil du noch keine Antwort bekommen hast,
eine ganz einfache Lösung für dich:
Du fügst ne Spalte an "Users" an und zwar: last_visit

Jedes Mal, wenn ein User die Seite aufruft, kannst du dann gucken wie viel Zeit zwischen "Aktuellem Timestamp" und "Last_Visit" liegt, und dem entsprechend viel Geld/Gold oder sonstige Werte dazurechnen.

PHP:
<?php
       $last_visit=db_select.......
       $timestamp=time();

       $verstrichene_zeit = $timestamp - $last-visit; 

       $wert = $wert + $verstrichene_zeit; 
       
?>


Am Ende des Skriptes trägst du bei last_visit den aktuellen Timestamp ein.
 
Hay dankeschön für deine Antwort, aber^^

PHP:
<?php 
       $last_visit=db_select....... 
       $timestamp=time(); 

       $verstrichene_zeit = $timestamp - $last-visit;  

       $wert = $wert + $verstrichene_zeit;  
        
?>

$last_visit=db_select..... was soll da denn hin? ich hab keine ahnung davon ^^

Danke, MfG

Edit: Und wenn ich will dass es 10 mehr wird muss ich $wert = $wert + $verstirchene_zeit + 10; machen richtig?^^

Weil ich will jetzt diese Goldmien machen, weis aber immernoch nicht wie ich das mache mit den Kosten, ich will ja nicht für jeede stufe immer einen preis und produktionsmenge schreiben XD
 
Zuletzt bearbeitet:
Mit $last_visit=db_select..... ist eine Datenbank Abfrage gemeint.

PHP:
$last_visit = mysql_query("SELECT last_visit FROM users WHERE uid = '". $user_id ."'");

Ich geb dir aber einen Tipp. Solltest erstmal noch ein bischen PHP & MySQL lernen bevor du dich an ein Browsergame wagst.

Zum errechnen von Gold kannst du dir eine Funktion schreiben. Dann brauchst du nicht für jede Stufe eine Produktionsmenge usw. schreiben.

PHP:
function setGold($stufe){
	$menge = $stufe * 0.45*3600; // wenn deine Goldmine auf Stufe 2 ist ergibt das 3240 Gold pro Stunde. 
        return $menge;
}

Aber nehm meinen Tipp trotzdem war.

Mfg
 
Es hat fast geklappt ^^

Bei mir gibt er aber irgendwie den Timestamp + das was pro sekunde dazukommen soll^^

ich hab gerade irgendwas mit 12000000000 gold XD

Hier der gesamte code...

PHP:
<?php
require("include/connect.inc.php");
$userid = $_SESSION['id'];  

// Timestamp wird in DB gespeichert
 $timestamp = time(); 
 $timeupdate = "UPDATE users SET last_activity = $timestamp WHERE id = '". $userid ."'";
 $timeupdate_ok = mysql_query($timeupdate);

// Letzte Aktivität Abrufen
 $last_activity_abfrage = "SELECT last_activity FROM users WHERE id = '". $userid ."'";
 $last_activity_ergebnis = mysql_query($last_activity_abfrage);
 if($row = mysql_fetch_assoc($last_activity_ergebnis))
   {
     $last_activity = $row->last_activity;
   }

// Berechnung der Zeit für Rohstoffe
 $verstrichene_zeit =  $timestamp - $last_activity;
 $gold_up = $gold_up + $verstrichene_zeit;  

// Gold speichern
 $gold_update = "UPDATE users SET gold = $gold_up WHERE id = '". $userid ."'";
 $gold_update_ok = mysql_query($gold_update);


//$gebaeudeabfrage = "SELECT goldmine FROM gebaeude WHERE id = '". $userid ."'"; 
//function setGold($goldmine){
// $gold = $goldmine * 0.45*999999;
//        return $gold;
//}  

?>

ist bisschen durcheinander sry^^
 
Wie meinst du das?!

last_acitivity steht zurzeit auf 12000000000 nochwas so ähnliche zahl, ich hab dann Gold auf 0 Gesetzt und dann aktualisiert auf der page, da hat ich wieder gold 12000000000 ...

Ich will ja nur das immer die vergangenen sekunden einen wert höher machen und nicht timestamp + verganenezeit alls Gold haben^^


MfG

thx
 
PHP:
if($row = mysql_fetch_assoc($last_activity_ergebnis)) 
   { 
     $last_activity = $row->last_activity; 
   }

Da müsste der Fehler liegen, du greifst auf das Array zu als wenn du es vorher mit mysql_fetch_object "initialisiert" hast, aber du hast mysql_fetch_assoc "initialisiert", also darfst du nicht mit

PHP:
$last_activity = $row->last_activity;

sondern mit

PHP:
$last_activity = $row['last_activity'];

Und noch sowas:
Bei mir ist es so, dass ich in der Datenbank stehen habe, was ein Gebäude auf Stufe 1 produziert, also einen Grundwert. Zusammen mit der Stufe des Gebäudes kann ich dann berechnen was das Gebäude im moment produziert. Kannst du machen wie du willst, multiplizieren oder dividieren oder was weiß ich.

Außerdem ist es bei mir so, dass der Grundwert die Produktion pro Stunde angibt und ich somit das ganze noch mit /3600 auf Sekunden runterrechne.

Und mit deiner LastActivity wirst du ein Problem bekommen, wenn Gebäude auch fertiggestellt werden können, auch wenn der Spieler offline ist, so würde beim nächsten mal aktualisieren der Spieler zuviel bekommen, da ja die aktuelle Stufe des Gebäudes benutzt wird. Theoretisch müsstest du erstmal schauen wann das Gebäude fertig wurde und dann von LastActivity bis zur Fertigstellung des Gebäudes mit der Aktuellen Stufe minus 1 rechnen und von der Fertigstellung des Gebäudes bis jetzt mit der aktuellen Stufe.

So ist vielleicht ein wenig kompliziert geschrieben, aber kannst dich ja mal versuchen dadurch zu schlängeln.

Außerdem würde ich dir auch den Tip geben, dir nochmal ein bisschen PHP und MySQL anzuschauen, bevor du dich an so ein umfangreiches Projekt wie ein Browsergame zu machen, auch wenn es ein kleines sein soll, es steckt eine Menge Arbeit dahinter
 
Ok danke ich habe es jetzt mit "mysql_fetch_object" // $row->last_acitivity gemacht,
jetzt steht überall der Goldstand und zwar 0. Und es passiert nichts, also es wird auch nicht um 1 pro sekunde erhöht. Deine Idee mit den Minen ist supii :D danke dir.

Hier nochmal mein neuer Code:
PHP:
<?php
require("include/connect.inc.php");
$userid = $_SESSION['id'];  

// Timestamp wird in DB gespeichert
 $timestamp = time(); 
 $timeupdate = "UPDATE users SET last_activity = $timestamp WHERE id = '". $userid ."'";
 $timeupdate_ok = mysql_query($timeupdate);

// Letzte Aktivität Abrufen
 $last_activity_abfrage = "SELECT last_activity FROM users WHERE id = '". $userid ."'";
 $last_activity_ergebnis = mysql_query($last_activity_abfrage);
 if($row = mysql_fetch_object($last_activity_ergebnis))
   {
	$last_activity = $row->last_activity; 
   }

// Berechnung der Zeit für Rohstoffe
$timestamp = time();
 $verstrichene_zeit =  $timestamp - $last_activity;
 $gold_up = $gold_up + $verstrichene_zeit;  

// Gold speichern
 $gold_update = "UPDATE users SET gold = $gold_up WHERE id = '". $userid ."'";
 $gold_update_ok = mysql_query($gold_update);


// FUNKTION FÜR MINE
//$gebaeudeabfrage = "SELECT goldmine FROM gebaeude WHERE id = '". $userid ."'"; 
//function setGold($goldmine){
// $gold = $goldmine * 0.45*999999;
//        return $gold;
//}  

?>

Danke^^..
Ja klar ich lern ja dabei, hab vielen von sowas gelernt^^.

EDIT: Ich arbeite gerade mal 3-4 Wochen mit PHP ^^
 
Zuletzt bearbeitet:
Bei deinem Update des Goldes würde ich nicht

PHP:
$gold_update = "UPDATE users SET gold = $gold_up WHERE id = '". $userid ."'";

sondern

PHP:
$gold_update = "UPDATE users SET gold = gold + "'.$gold_up.'" WHERE id = '". $userid ."'";

machen, da du die aktuelle Goldmenge ja auch noch berücksichtigen musst.

Nun hast du noch ein Problem, nämlich das deine Goldmine pro Sekunde zum Beispiel 0.756565665 Gold produziert, du allerdings nur mit Ganzzahlen rechnest? (Weiß ja nicht wie deine Datenbankstrucktur aussieht)

Ich löse das so, indem ich die Stellen nach dem Komma abschneide und seperat in der Datenbank speichere und beim nächsten berechnen das ganze wieder mit einberechne, so nähere ich mich langsam der 1.

Außerdem solltest du noch irgendwie überprüfen ob sich überhaupt etwas ändern, wenn sich nämlich nichts ändert, brauchst du auch keinen UPDATE an die Datenbank schicken und sparst dir so Ressourcen, da du ja bedenken musst, dass z.B. später mal 10.000 User gleichzeitig wissen wollen wieviel Gold sie haben und es muss sich ja auch bei jedem User steigern.
 
Zurück