Onlinespiel alá Galaxywars selbst machen?

Jules-Verne

Lt. Junior Grade
Registriert
Aug. 2001
Beiträge
289
mich würde mal interessieren wie man sowas macht wie bei onlinespiel.org ich weiss soweit das man php benötigt und html, gibts irgendwo ein kleines tutorial für sowas. Würde sowas gerne mal für ein Intranet programmieren
 
also so auf die schnelle geht das nicht. wie du ja schon weist brauchst du php, html und du brauchst noch eine Datenbank (mySql) das php coden ist die eine Sache, die Datenbank zumachen die andere.
Hier kannst du sehr gut nach Tutorials suchen und du wirst sogar eine Menge finden.

MFG Psylo
 
Viel Spass!

Wenn du bock hast, geb ich dir mal nen kleinen Anfang für sowas, was ich gemacht hab.
Das wird aber ewig viel aufwand udn ich hab leider atm keine zeit dafür..

ansonsten wär ich mit ziemlicher sicherheit grad am proggen von dem ding *g*

schreib mich halt am an, wenn du in das ,was ich gemacht hab ma reinschauren willst ;)
 
Das Programmieren von so einem Spiel ist wohl weniger die Schwierigkeit, als sinnvolle Features einzubauen und das Spiel auszubalancieren. Das macht einen großen Aufwand und braucht einiges an Zeit bis es halbwegs vernünftig funktioniert. Bei Spaceassault zB kristallierte sich mit der Zeit heraus, das bestimmte Einheit total unnötig waren oder andere zu stark. Fazit: Schwierigkeit nicht zu hoch, der Aufwand jedoch schon!
 
Du spielst SpAss?

*g*

hab ich auch ma... *g*

Aber echt, das amcht doch süchtig und man wird voll aggressiv O_o

Btt:
ich find den Programmieraufwand schon etwas hoch, aber das kann auch teilweise daran liegen, dass ich imemr maximale konfigurierbarkeit des Inhalts behalten will und so quasi nur nen Container für ein MMPOG schreibe statt das eigentliche game, was bei meiner Variante mehr durch den DB-Inhalt und ein paar includierte Funktionen bestimmt wird.
Also: Modding stark vereinfacht ;)

Und: Einheiten etc sind nur dann überflüssig, wenn es keine Taktik gibt, die ihren Einsatz benötigt...
 
Hmm... hast du schon ein KS? Ich hab nicht die geringste Ahnung, wie man da etwas halbwegs ordentliches zusammenbekommen soll...
... ok... auch wenn ichs mittlerweile auch ad acta gelegt habe... ich bau gerade an meinem Community-Systen :)
 
Kannst ja mal schauen...

Um Kampf-Zeug hab ich mich bis dato weniger gekümmert.
Eher um Ress-scheffeln, Highscore und Gebäude.

Ich mach das - wenn ihr wollt - mal Open Source *g* is ja eh fast nix und der Code is ein einzigen Chaos.
Öhm ja, meine DB könnt ihr auch gern foltern, aber auch die hat nur dsl-speed, da auf meim PC @Home

http://pcw.homeip.net/projects/online/game.php <-- sozusagen "spielbar"
http://pcw.homeip.net/projects/online/account.php <-- sozusagen "anmelden"

die gebäude da drin sind just 4 fun und werden bestimmt niemals so übernomemn werden (da 0 balancing)
 
Naja, ok, den Rest könnte ich selbst, nur fürs KS hab ich keine Peilung, wo man da ansetzen könnte... ^_^ Aber trotzdem thx.
 
KampfSystem:

erstmal brauchst du 2 davon... (boden udn weltall)

dann brauchst du mindestens 1 angriffswert und einen defensewert pro einheit

dann ein bonussystem, wenn du es kompliziert amchen magst...

..und zuletzt noch eine gesunde portion nicht(!) berechenbaren zufall ;)

dann verrechnest du die Angriffswerte mit den gegnerischen Defensewerten und schaust, wer wem wieviel schaden macht. und dann musst du nurnoch die entsprechenden prozente an schiffen (je nach schaden) zerstören ;)
 
man kann aber auch noch einen Mindest- und Maximal-Angriffs- bzw. Verteidigungswert definieren
zudem könnten Wert-Unterschiede bei verschiedenen Schiffs-Typen auftreten (zB Boden-Truppen haben keinen Angriffswert auf Einheiten im Raum)

und das muss dann halt alles ausbalanciert werden :rolleyes:
 
pcwTJaR schrieb:
..und zuletzt noch eine gesunde portion nicht(!) berechenbaren zufall ;)
Ja, DAS ist ja das schwierige an der Sache ;) Ansonsten, ein Billig-KS wäre einfach bei beiden 1:1 abziehen bis einer auf 0 runter ist...

Wär allerdings ziemlich unrealistisch wenn bei 2 gegen 1 der eine genauso viele killen kann wie bei 200000 gegen 1...
 
lass den zufall den ausgang der schlacht um sagen wir bis zu 50% beeinflussen.

oder den Ausgang um 20% und die verlusste um +/-50% oder so...
 
Das Ausmaß des Zufalls müsste natürlich wieder aus der Größe und Stärke der beiden Armeen und den jeweiligen Einheiten berechnet werden. :p
 
Also vom programmiertechnischen wär ja so ein browsergame ja nicht so schwer zu verwirklichen, allerdings hab ich da ein problem, wie löse ich das problem das die angriffe und bauaufträge zur richtigen zeit vollendet werden?

@pcwTJaR: könntest du mir eventuell mal deinen sourcecode schicken wenn du das schon gelöst hast?

lg cheeby
 
das mit den bauaufträgen hab ich schon gemacht...

PHP:
//---ANFANG von Gebäudebaucheck---
        $qry="SELECT bauschlangegebaeude.fertig as 'fertig', bauschlangegebaeude.sektorid AS 'sektor', bauschlangegebaeude.planetenid AS 'planet', gebaeude.gebaeudeid AS  'id' FROM ( ( ( sektoren INNER  JOIN bauschlangegebaeude ON ( sektoren.sektorid = bauschlangegebaeude.sektorid )  ) INNER  JOIN gebaeude ON ( bauschlangegebaeude.gebaeudeid = gebaeude.gebaeudeid )  ) ) WHERE ( ( bauschlangegebaeude.planetenid =$Planet ) AND ( sektoren.besitzer =  '$username' ) )";
        $result = mysql_query($qry);
  if(mysql_num_rows($result))
  {
    $row = mysql_fetch_array($result, MYSQL_ASSOC);
    $dauer = preg_split ("/ /", $row[fertig]);
    $datum = preg_split ("/-/", $dauer[0]);
    $zeit = preg_split ("/:/", $dauer[1]);
    if(mktime($zeit[0],$zeit[1],$zeit[2],$datum[1],$datum[2],$datum[0])<time())
    {
      update_ress($username,$Planet);
      $qry="INSERT INTO sektorgebaeude (planetenid,sektorid,gebaeudeid) values ($row[planet],$row[sektor],$row[id])";
      $result = mysql_query($qry);
      if(mysql_affected_rows())
      {
        $qry="DELETE FROM bauschlangegebaeude WHERE ((planetenid=$row[planet])and(sektorid=$row[sektor]))";
        $result = mysql_query($qry);
     //Planetenress ermitteln
        $qry="SELECT metall, wasser, energie, kristall, chemikalien FROM planetenress WHERE ( ( besitzer = '$username' ) AND ( planetenid =$Planet ) )";
        $result = mysql_query($qry);
        $row2 = mysql_fetch_array($result, MYSQL_ASSOC);
     //Planetenress modifizieren
        $qry="SELECT metallph, wasserph, energieph, kristallph, chemikalienph FROM gebaeude WHERE gebaeudeid=$row[id]";
        $result = mysql_query($qry);
        $row3 = mysql_fetch_array($result, MYSQL_ASSOC);
        $vergangen=time()-mktime($zeit[0],$zeit[1],$zeit[2],$datum[1],$datum[2],$datum[0]);
        $vergangen=$vergangen/(60*60);
        $metall=$row2[metall]+($vergangen*$row3[metallph]);
        $wasser=$row2[wasser]+($vergangen*$row3[wasserph]);
        $energie=$row2[energie]+($vergangen*$row3[energieph]);
        $kristall=$row2[kristall]+($vergangen*$row3[kristallph]);
        $chemikalien=$row2[chemikalien]+($vergangen*$row3[chemiekalienph]);
        $stand=date("Y-m-d H:i:s");
     //Planetenres updaten
        $qry="UPDATE planetenress set metall=$metall, wasser=$wasser, energie=$energie, kristall=$kristall, chemikalien=$chemikalien, stand='$stand' where ((planetenid=$Planet)and(besitzer='$username'))";
        $result = mysql_query($qry);

      }
    }
  }
//---ENDE von Gebäudebaucheck---

Und die Update_ress-Funktion:
PHP:
//letzten ress-stand auslesen
   $qry="SELECT metall, wasser, energie, kristall, chemikalien, stand FROM planetenress WHERE ( ( besitzer = '$username' ) AND ( planetenid =$Planet ) )";
   $result = mysql_query($qry);
   $ress = mysql_fetch_array($result, MYSQL_ASSOC);
