Mathe für Fortgeschrittene
#1
Also ich zähle mich ja eigendlich nicht zu den mathemathischen Volldeppen, aber trotzdem will ich auf Nummer sicher gehen.

System : Punkte pro Stunde mit Gesamtkonto
Ganz einfach eigendlich ... pro Stunde soll der User der Webseite eine bestimmt Anzahl an Punkten auf ein Konto gutgeschrieben bekommen.

Rechnung :
Code:
if(Time()>($zuletztbesucht+3600)){
    $a=Time()-$zuletztbesucht;
    $a2=$a/3600;
    $z=0;
    while($z<$a2){
        $z++;
    }
    $z=$z-1;
    $b1=3600*$z;
    $sub=$a-$b1;
    $neuerpunktestand=($z*$punkteprostunde)+$alterpunktestand;
}
$zuletztbesucht : Hier ist der Timestamp vom letzten Seitenaufruf bzw. Besuch.
Alle Variablennamen wurden von mir anders benannt ums euch leichter zu amchen das ganze zu verstehen... nicht das jetzt wieder jemand sagt das man so doch bitte keine variablen benennt Wink

Danke schoma vorab
Futjikato
  Zitieren
#2
http://www.php.net/floor könntest sicher gut gebrauchen Wink

Was schreibst dann wieder in $zuletztbesucht rein? Aktuellen Timestamp - $sub? (Weil was is sonst wenn einer genau nach 1:59 raufschaut - dann kriegt er nur für eine Stunde Punkte und die restlichen 59 Minuten verfallen)
  Zitieren
#3
Wieso machste dir das so kompliziert.

zähl doch die Sekunden die er auf der Seite verweilt Teil diese durch 60 und du erhällst die Punkte Pro Std die der User bekommt.
  Zitieren
#4
@ Kingo :
Er soll die Punkte ja auch in abwesenheit bekommen Wink

@ Kicked :
ja ok das floor ersetzt mein while schleifen kram ganz gut Big Grin
Aber jo als $zuletztbesucht wird Time()-$sub gespeichert... denn das mit den 1:59h ist mir auch aufgefallen.

Aber wenn das ( von der rechenart her ) so funktioniert denn bin ich ja zufrieden Wink
Danke an alle

Neuer Code :
Code:
if(Time()>($zuletztbesucht+3600)){
  $a=Time()-$zuletztbesucht;
  $a2=$a/3600;
  $z=floor($a2);
  $b1=3600*$z;
  $sub=$a-$b1;
  $NeuerPunktestand=($z*$PunkteproStunde)+$alterpunktestand;
  $zuletztbesucht=Time()-$sub ;
}
  Zitieren
#5
Jo dürfte gut passen. Ich würd zwar speichern, wann er das nächste mal Punkte bekommt. Dadurch erspar ich mir bei jedem aufruf, dass er +3600 rechnen muss und hab des nur einmal. Aber das ist wohl außer bei Hochperformanceanwendungen außer Acht zu lassen Wink

$sub könntest aber auch noch schöner Berechnen. Musst net wieder 3600*z rechnen und des dann abziehn, sondern einfach [code=php]$sub=$a%3600;[/code].
Nennt sich Modulo und liefert den Rest zurück.

Schön würd des dann so aussehn:

[code=php]
if(Time()>$getpoints){
$a=Time()-$getpoints;
$z=ceil($a/3600);
$sub=$a%3600;
$NeuerPunktestand=($z*$PunkteproStunde)+$alterpunktestand;
$getpoints=Time()-$sub+3600 ;
}
[/code]
So hoffentlich jetzt net vertan Wink

edit:
bzw ganz kurz halt Wink

[code=php]
$time=Time();
if($time>$time_get_next_points){
$difference=$time-$time_get_next_points;
$new_points=(ceil($difference/3600)*$points_per_hour)+$old_points;
$getpoints=$time-($difference%3600)+3600 ;
}
[/code]
Richtig schön wär jetzt noch die 3600 durch ne konstante zu ersetzen Wink

Problem seh ich nur wenn derjenige länger net online is bleiben seine Punkte hängen, sprich in ner Übersicht würden imma nur die Punkte vom letzten Login angezeigt werden. Würd eher ein Script per CronJob (oder notfalls au im Skript abfragen- musst dann aba wieder aufpassen das net mehrere stunden keiner oben war) laufen lassen, dass bei jedem User stündlich die Punkte erhöht.

Würd dann halt mit MySQL sehr schön gehn mit einem einzigen Befehl der alle User aktualisiert.

[code=php]UPDATE users SET points = points + 1000[/code]
  Zitieren
#6
Ja also das mit dem CronJob hatte ich mir auch überlegt. Da ich aber mit den Dingern noch nie gearbeitet war mir das zu aufwenidig.
Na ja aber schöner wäre es wegen der Übersicht, da hast natürlich recht.

Hmm na ja kanns ja noch immer überarbeiten wenn allent fertig is Wink
( Wer es noch net erraten hat dem sei gesagt das dies hier ja für das Browsergame ist das ch mit 2 Leutz mache und da Fehlt noch einiges )

Danke nochma für all eure Hinweise Smile
  Zitieren
#7
Browsergame arbeite lieber mit einen Cronjob Wink

Wenn das sehr viele Leute werden leidet die Performence des Servers erheblich brauchst ja nur in deinen Webinterface auf Crons und dan einen Befehl eingeben wie man unter Linux was ausführen tut. mehr nicht dan eingeben in welchen abständen und fertig.
  Zitieren
#8
Ja klar ... das hier kann nur als Übergangslösung benutzt werden.
Wenn wir das später mit einem Cronjob machen müssen wir eh alles ändern.
Ich kann schlecht ne for-schleife machen und denn eben mal bei allen den punktgewinn ( der ja individuell ist ) auslesen und dann das konto auffüllen.
Das würde dann bei ca. 500 Leuten echt probleme geben Wink
  Zitieren
#9
Wieso for Schleife?

Den Wert, wer wieviele Punkte pro Stunde bekommt stehn doch sicher auch in der Datenbank.

Wenns der gleiche Eintrag ist ganz einfach.

UPDATE users SET points = points + (100*multiplikator)

Falls es wo anderst steht kannst es immer noch mit an Subselect oder Join machen. Musst halt sagen wie du es brauchst Wink
  Zitieren
#10
Hat sich erledigt
  Zitieren


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 2 Gast/Gäste