anpera.net https://anpera.dyndns.org/phpbb3/ |
|
Vier Jahreszeiten https://anpera.dyndns.org/phpbb3/viewtopic.php?f=25&t=4069 |
Seite 1 von 2 |
Autor: | Llynya [ Do 11 Okt, 2007 19:37 ] |
Betreff des Beitrags: | Vier Jahreszeiten |
Hallo... Also, mir ist heute so ein Gedanke durch den Kopf geschossen und somit hab ich nun eine kleine 'Rätselfrage' an die Progger... Eine Wetter funktion gibt es ja schon, aber das geht ja ab wie russisches Roulette. Jedenfalls... Kann man vielleicht ein Programm schreiben, das gezielt auf die vier Jahreszeiten anspringt und auch somit brav das Wetter ändert? Es gibt ja schon was, wo man quasi einen realen Tag mit Morgen, Mittag...etc bekommt. Somit wäre es ja auch nicht unrealistisch, die Jahreszeiten zu haben, da das Logd ja sowiso ne eigene Zeitrechnung hat. Wäre sowas also überhaupt möglich? Wie schon gesagt, es war nur ein Gedankenblitz und ich hab von sowas ja kaum Ahnung. Aber mich würde es halt interessieren, ob das grundsätzlich möglich wäre. ![]() Grüßle, Llynya |
Autor: | Eliwood [ Do 11 Okt, 2007 20:21 ] |
Betreff des Beitrags: | Re: Vier Jahreszeiten |
Ich hab schon so etwas ähnliches: [php]switch(mt_rand(1, 11)) { case 1: case 2: $clouds = 'Regnerisch'; $temperatur = '14-18°C'; break; case 3: case 4: $clouds = 'Neblig'; $temperatur = '10-16°C'; break; case 5: case 6: $clouds = 'Sonnig und bewölkt'; $temperatur = '20-25°C'; break; case 7: case 8: $month = er_getgamemonth(); if($month >= 12 OR $month < 3) { $clouds = 'Starker Schneefall und Eiseskälte'; $temperatur = '-5-0°C'; } elseif($month >= 3 OR $month < 6) { $clouds = 'Kühl und leichte Gewitter'; $temperatur = '15-19°C'; } elseif($month >= 6 OR $month < 9) { $clouds = 'Sonnig und wolkenlos'; $temperatur = '23-30°C'; } else { $clouds = 'Herbststürme'; $temperatur = '17-22°C'; } break; case 9: case 10: $clouds = 'Sonnig und wolkenlos'; $temperatur = '23-30°C'; break; case 11: $clouds = 'Sturm'; $temperatur = '17-21°C'; break; }[/php] Normaler Wetterumschwung halt, nur, dass in 2 Fällen Jahreszeitspezifisches ausgewählt wird. WIe du an $month kommst, weiss ich allerdings nicht mehr aus dem Stehgreif - obige FUnktion ist es sicher nicht. |
Autor: | Rishiêll [ Do 11 Okt, 2007 20:26 ] |
Betreff des Beitrags: | |
Die Monate könnte man mit der Funktion gamedate ermitteln das sollte kein Problem sein ![]() |
Autor: | Auric [ Do 11 Okt, 2007 21:59 ] |
Betreff des Beitrags: | |
Hm.. ich würde das Folgendermaßen anlegen: Je Jahreszeit (oder monat, wenn manes feiner aufgelöst haben will) Einen datensatz anlegen, der die möglichen Wettertypen dieser Jahreszeit besitzt. In einer einfachen Fassung wird einfach aus diesen einer zufällig ausgewählt - viel interessanter fände ich allerdings folgendes: Nehmen wir mal alle möglichen Wetertypen als Objekt und geben ihnen eine Liste von möglichen "Nachfolgern" und ihrer Wahrscheinlichkeit mit. Nun Filtern wir die raus, die nicht zur Jahreszeit passen und wählen dann (gemäß der mitgegebenen Wahrscheinlichkeit) das neue Wetter per Zufallswert aus. Beispiel: Jahreszeit: Winter(Schnee, Regen, Kalt & Klar, Sturm, Mild); Wettertyp (Nachfolger[Wahrscheinlichkeit]): Mild(Regen[3],Kalt & Klar[5],Sturm[1],Mild[3],Schnee[2],Sonnenschein[2], Steife Breise[3]) Möglichkeiten Gesammt: 3+5+1+3+2+2+3 = 19 Nichtmögliche Wettertypen für Winter: Steife Briese, Sonnenschein Verbleibende Gesammtmöglichkeiten: 3+5+1+3+2 = 14 Zufallszahl zwischen 1 und 14 = 6 Passender Wert zur Zufallszahl = neues Wetter: Kalt & Klar So bekommt man ein recht realistisches System, das modular erweiterbar ist. Wer lust auf noch mehr hat, könnte beispielsweise bei den Jahreszeiten noch mitgeben, wie wahrscheinlich die einzelnen Verfügbaren Wettertypen sind und diese mit der Wahrscheinlichkeit aus dem aktuellen Wetter multiplizieren und so weiter... Höchst interessante Sache heheheh *zu viel Stochastik gemacht hat* Auric |
Autor: | Llynya [ Fr 12 Okt, 2007 00:27 ] |
Betreff des Beitrags: | |
Also, Monate hätt ich net mal gedacht. ^^° Eben nur Frühling, Sommer, Herbst und Winter. =) Meiner Meinung nach wäre das eh ausreichend. ^^ Ich dachte eben nur, dass so nur im Winter Schnee kommt, im Herbst regnets, im Sommer eben Sonne und Frühling, ne Windesbriese oder wie auch immer. xD |
Autor: | vernisage [ Mi 21 Nov, 2007 21:39 ] |
Betreff des Beitrags: | |
Kam bei diesem Thread noch etwas bei heraus? Ich würde bei mir das Wetter auch gerne anpassen nach der RealLife-Jahreszeit. Jetzt zum Bsp von Okt bis Nov würd ich gerne nur Wetter erscheinen lassen, dass trist und herbstlich ist. von Dez bis Febr (von mir aus) Winterwetter usw.. Wie händel ich das? Ich hab das schon mal gesehen... Ist es sowas, was ich da aus Elis beitrag sehe? Muss ich die cases in der setnewday alle neu anlegen? Grüße, verni ![]() |
Autor: | Eliwood [ Mi 21 Nov, 2007 22:03 ] |
Betreff des Beitrags: | |
vernisage hat geschrieben: Kam bei diesem Thread noch etwas bei heraus?
Ich würde bei mir das Wetter auch gerne anpassen nach der RealLife-Jahreszeit. Jetzt zum Bsp von Okt bis Nov würd ich gerne nur Wetter erscheinen lassen, dass trist und herbstlich ist. von Dez bis Febr (von mir aus) Winterwetter usw.. Wie händel ich das? Ich hab das schon mal gesehen... Ist es sowas, was ich da aus Elis beitrag sehe? Muss ich die cases in der setnewday alle neu anlegen? Grüße, verni ![]() Das bei case 7 und 8 müsste, angepasst auf deine libs, das richtige sein. Bei RealLife reicht sogar die Funktion date('m') |
Autor: | vernisage [ Do 22 Nov, 2007 09:49 ] |
Betreff des Beitrags: | |
Ok, danke... Bevor ich jetzt alles umsetze... könnte es ~so~ dann aussehen?? (Nur ein Anfang....) [php]switch(e_rand(1,29)){ $month = date('m'); if($month >= 4 OR $month < 7) { case 1: $clouds="Wechselhaft und kühl, mit sonnigen Abschnitten"; break; case 2: $clouds="Bewölkt"; break; case 3: $clouds="Frühlingshaft mit Sonnenschein"; break; case 4: $clouds="Regnerisch"; break; case 5: $clouds="Aufgelockert und etwas wärmer"; break; case 6 $clouds="Warm und sonnig"; break; case 7: $clouds="Windig, aber trocken"; break; } elseif($month >= 7 OR $month < 10) { case 8: $clouds="Regnerisch"; break; case 9: $clouds="Heiß und sonnig"; break; [/php] oder muss ich die switch in einzelne Abschnitte? |
Autor: | Nightborn [ Do 22 Nov, 2007 11:32 ] |
Betreff des Beitrags: | |
![]() a) switch von 1-29 ist ok, aber leider wird ja nicht jeder case abgerufen, also sollte ein default definiert sein Eliwood hat das vollständig definiert. b) wird es so gewünscht, daß auf regen praktisch nur regen->sonne oder regen->regen kommen kann. in anderen jahreszeiten regen->schnee? wenn ja, dann stellt bitte sowas auf. das kann man in Code umsetzen ^^ Im Sommer, was die Monate Juni bis September betrifft, gilt: Regen -> Sonne Regen -> Regen Sonne -> Regen Sonne -> Sonne Regen -> Hagel Hagel -> Sonne oder so... dann ist es "schlüssig" und nicht mehr rein zufällig |
Autor: | Eliwood [ Do 22 Nov, 2007 20:41 ] |
Betreff des Beitrags: | |
Regel Nummer 1, was switches angeht: Das einzige, was in einer switch stehen kann, ist default oder case, gefolgt von einem Doppelpunkt. Etwas anderes ist nicht möglich! Der case-Block (oder default) wird mit break; geschlossen. Danach darf wiederum nur case stehen, oder default, wenn noch kein anderes default da steht. Dein switch wird also schon mal Parsefehler verursachen ![]() (Aber keine Sorge - manchmal vergisst man es einfach. Hatte vorgestern auch Kommandos wie deine direkt nach switch) PS: Um alternativ viele Fähle abzufangen gibt es einen Trick, der allerdings etwas langsamer ist: [php]$rand = mt_rand(1, 100); # Oder e_rand für eine andere Verteilung switch(TRUE) { case ($rand < 10): break; # [...] case ($rand <= 90 && $rand > 70): break; default: break; # optional, da am Schluss, aber besser. }[/php] |
Autor: | Auric [ Do 22 Nov, 2007 23:26 ] |
Betreff des Beitrags: | |
Eliwood hat geschrieben: [...]Der case-Block (oder default) wird mit break; geschlossen. Danach darf wiederum nur case stehen, oder default, wenn noch kein anderes default da steht.[...]
Hier muss ich doch einmal korregierend einschriten: break-Anweisungen sind parsertechnisch allesamt optional, folgendes Konstrukt dürfte also ohne murren akzeptiert werden: [php] <?php function minimum_three() { return "The result was greater than or equal 3<br />\n"; } function minimum_two() { return "The result was greater than or equal 2<br />\n"; } function minimum_one() { return "The result was greater than or equal 1<br />\n"; } $return = "Resultstring :<br />\n"; switch(mt_rand(0,3)) { case 3: $return .= minimum_three(); case 2: $return .= minimum_two(); case 1: $return .= minimum_one(); default: $return .= "And for sure the result was at least greater or equal 0"; } ?>[/php] Dieses Codestück demonstriert jedoch auch den Grund, warum normalerweise break-Anweisungen verwendet werden. Sind diese nicht gesetzt, spricht man von einer Durchfallschaltung. Es werden also alle darunterliegenden Ereignise mit einbezogen. Wird also eine 2 Berechnet, so werden die Funktionen minimum_two, minimum_one und natürlich die "manuelle" Stringverkettung in der Default-Anweisung durchgeführt. Stünde hinter den case-Blöcken ein break; so würde immer nur eine Funktion aufgerufen. Im Normalfall - zumindest in der FOrm, wie wir sie hier benötigen hat die switch-Anweisung jedoch eher den Charakter eine ElseIf-Schaltung mit vielen Alternativen (wobei sie auch schneller ist als jene), wesshalb für die Programmlogik dieses Falls ein break nötig ist (Was nicht ausschliest, das man auf Teufel komm raus nicht auch mit komplexteren Durchfallschaltungen arbeiten könnte - ob das Sinn macht steht auf einen ganz anderen Blatt) Soviel von mir, Auric |
Autor: | Morpheus [ Fr 23 Nov, 2007 13:44 ] |
Betreff des Beitrags: | |
Ich habe die Wetterfunktion von dem ehemaligen Admin des Servers, auf dem ich damals als Admin tätig war, geerbt, ist schon ganz fein: $this->bbcode_second_pass_code('', ' //Wettermod by Nyx $date = getsetting('gamedate','0000-01-01'); $date = explode('-',$date); $monat = $date[1]; if (($monat == 1) || ($monat == 2)) { switch(e_rand(1,3)) { case 1: $clouds = "kalt mit Schneefall"; break; case 2: $clouds = "klirrend kalt bei klarem Himmel"; break; case 3: $clouds = "kalt mit Schneegestöber"; break; } } elseif (($monat == 3) || ($monat == 4)) { switch(e_rand(1,3)) { case 1: $clouds = "regnerisch"; break; case 2: $clouds = "neblig"; break; case 3: $clouds = "windig"; break; } } elseif (($monat == 5) || ($monat == 6)) { switch(e_rand(1,4)) { case 1: $clouds = "bewölkt"; break; case 2: $clouds = "kühl bei klarem Himmel"; break; case 3: $clouds = "stark windig mit vereinzelten Regenschauern"; break; case 4: $clouds = "aufgelockert und etwas wärmer"; break; } } elseif (($monat == 7) || ($monat == 8)) { switch(e_rand(1,4)) { case 1: $clouds = "warm und schwül"; break; case 3: $clouds = "sonnig und heiß"; break; case 3: $clouds = "warm mit Sommergewitter"; break; case 4: $clouds = "sehr, sehr heiß"; break; } } elseif (($monat == 9) || ($monat == 10)) { switch(e_rand(1,5)) { case 1: $clouds = "sehr warm"; break; case 2: $clouds = "stark windig, aber warm"; break; case 3: $clouds = "regnerisch mit Gewitterstürmen"; break; case 4: $clouds = "kühl"; break; case 5: $clouds = "windig und frisch"; break; } } elseif (($monat == 11) || ($monat == 12)) { switch(e_rand(1,5)) { case 1: $clouds = "kalt"; break; case 2: $clouds = "bewölkt bei leichtem Schneefall"; break; case 3: $clouds = "kalt bei flockigem Weihnachtsschneefall"; break; case 4: $clouds = "kalt bei Schneeregen"; break; case 5: $clouds = "saukalt bei klarem Himmel"; break; } } savesetting("weather",$clouds); ') Das funktioniert schon seit einer Ewigkeit einwandfrei und kann von mir aus gerne übernommen werden, aber bitte den Namen des Programmieres nicht löschen! ![]() ![]() |
Autor: | Kevz [ Fr 23 Nov, 2007 14:55 ] |
Betreff des Beitrags: | |
Etwas kleiner. ^^ Mehr just 4 fun. . ., obwohl dabei fraglich ist, wie Performant es ist. Sollte wesentlich mehr sein, als der vorherige schnipsel. . . [php]<?php $date = getsetting('gamedate','0000-01-01'); $date = explode('-',$date); $weather = array( '1,2' => array('kalt mit Schneefall', 'klirrend kalt bei klarem Himmel, kalt mit Schneegestöber') , '3,4' => array('regnerisch', 'neblig', 'windig') , '5,6' => array('bewölkt', 'kühl bei klarem Himmel', 'stark windig mit vereinzelten Regenschauern', 'aufgelockert und etwas wärmer') , '7,8' => array('warm und schwül', 'sonnig und heiß', 'warm mit Sommergewitter', 'sehr, sehr heiß') , '9,10' => array('sehr warm', 'stark windig, aber warm', 'regnerisch mit Gewitterstürmen', 'kühl', 'windig und frisch') , '11,12' => array('kalt', 'bewölkt bei leichtem Schneefall', 'kalt bei flockigem Weihnachtsschneefall', 'kalt bei Schneeregen', 'saukalt bei klarem Himmel') ); $clouds = $weather[$date[1].','.(++$date[1])]; shuffle($clouds); savesetting('weather', current($clouds)); ?>[/php] |
Autor: | vernisage [ Fr 23 Nov, 2007 17:17 ] |
Betreff des Beitrags: | |
Kann ich für jeweils die beiden letzten Schnippsel anstelle von 'gamedate' auch nur Eli's 'date' nehmen? Weil ich das ja auf die RealLife Monate übernehmen möchte und nicht auf die Monate, die im Spiel ablaufen. |
Autor: | Eliwood [ Fr 23 Nov, 2007 18:49 ] |
Betreff des Beitrags: | |
Sagte ich ja ^^ [php]<?php $date = date('m'); $weather = array( '1,2' => array('kalt mit Schneefall', 'klirrend kalt bei klarem Himmel, kalt mit Schneegestöber') , '3,4' => array('regnerisch', 'neblig', 'windig') , '5,6' => array('bewölkt', 'kühl bei klarem Himmel', 'stark windig mit vereinzelten Regenschauern', 'aufgelockert und etwas wärmer') , '7,8' => array('warm und schwül', 'sonnig und heiß', 'warm mit Sommergewitter', 'sehr, sehr heiß') , '9,10' => array('sehr warm', 'stark windig, aber warm', 'regnerisch mit Gewitterstürmen', 'kühl', 'windig und frisch') , '11,12' => array('kalt', 'bewölkt bei leichtem Schneefall', 'kalt bei flockigem Weihnachtsschneefall', 'kalt bei Schneeregen', 'saukalt bei klarem Himmel') ); $clouds = $weather[$date.','.(++$date)]; shuffle($clouds); savesetting('weather', current($clouds)); ?>[/php] |
Autor: | vernisage [ Mi 28 Nov, 2007 14:43 ] |
Betreff des Beitrags: | |
*gna* Ich wollte gerne, dass dennoch pro Spieltag das Wetter wechselt (nach realen Monaten aufgegliedert) und nicht nur am tatsächlichen nächsten Tag. Geht das? Hatte nämlich jetzt Eli's Version mit meinen Wetterbeschreibungen genommen und am neuen Spieltag war noch das Wetter vom Vorspieltag. Hab jetzt Morpheus Komplex (mit meinen Wetterbeschreibungen) eingesetzt und warte auf die nächste Session. |
Autor: | Eliwood [ Mi 28 Nov, 2007 16:55 ] |
Betreff des Beitrags: | |
vernisage hat geschrieben: Hatte nämlich jetzt Eli's Version mit meinen Wetterbeschreibungen genommen und am neuen Spieltag war noch das Wetter vom Vorspieltag.
Nur so: Wenn der Zufall es will, kann es auch sein, dass auf zwei Tagen das gleiche Wetter kommt ![]() Wenn du meine erste Version genommen hast, kann es auch sein, dass du versehentlich den Speicherpunkt überschrieben hast, oder aber dass sich meine Variablen von deinen Unterscheiden. Prinzipell funktioniert es - zumindest bei mir (Apache 2.2.4, PHP 5.2.3) |
Autor: | vernisage [ Mi 28 Nov, 2007 20:19 ] |
Betreff des Beitrags: | |
Hm, also mein Wetter ist unverändert. Als ich die Änderungen hochgeladen habe, stand das Wetter auf "windig". Aber in meiner Variable für den Monat 11 gibt es jetzt kein "windig" mehr. Derzeit habe ich noch in der setnewday die Variante von Morpheus drin, die so anfängt: [php]$date = getsetting('date','m'); $date = explode('-',$date); $monat = $date[1]; if (($monat == 1) || ($monat == 2) || ($monat == 12)) { switch(e_rand(1,7)) { case 1: $clouds = "Kalt bei klarem Himmel"; break; case 2: $clouds = "Schneeregen"; break; case 3: $clouds = "Kalt und frostig bei heftigem Wind"; break; ...... [/php] Bei deiner: [php]$date = date('m'); $weather = array( '1,2,12' => array('Kalt bei klarem Himmel', 'Schneeregen', 'Kalt und frostig bei heftigem Wind', 'Lockerer Schneefall', 'Klirrend kalt bei klarem Himmel', 'Schneegestöber', 'Winterlich mit Schneefall') ...... [/php] blieb das Wetter auch auf "windig" . (Hab nicht alle Monate hier nun aufgelistet) Sieht es so aus, als würde es nicht gehen? |
Autor: | Eliwood [ Do 29 Nov, 2007 20:40 ] |
Betreff des Beitrags: | |
vernisage hat geschrieben: [php]$date = getsetting('date','m'); $date = explode('-',$date); $monat = $date[1]; [/php] Da ist schon der erste Fehler. Selbstverständlich gibt e kein setting mit Namen "date". [php]$monat = date('m');[/php] vernisage hat geschrieben: [php]$date = date('m');
$weather = array( '1,2,12' => array('Kalt bei klarem Himmel', 'Schneeregen', 'Kalt und frostig bei heftigem Wind', 'Lockerer Schneefall', 'Klirrend kalt bei klarem Himmel', 'Schneegestöber', 'Winterlich mit Schneefall')[/php] Wieder logisch, dass das nicht geht. Leider ist das n' C&P-Fehler, den ich von Kevz übernommen habe. Leider kann ich nicht einmal rekonstruieren, wie das Kevz gemeint hat - nun gut. So in etwa könnte das ganze funktionieren: [php] $date = date('m'); $weathertypes = array( 'winter' => array('kalt mit Schneefall', 'klirrend kalt bei klarem Himmel', 'kalt mit Schneegestöber'), # Typus 1. "Winter". 'summer' => array('warm und schwül', 'sonnig und heiss', 'warm mit Sommergewitter', 'sehr, sehr heiss'), ); $weather = array( # monatszahl => Typus 1 => 'winter', 2 => 'winter', 6 => 'summer', 7 => 'summer', 8 => 'summer', 12 => 'winter', ); $clouds = $weathertypes[$weather[$date]]; $nowcloud = $clous[mt_rand(0, count($clouds)-1)]; savesetting('weather', $nowcloud); [/php] Edit: Selbstverständlich müssen bei mir alle Monate abgedeckt werden - aus Faulheit hab ich nun Herbst und Frühling ausser acht gelassen. Mit der Methode lässt sich sogar feiner - also nach allen 12 Monaten - trennen. Die Funktionalität müsste ersichtlich sein. Pro Wettertyp sind - selbstredend - beliebig viele Wetter erlaubt. |
Autor: | Morpheus [ Fr 30 Nov, 2007 05:37 ] |
Betreff des Beitrags: | |
vernisage hat geschrieben: Hm, also mein Wetter ist unverändert.
Als ich die Änderungen hochgeladen habe, stand das Wetter auf "windig". Aber in meiner Variable für den Monat 11 gibt es jetzt kein "windig" mehr. Derzeit habe ich noch in der setnewday die Variante von Morpheus drin, die so anfängt: [php]$date = getsetting('date','m'); $date = explode('-',$date); $monat = $date[1]; if (($monat == 1) || ($monat == 2) || ($monat == 12)) { switch(e_rand(1,7)) { case 1: $clouds = "Kalt bei klarem Himmel"; break; case 2: $clouds = "Schneeregen"; break; case 3: $clouds = "Kalt und frostig bei heftigem Wind"; break; ...... [/php] Bei deiner: [php]$date = date('m'); $weather = array( '1,2,12' => array('Kalt bei klarem Himmel', 'Schneeregen', 'Kalt und frostig bei heftigem Wind', 'Lockerer Schneefall', 'Klirrend kalt bei klarem Himmel', 'Schneegestöber', 'Winterlich mit Schneefall') ...... [/php] blieb das Wetter auch auf "windig" . (Hab nicht alle Monate hier nun aufgelistet) Sieht es so aus, als würde es nicht gehen? *Hüstel* für falschen Einbau kann ich auch nichs, denn wenn Du noch mal eine Seite zurück gehst, wirst Du sehen, meine Variante beginnt so: $this->bbcode_second_pass_code('', ' //Wettermod by Nyx $date = getsetting('gamedate','0000-01-01'); $date = explode('-',$date); $monat = $date[1]; ') ![]() |
Seite 1 von 2 | Alle Zeiten sind UTC + 1 Stunde |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |