In diesem Teil werden wir erstmal nichts neues lernen, sondern mit unserer Klasse „Raumschiff_fabrik“ und unseren Objekten rumspielen. Dazu erstellen wir ein kleines Pseudo-Spiel:
Unsere Raumschiffabrik produziert am Anfang des Spiels zwei Raumschiffe. Diese fliegen 10 Runden (Schleifendurchläufe) durch den Raum und haben in jeder Runde eine 33% Wahrscheinlichkeit von einem zufällig großen Asteroiden getroffen zu werden (Größe der Asteroiden = zufällig, zwischen 1-10). In jeder Runde wird geprüft ob eines der beiden Raumschiffe getroffen wurde, welches Raumschiff getroffen wurde (name), die Größe des Asteroiden und wieviel Leben noch für das jeweilige Raumschiff übrig ist.
Am Ende der 10 Runden wird dann geprüft ob die beiden Raumschiffe noch funktionstüchtig sind und mit wieviel Leben sie davongekommen sind.
Lazy Space Wars I – Code
(den folgenden Quellcode kannst du so komplett in eine PHP-Datei packen und ausführen):
<?php class Raumschiff_fabrik { public $geschwindigkeit = 5; public $schild = 3; public $leben = 10; public $name; public function setName($neuer_name) { $this->name = $neuer_name; } public function treffer($schaden) { //prüfe ob der Asteroid unser Schutzschild durchschlagen hat if($this->schild < $schaden) { //berechen wieviel Schaden trotz des Schilds entsteht $rest_schaden = $schaden - $this->schild; $this->leben -= $rest_schaden; if($this->leben <= 0) { $this->leben = 0; } } } public function status() { if($this->leben > 0) { return 'Leben: '.$this->leben; } else { return 'zerstoert'; } } } $schiff1 = new Raumschiff_fabrik(); $schiff2 = new Raumschiff_fabrik(); $schiff1->setName('Anubis'); $schiff2->setName('Cherti'); $runde = 1; // unser Pseudo-Spiel soll 10 Runden dauern while($runde <= 10) { echo '<strong>Runde'.$runde.'</strong><br />'; // erzeuge einen zufälligen Asteroiden $asteroid = rand(1, 10); // Schiff1: prüfe Kollision (Wahrscheinlichkeit 33%), ziehe Leben ab if($schiff1->leben > 0) { if(rand(1,3) == 1) { $schiff1->treffer($asteroid); echo $schiff1->name.' wurde getroffen. Asteroid: '.$asteroid.' - Leben: '.$schiff1->leben.'<br />'; } } // Schiff2: prüfe Kollision (Wahrscheinlichkeit 33%), ziehe Leben ab if($schiff2->leben > 0) { if(rand(1,3) == 1) { $schiff2->treffer($asteroid); echo $schiff2->name.' wurde getroffen. Asteroid: '.$asteroid.' - Leben: '.$schiff2->leben.'<br />'; } } echo '<br />'; // nächste Runde $runde++; } echo '<hr />'; //Gib nach den 10 Runden den Status beider Schiffe aus echo 'Raumschiff "'.$schiff1->name.'" - '.$schiff1->status()."<br />"; echo 'Raumschiff "'.$schiff2->name.'" - '.$schiff2->status(); ?>
Erklärung:
In der Klasse „Raumschiff_fabrik“ ist eine weitere Methode hinzugekommen:
public function status() { if($this->leben > 0) { return 'Leben: '.$this->leben; } else { return 'zerstoert'; } }
Diese Methode ist einfach nur dafür da am Ende der 10 Runden den Status der Schiffe abzurufen.
Nach der Deklaration der Klasse „Raumschiff_fabrik“ erstellen wir mithilfe der Klasse zwei Raumschiffe und geben jedem Schiff einen eigenen Namen:
$schiff1 = new Raumschiff_fabrik(); $schiff2 = new Raumschiff_fabrik(); $schiff1->setName('Anubis'); $schiff2->setName('Cherti');
Nun folgt das eigentliche Spiel.
Lazy Space Wars I – Gameloop (Spielschleife)
$runde = 1; // unser Pseudo-Spiel soll 10 Runden dauern while($runde <= 10) { echo '<strong>Runde'.$runde.'</strong><br />'; // erzeuge einen zufälligen Asteroiden $asteroid = rand(1, 10); // Schiff1: prüfe Kollision (Wahrscheinlichkeit 33%), ziehe Leben ab if($schiff1->leben > 0) { if(rand(1,3) == 1) { $schiff1->treffer($asteroid); echo $schiff1->name.' wurde getroffen. Asteroid: '.$asteroid.' - Leben: '.$schiff1->leben.'<br />'; } } // Schiff2: prüfe Kollision (Wahrscheinlichkeit 33%), ziehe Leben ab if($schiff2->leben > 0) { if(rand(1,3) == 1) { $schiff2->treffer($asteroid); echo $schiff2->name.' wurde getroffen. Asteroid: '.$asteroid.' - Leben: '.$schiff2->leben.'<br />'; } } echo '<br />'; // nächste Runde $runde++; } echo '<hr />'; //Gib nach den 10 Runden den Status beider Schiffe aus echo 'Raumschiff "'.$schiff1->name.'" - '.$schiff1->status()."<br />"; echo 'Raumschiff "'.$schiff2->name.'" - '.$schiff2->status();
Erklärung:
Die while-Schleife soll 10x mal laufen, am Ende der Schleife wird der Zähler „$runde“ +1 hochgesetzt. Am Anfang jeder Runde wird ein neuer Asteroid erzeugt:
$asteroid = rand(1, 10);
Die Stärke des Asteroiden ist zufällig, ein Wert zwischen 1-3 wird dem Schiff keinen Schaden zufügen (der Asteroid muss stärker als das Schutzschild sein um dem Schiff Schaden zuzufügen).
Als nächstes wird geprüft ob der Asteroid das Schiff trifft:
// Schiff1: prüfe Kollision (Wahrscheinlichkeit 33%), ziehe Leben ab if($schiff1->leben > 0) { if(rand(1,3) == 1) { $schiff1->treffer($asteroid); echo $schiff1->name.' wurde getroffen. Asteroid: '.$asteroid.' - Leben: '.$schiff1->leben.'<br />'; } }
Es besteht eine 33% Wahrscheinlichkeit, dass der Asteroid trifft
rand(1,3) == 1
In diesem Fall wird die Stärke des Asteroiden an unsere Methode „treffer“ weitergegeben. Der Restschaden des Asteroiden wird vom Leben des Schiffs abgezogen. Ein Asteroid der Größe 5 verursacht 2 Schaden (Schutzschild hat die Stärke 3). Wenn das Schiff getroffen wurde wird eine Benachrichtigung ausgegeben.
Am Ende der Spielschleife wird das Ergebnis ausgegeben:
//Gib nach den 10 Runden den Status beider Schiffe aus echo 'Raumschiff "'.$schiff1->name.'" - '.$schiff1->status()."<br />"; echo 'Raumschiff "'.$schiff2->name.'" - '.$schiff2->status();
Dort können wir feststellen ob eines oder beiden Schiffe zerstört wurde und wieviel Rest-Leben die noch funktionstüchtigen Schiffe haben.
Bei jeder Ausführung des „Spiels“ wirst du ein anderes Ergebnis erhalten. In meinem Fall sah das Ergebnis folgendermaßen aus:
Runde1 Runde2 Runde3 Cherti wurde getroffen. Asteroid: 1 - Leben: 10 Runde4 Anubis wurde getroffen. Asteroid: 7 - Leben: 6 Cherti wurde getroffen. Asteroid: 7 - Leben: 6 Runde5 Runde6 Anubis wurde getroffen. Asteroid: 2 - Leben: 6 Runde7 Runde8 Anubis wurde getroffen. Asteroid: 2 - Leben: 6 Runde9 Cherti wurde getroffen. Asteroid: 6 - Leben: 3 Runde10 Cherti wurde getroffen. Asteroid: 6 - Leben: 0 Raumschiff "Anubis" - Leben: 6 Raumschiff "Cherti" - zerstoert
Natürlich ist dies kein richtiges Spiel aber ich hoffe dieses kleine, anschauliche Beispiel hat dir die Funktionsweise unserer bisherigen Klasse etwas nähergebracht :)