//stand --> vergangene Stunden
    $dauer = preg_split ("/ /", $ress[stand]);
    $datum = preg_split ("/-/", $dauer[0]);
    $zeit = preg_split ("/:/", $dauer[1]);
    $vergangen=time()-mktime($zeit[0],$zeit[1],$zeit[2],$datum[1],$datum[2],$datum[0]);
    if(($vergangen/60)>5)
    {
      $vergangen=$vergangen/(60*60);
//ress pro stunde ermitteln
   $qry="SELECT sum( gebaeude.metallph )  AS  'metall', sum( gebaeude.wasserph )  AS  'wasser', sum( gebaeude.energieph )  AS  'energie', sum( gebaeude.kristallph )  AS  'kristall', sum( gebaeude.chemikalienph )  AS  'chemikalien' FROM ( ( sektoren INNER  JOIN sektorgebaeude ON ( ( sektoren.sektorid = sektorgebaeude.sektorid ) AND ( sektoren.planetenid = sektorgebaeude.planetenid ) )  INNER  JOIN gebaeude ON ( sektorgebaeude.gebaeudeid = gebaeude.gebaeudeid )  ) ) WHERE ( ( sektoren.besitzer =  '$username' ) AND ( sektoren.planetenid =$Planet ) )";
   $result = mysql_query($qry);
   $foerderung = mysql_fetch_array($result, MYSQL_ASSOC);
//zusammenrechnen
     $metall=$ress[metall]+($foerderung[metall]*$vergangen);
     $wasser=$ress[wasser]+($foerderung[wasser]*$vergangen);
     $energie=$ress[energie]+($foerderung[energie]*$vergangen);
     $kristall=$ress[kristall]+($foerderung[kristall]*$vergangen);
     $chemikalien=$ress[chemikalien]+($foerderung[chemikalien]*$vergangen);
     $stand=date("Y-m-d H:i:s");
//aktualisieren
     $qry="UPDATE planetenress set metall=$metall, wasser=$wasser, energie=$energie, kristall=$kristall, chemikalien=$chemikalien, stand='$stand' where ((planetenid=$Planet)and(besitzer='$username'))";
     $result = mysql_query($qry);
    }
 
Zuletzt bearbeitet:
und wie lässt du das script starten? per userlogin oder per cronjob oder per endlosschleife?
 
pcwTJaR schrieb:
PHP:
$dauer = preg_split ("/ /", $row[fertig]);
$datum = preg_split ("/-/", $dauer[0]);
$zeit = preg_split ("/:/", $dauer[1]);
Ich hab mir die Scripts jetzt nicht genauer angeschaut...
Aaaaaber:
Was spräche dagegen, statt preg_split() einfach explode() zu benutzen (ausser dass explode() nicht so viel Zeit verbrauchen würde...)?

Und ja: Ich weiss, dass ich in dem anderen Thread gesagt habe, dass es bei Scriptsprachen nicht soooo auf Optimierung ankommt, aber das hier sind echt mal Sekunden, die man sich auch sparen kann...

*edit*
Da fällt mir ein: Wäre es nicht sowieso einfacher einen timestamp zu speichern?
 
Zuletzt bearbeitet:
Also ich hab nen preg benutzt, weil ich halt von perl her zu php bin und an dem tag, als ich das geschrieben hat hatte ich mich halt grad ma ne woche oder so mit php beschäftigt, da kann man noch end alle funktionen kennen.

Das script läuft immer nur, wenn der User was klickt und auch immer nur für die Planeten/sektoren, die aktuell am Spielgeschehen beteiligt sind...
 
Zuletzt bearbeitet:
pcwTJaR schrieb:
Das script läuft immer nur, wenn der User was klickt und auch imemr nur für die Planeten/sektoren, die aktuell am Spielgeschehen beteiligt sind...

nicht grad die günstigste lösung. solange es nur um bauaufträge geht ok.
aber sobald ich ein kampfscript geschrieben habe sollte das ganze dann doch dann erledigt werden, wenns fertig ist

eine überlegung von mir wäre ja noch ein c script das ich per exec() aufrufe und das im hintergrund läuft, allerdings hab ich schon extrem lang nichts mehr in c gemacht...was aber nicht das problem sein sollte
 
Zuletzt bearbeitet:
was ist der unterschied zwischen "ich berechne es dann, wenn ich es das erstemal brauche" oder "ich berechne es sofort"?

Ich mein, wenn die Daten benötigt werden, sind sie durch das Update aktuell.

Du musst bloß für alle an einer aktion beteiligten Planeten die Updates vor der Aktion durchführen.

Und was nützt es dir, wenn meine Daten auf Planet X immer Minutenaktuell sind, wenn ich da ne Woche lang ned draufklicke? Dann sieht es doch eh keiner...
 
Zurück
Oben