Onlinegame: Gebäude ausbauen

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Onlinegame: Gebäude ausbauen

    Hallo.
    Ich bastle gerade an einer Art Skript, das einem User erlaubt, sein Gebäude auszubauen.
    Ich habe mir das folgendermaßen gedacht:

    Ich habe einen timestamp1, den ich in die Datenbank eintrage und dann noch einen zweiten (2), bis wann das dauern soll (sprich timestamp1 +100 Sekunden), den ich ebenfalls eintrage. Dann soll er mittels echo ausgeben: timestamp2-timestamp1 und wenn das 0 ist, soll er die Stufe des Gebäudes in der Datenbank um 1 höher setzen. So müsste das funkionieren, oder?
    Die Frage ist nur: Wenn ich die Seite aufrufe, dann speichert er ja den timestamp1 und 2 ja schon in die DB, nicht erst, wenn ich den Link zum ausbauen klicke. Gibts da eine Möglichkeit, wie ich das anders machen kann, oder muss ich den ^^ Code in eine externe Datei legen, welche ich dann mittels Code aufrufe?
    Bitte helft mir, ich denke darüber schon seit einer Ewigkeit nach.

    Danke ;)
    Nach langer Zeit wieder ein bisschen als Programmierer tätig
  • Hallo,

    ich hab jetzt nicht ganz verstanden, wo das Problem liegt, aber ich versuch dir einen Lösungsvorschlag zu geben, wie ich es verstanden habe.
    Also, man ruft deine_seite.php auf, dort ist ein Link zum ausbauen des Gebäudes und auch die timestamps werden in die Datenbank gespeichert. Wenn du willst, dass diese erst beim Klicken auf den Link in die Datenbank gespeichert werden, kannst du das mit GET machen.

    der Link sieht dann so aus
    <a href="deine_seite.php?baue_name_des_gebaeudes=1">Gebäude ausbauen</a>

    Und in deiner PHP-Datei

    Quellcode

    1. <?php
    2. if ($_GET['baue_name_des_gebaeudes'] == '1') {
    3. // timestamps werden in die Datenbank eingetragen
    4. } else {
    5. // Was du machen willst, wenn man noch nicht auf den Link geklickt hat
    6. }
    7. ?>


    Ist natürlich alles nur grob, du müsstest es deinen Vorstellungen anpassen, vielleicht kannst du ja auch eine Klasse schreiben, wenn es mehrere Gebäude sind, wäre das ganz gut.

    Gruß,
    David
  • Ja, so ungefähr, aber was soll bau_name_des_gebäudes=1 heißen? Warum ...=1??

    Ok, mit GET wird eingetragen, sobald der Link gedrückt ist, oder? Und der Link muss dann den Code ^^ von dir enthalten, oder? Aber warum dann dort das GET?
    Sorry, ich verstehs nicht ganz...
    Nach langer Zeit wieder ein bisschen als Programmierer tätig
  • Hallo,

    wenn du dich mit der PHP-Programmierung beschäftigst, sollten diese Kenntnisse nicht fehlen. Du kannst ja mal danach googlen, ich werd dir jetzt nur einen kurzen Abriss geben.
    Get und Post sind Methoden zur Datenübergabe von Formularen. Get hängt dabei automatisch die Werte an die URL an. Beispiel:

    Quellcode

    1. <form method="get" action="<?php $_SERVER['PHP_SELF'] ?">
    2. <input type="text" name="IrgendeineBezeichnung" />
    3. <input type="submit" />
    4. </form>


    $_SERVER['PHP_SELF'] ist der Name des Scriptes, damit sich das Formular selbst aufruft, du kannst aber auch eine andere Datei angeben, die die Werte verarbeitet.

    Wenn du die Datei im Browser aufrufst, nennen wir sie beispiel.php, und dann auf submit klickst, ändert sich die Adresse wie folgt:
    http://server/pfad/zu/beispiel.php?IrgendeineBezeichnung=InDasFeldEingetragenerWert

    Dies sind Variablen, die man in $_GET findet, also $eingeragenerwert = $_GET['IrgendeineBezeichnung'];

    Bei Post funktioniert das etwas anders, die Daten sind nicht in der URL und Post (also Eintrag, ich mein da jetzt POST *gg) ist im Gegensatz zu GET nicht auf eine bestimmte Anzahl an Bytes gebunden, die höchstens übertragen werden dürfen.

    Bei GET kann man die Werte also manuell erzeugen, indem man bei dem HTML Link einfach Variablen anhängt. Mehrere Variablen werden durch ein & getrennt.

    Quellcode

    1. <a href="datei.php?var1=wert1&var2=wert2


    In PHP erreicht man sie dann so:

    Quellcode

    1. $var1 = $_GET['var1'];
    2. $var2 = $_GET['var2']


    Bei POST nimmst du $_POST['var1'].

    Du musst natürlich die Werte nicht in die variablen speichern, du kannst ihren Wert auch abfragen, wie in meinem ersten POST. Wenn der Wert der Variable $_GET['baue_name_des_gebaeudes'] gleich 1 ist, werden die Timestamps in die Datenbank eingetragen, wenn der Wert nicht 1 ost, dann kannst du halt was anderes machen.

    Musst halt mal googlen, da wirds sicherlich besser erklärt *gg

    Gruß,
    David
  • Ok, geil, danke schön. Ich bin das ganze Mal so angegangen:

    Quellcode

    1. <?php
    2. switch ($reihe['firmenstufe']) {
    3. case 1:
    4. $dauer = 600;
    5. case 2:
    6. $dauer = 900;
    7. case 3:
    8. $dauer = 1500;
    9. case 4:
    10. $dauer = 2100;
    11. case 5:
    12. $dauer = 2700;
    13. case 6:
    14. $dauer = 3300;
    15. case 7:
    16. $dauer = 5400;
    17. case 8:
    18. $dauer = 6000;
    19. case 9:
    20. $dauer = 7200;
    21. }
    22. $stampeins = time();
    23. $stampzwei = time()+$dauer;
    24. $restlichezeit = $stampzwei-$stampeins;
    25. echo "Die Ausbauarbeiten sind in ";
    26. echo $restlichezeit;
    27. echo " Sekunden beendet";
    28. echo ".";
    29. if(0 == $restlichezeit) {
    30. INSERT INTO fabrik (ausbaustufe) VALUES ('$ausbaustufe')"
    31. }
    32. ?>
    Alles anzeigen


    $reihe['firmenstufe']
    hab ich schon weiter oben abgefragt, das funktioniert.
    Jetzt muss ich "nur" noch mit dem GET erreichen, dass das erst ausgeführt wird, wenn ein Link aufgerufen wird. Und das muss ich noch googlen, weil ich versteh deines nicht so ganz, tut mir leid :(
    Könntest du mir nur mal sagen, ob mein Code soweit funktionieren könnte? Aja, und den Code (wenn er nun funkt) muss ich dann in die Datei schreiben, die per Klick auf "Gebäude ausbauen" aufgerufen wird, oder?

    Grüße,
    Matthias
    Nach langer Zeit wieder ein bisschen als Programmierer tätig
  • ^^ Bitte irgnorieren, das ist erledigt.

    Ich hab das so gemacht, allerdings wird ausgegeben, dass die restliche Zeit 7200 Sekunden sind, obwohl die fabrikstufe 1 ist. Des weiteren zählt er nicht runter, wenn ich es aktalisiere. Warum?!?

    Quellcode

    1. $abfrage = mysql_query("SELECT username, firmenname, firmenstufe FROM fabrik WHERE username LIKE '$username' LIMIT 1");
    2. $reihe = mysql_fetch_array($abfrage);
    3. switch ($reihe['firmenstufe']) {
    4. case 1:
    5. $dauer = 600;
    6. case 2:
    7. $dauer = 900;
    8. case 3:
    9. $dauer = 1500;
    10. case 4:
    11. $dauer = 2100;
    12. case 5:
    13. $dauer = 2700;
    14. case 6:
    15. $dauer = 3300;
    16. case 7:
    17. $dauer = 5400;
    18. case 8:
    19. $dauer = 6000;
    20. case 9:
    21. $dauer = 7200;
    22. }
    23. $stampeins = time();
    24. $stampzwei = time()+$dauer;
    25. $restlichezeit = $stampzwei-$stampeins;
    26. echo "Die Ausbauarbeiten sind in ";
    27. echo $restlichezeit;
    28. echo " Sekunden beendet";
    29. echo ".";
    Alles anzeigen


    Die Verbindung zur DB hab ich auch drinne, nur nicht hier reingestellt ^^ ;)
    Nach langer Zeit wieder ein bisschen als Programmierer tätig
  • also erstmal musst du $reihe['firmenstufe'] ausgeben.
    sonst können wir nicht nachvollziehen, was wirklich drinne steht.

    ansonsten sieht deine Rechnung für die Restzeit sehr merkwürdig aus *g*

    Quellcode

    1. $stampeins = time();
    2. $stampzwei = time()+$dauer;
    3. $restlichezeit = $stampzwei-$stampeins;
    4. //äquivalent zu
    5. $restlichezeit = time() + $dauer -time();
    6. //äquivalent zu
    7. $restlichezeit = $dauer;


    Des weiteren postet du den UPDATE Befehl gar nicht. Ohne UPDATE keine Änderung.
  • Das heißt, ich kann mir INSERT INTO sparen und statt dessen den UPDATE-Befehl nehmen? Oder muss ich das mit UPDATE machen, damit immer die neue Zahl dasteht?
    Einfach $dauer kann ich ja nicht nehmen, da dann immer z.B.: 7200 steht...

    Oder meinst du, dass ich die Dauer nehmen muss minus der bereits verstrichenen Zeit. Wie würde $restlichezeit dann aussehen? Ich bin zu blöd für das einfache herleiten... :S
    Nach langer Zeit wieder ein bisschen als Programmierer tätig
  • Du solltest dazu auf jeden Fall UPDATE nutzen.

    Allerdings solltest du dir auch nochmal Gedanken über dein Tabellendesign machen.

    #1: Was muss der Benutzer tun um das Gebäude zu bauen? Muss er im Browser anwesend sein, oder ist das Gebäude auch eine Woche später fertig, wenn er das am einen Tag startet und sich dann für ne Woche abmeldet.

    Ich glaube eher das Gebäude soll sich alleine fertig bauen.
    Dann brauchst du doch nur den Zeitstempel von heute addiert mit der Bauzeit zu speichern.

    #2: Kann ein Nutzer denn nur eine Fabrik bauen?
    Andernfalls solltest du eine Fabrik ID einführen

    #3: Bei Inkrementierungen speicherst du den Additionswert am besten direkt in der Tabelle. Spalten kannst du nämlich direkt addieren. So sparst du dir das auslesen.

    Quellcode

    1. UPDATE fabrik SET spalte_time = spalte_time + spalte_addition
  • "d0nUt" schrieb:

    [...]
    Ich glaube eher das Gebäude soll sich alleine fertig bauen.
    Dann brauchst du doch nur den Zeitstempel von heute addiert mit der Bauzeit zu speichern.

    #2: Kann ein Nutzer denn nur eine Fabrik bauen?
    Andernfalls solltest du eine Fabrik ID einführen

    #3: Bei Inkrementierungen speicherst du den Additionswert am besten direkt in der Tabelle. Spalten kannst du nämlich direkt addieren. So sparst du dir das auslesen.

    Quellcode

    1. UPDATE fabrik SET spalte_time = spalte_time + spalte_addition


    Ja, aber was brint mir das, der Zeitstempel+Bauzeit? Der timestamp rennt ja immer weiter, warum also so was?

    Ja, es soll bei einer Fabrik bleiben.

    Und der UPDATE-Befehl ist dafür da, dass die Anzeige runter zählt, oder?
    Nach langer Zeit wieder ein bisschen als Programmierer tätig
  • "Waldi" schrieb:

    Ja, aber was brint mir das, der Zeitstempel+Bauzeit? Der timestamp rennt ja immer weiter, warum also so was?


    Wenn du $time um 15:16 speicherst und $time den Wert time()+600 hat, dann ist in der Datenbank der Zeitstempel von 15:26 gespeichert.

    Und beim auslesen kannst du nun jedesmal abfragen.
    "Ist dieser Zeitstempel erreicht, dann fertig"
  • Also, so zirka:

    Quellcode

    1. time1 = time();
    2. time2 = time()+600;
    3. INSERT INTO fabrik (stempel1) VALUES ('$time1');
    4. INSERT INTO fabrik (stempel2) VALUES ('$time2');
    5. if($time1 == $time2) {
    6. echo "Gebäude fertig"
    7. ""Code zum eintragen in Tabelle""
    8. } else {
    9. echo "Gebäude braucht noch ";
    10. echo $time2-$time1;
    11. echo "Sekunden";
    12. }
    Alles anzeigen


    ?

    Aha, schreibt er da bei jedem aktualisieren aber nicht eine neue Zeit? Und sobald man sich ausloggt, ist das dann auch weg...

    Argh, ich kann das nicht... :(
    Nach langer Zeit wieder ein bisschen als Programmierer tätig
  • das ein Zugriff erfolgt ist doch irrelevant.
    Bei der Abfrage ob das Gebäude fertig ist brauchst du also weder UPDATE noch INSERT.
    INSERT brauchst du nur beim Erstellen (Wo auch abgefragt wird, dass nur ein Gebäude gleichzeitig erstellt werden kann)

    Quellcode

    1. $res = mysql_query("SELECT time FROM tbl WHERE gebaeude = $var; ");
    2. $row = mysql_fetch_array($res);
    3. if($row['time'] > time()) {
    4. echo 'Das Gebäude ist nicht fertig';
    5. } else {
    6. echo 'Das Gebäude ist fertig';
    7. }
  • Ok, das UPDATE ist ja für die Datenbank da. Aber warum aktualisiert er die Anzeige nicht und warum legt er immer neue Zeilen an. Da psst was gröberes nicht...

    Quellcode

    1. <html>
    2. <head>
    3. <title>"Die Elemente" - Startseite</title>
    4. </head>
    5. <body background="grafiken/hg2.jpg" text="#ffffff" link="#ffffff" alink="#ffffff" vlink="#ffffff">
    6. <center>
    7. <table border="1" frame="void" cellpadding="4">
    8. <tr>
    9. <td width="15%">
    10. <img src="grafiken/logo.jpg">
    11. </td>
    12. <td>
    13. <font size="5" color="darkred"><b>BANNER</b></font>
    14. </td>
    15. </tr>
    16. <tr>
    17. <td>
    18. <?php
    19. include("links.html");
    20. ?>
    21. </td>
    22. <td valign="top">
    23. <br />
    24. <?php
    25. session_start();
    26. $verbindung = mysql_connect("localhost", "rezensionen" , "***")
    27. or die("Verbindung zur Datenbank konnte nicht hergestellt werden");
    28. mysql_select_db("rezensionen") or die ("Datenbank konnte nicht ausgewählt werden");
    29. $abfrage = mysql_query("SELECT username, firmenname, firmenstufe FROM fabrik WHERE username LIKE '$username' LIMIT 1");
    30. $reihe = mysql_fetch_array($abfrage);
    31. $username = $reihe['username'];
    32. switch ($reihe['firmenstufe']) {
    33. case 1:
    34. $dauer = 600;
    35. case 2:
    36. $dauer = 900;
    37. case 3:
    38. $dauer = 1500;
    39. case 4:
    40. $dauer = 2100;
    41. case 5:
    42. $dauer = 2700;
    43. case 6:
    44. $dauer = 3300;
    45. case 7:
    46. $dauer = 5400;
    47. case 8:
    48. $dauer = 6000;
    49. case 9:
    50. $dauer = 7200;
    51. }
    52. $time2 = time()+$dauer;
    53. $into = "INSERT INTO fabrik (timezwei) VALUES ('$time2')";
    54. $intodb = mysql_query($into);
    55. if($intodb == true)
    56. {
    57. $ausbaustufe = $reihe['firmenstufe']+1;
    58. }
    59. $res = mysql_query("SELECT timezwei FROM fabrik WHERE username LIKE '$username'");
    60. $row = mysql_fetch_array($res);
    61. if($row == true)
    62. {
    63. $restzeit = $time2-$time();
    64. if($row['timezwei'] > time()) {
    65. echo "Das Gebäude braucht noch ";
    66. echo $restzeit;
    67. echo "Sekunden";
    68. echo ".";
    69. } else {
    70. echo "Das Gebäude ist fertig";
    71. $aendern = "UPDATE fabrik SET fabrikstufe = $ausbaustufe WHERE username LIKE '$username'";
    72. $update = mysql_query($aendern);
    73. }
    74. }
    75. ?>
    76. <br />
    77. <br />
    78. <a href="fabrikausbauen.php">Aktualisieren</a>
    79. </td>
    80. </tr>
    81. </table>
    82. </center>
    83. </body>
    84. </html>
    Alles anzeigen


    Quellcode

    1. <html>
    2. <head>
    3. <title>"Die Elemente" - Startseite</title>
    4. </head>
    5. <body background="grafiken/hg2.jpg" text="#ffffff" link="#ffffff" alink="#ffffff" vlink="#ffffff">
    6. <font face="Verdana" color=#ffffff>
    7. <?php
    8. session_start();
    9. $verbindung = mysql_connect("localhost", "rezensionen" , "***")
    10. or die("Verbindung zur Datenbank konnte nicht hergestellt werden");
    11. mysql_select_db("rezensionen") or die ("Datenbank konnte nicht ausgewählt werden");
    12. ?>
    13. <center>
    14. <table border="1" frame="void" cellpadding="4">
    15. <tr>
    16. <td width="15%">
    17. <img src="grafiken/logo.jpg">
    18. </td>
    19. <td>
    20. <font size="5" color="darkred"><b>BANNER</b></font>
    21. </td>
    22. </tr>
    23. <tr>
    24. <td>
    25. <?php
    26. include("links.html");
    27. ?>
    28. </td>
    29. <td valign="top">
    30. <br />
    31. <table border="1" bgcolor="#999999" rules="all">
    32. <tr>
    33. <td>
    34. <?php
    35. $abfrage = mysql_query("SELECT username, firmenname, firmenstufe FROM fabrik WHERE username LIKE '$username' LIMIT 1");
    36. while ($reihe = mysql_fetch_array($abfrage))
    37. {
    38. echo "Ihre Fabrik ";
    39. echo $reihe['firmenname'];
    40. echo " hat derzeit die Stufe ";
    41. echo $reihe['firmenstufe'];
    42. echo ".";
    43. }
    44. ?>
    45. </td>
    46. </tr>
    47. </table>
    48. <br /><br />
    49. <a href="fabrikausbauen.php>Ausbauen</a>
    50. <br /><br />
    51. </td>
    52. </tr>
    53. </table>
    54. </center>
    55. </div>
    56. </body>
    57. </html>
    Alles anzeigen


    Könnt ihr mich bitte noch ein bisschen unterstützen?? Das wäre super!

    Grüße

    Edit: Hab das jetzt geändert, jetzt schauts so aus und es kommt:

    Fatal error: Call to undefined function: () in /usr/export/www/vhosts/funnetwork/hosting/rezensionen/php/fabrikausbauen.php on line 91

    das ist hier Zeile 92...
    Nach langer Zeit wieder ein bisschen als Programmierer tätig
  • "d0nUt" schrieb:


    #92 die Subtraktion muss $row[timezwei]-$row[timeeins] sein
    #94 die Spalte muss timezwei sein

    datei2
    #64 hochkomma vergessen


    .) Ich hab timeeins nicht mehr, ich mach das nur mit time() und time()+$dauer
    .) Ist sie doch...

    .) Hab ich schon gemacht, habs nur vergessen, in diese ^^ Datei auch rein zu spielen. Danke
    Nach langer Zeit wieder ein bisschen als Programmierer tätig