123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166 |
- <?php
- // starten van een sessie om een aantal variabelen bij te houden
- // voor de duur van het spel
- session_start();
- ?>
- <html>
-
-
- <body>
-
- <h1>Battleships</h1>
- <form method="POST">
- Shot: <input name="shot" /><br />
- <input type="submit" />
- </form>
- <pre><?php
-
- // <pre></pre> = teken wat tussen deze tags staat letterlijk. Zoniet, zal de browser dit als HTML beschouwen. Zie lessen HTML
- // Spel opzetten, de grootte van het speelveld is 100 op 1
- $fieldSizeX = 100;
- $fieldSizeY = 1;
- $subSize = floor($fieldSizeX / 3);
-
-
- // Als de sessie de key "subPosition" NIET bevat,
- // dan moeten we een nieuw spel starten
- if (!isset($_SESSION["subPosition"])) {
- $subPosition = rand(1, $fieldSizeX);
- // stockeer de positie van de duikboot in de sessie
- $_SESSION["subPosition"] = $subPosition;
- $positionsFired = array();
-
- // Onderstaande lijn is in feite overbodig. Waarom?
- // deze is op de vorige lijn nog maar net aangemaakt dus deze is altijd leeg
- $_SESSION['positionsFired'] = $positionsFired;
- $ammo = floor($fieldSizeX / 2);
- // stockeer ammo in de sessie
- $_SESSION['ammo'] = $ammo;
- $hits = array();
- $_SESSION['hits'] = $hits;
-
-
- } else {
- // vraag de variabelen op uit de sessie
- $subPosition = $_SESSION["subPosition"];
- $positionsFired = $_SESSION["positionsFired"];
- $ammo = $_SESSION['ammo'];
- $hits = $_SESSION['hits'];
- }
-
-
- $subHead = $subPosition - (ceil($subSize/2)-1);
- $subTail = $subPosition + floor($subSize/2);
-
- $won = false;
- $lost = false;
-
- // $_POST is een associative array die de input van de gebruiker (formulier) bevat.
- $shot = $_POST['shot'];
- // Verminder de ammo met 1
- if ($shot) {
- $ammo = $ammo - 1;
- }
-
- // Raak? Goed bezig!
- if ($shot >= $subHead && $shot <= $subTail && !in_array($shot,$hits)) {
- array_push($hits,$shot);
- }
- //hou de nieuwe $hits bij in de sessie
- $_SESSION['hits'] = $hits;
-
- echo "ammo left:" . $ammo . '<br/>';
- // hou de nieuwe ammo bij in de sessie
- $_SESSION['ammo'] = $ammo;
- // Voeg het schot toe aan de lijst met reeds uitgevoerde schoten, en stockeer in sessie
- array_push($positionsFired, $shot);
- $_SESSION['positionsFired'] = $positionsFired;
-
-
-
- //alles geraakt? gewonnen!
- //kop van de duikboot valt onder "|"
- if ($subHead == 0 && count($hits) == $subSize -1 ){
- $won = true;
- }
- // kop van de duikboot valt links buiten het veld
- elseif($subHead < 0 && count($hits) == $subSize - ($subHead*-1)-1){
- $won = true;
- }
- //staart van de duikboot valt onder "|"
- elseif($subTail == $fieldSizeX +1 && count($hits) == $subSize -1){
- $won = true;
- }
- // staart van de duikboot valt rechts buiten het veld
- elseif($subTail > $fieldSizeX + 1 && count($hits) == $subSize - ($subTail - ($fieldSizeX +1))-1){
- $won = true;
- }
- // indien alles normaal verloopt
- elseif(count($hits) == $subSize){
- $won = true;
- }
- // Geen ammo meer en ook niet gewonnen (laatste schot kan raak zijn)? Verloren!
- if ($ammo == 0 && !$won) {
- $lost = true;
- }
-
-
- // Teken het speelbord.
-
- // Voor elke rij (van 0 tot Y + 1)
- for ($y = 0; $y <= $fieldSizeY + 1; ++$y) {
- //Create the upper and lower border
- if ($y == 0 || $y == $fieldSizeY + 1) {
- for ($i = 0; $i <= $fieldSizeX + 1; ++$i) {
- if ($i == 0 || $i == $fieldSizeX + 1) {
- echo '+';
- } else echo '-';
- }
- }
- //Create the center rows
- else {
- echo '|';
- // Voor elke kolom, van 1 tot de lengte van het X
- for ($x = 1; $x <= $fieldSizeX; ++$x) {
- // Als gewonnen, teken de duikboot.
- if ($won && $x == $subHead - 1) { //Begin met de < voor de duikbootpositie.
- echo '<';
-
- } elseif ($won && $x == $subTail + 1) { // en de laatste positie
- echo '>';
- }
- else {
- if (in_array($x, $positionsFired)) { //Teken de schoten
- if ($x >= $subHead && $x <= $subTail) { // Duikboot geraakt?
- echo "#";
- } else { // gemist schot
- echo "x";
- }
- } else { // geen schot, gewoon een spatie
- echo " ";
- }
- }
- }
- echo '|';
- }
- echo "<br/>";
- }
-
- // Opruiming bij het einde van het spel
- if ($won) {
- echo "<h1>You have won!</h1>";
- session_unset(); // Sessie leegmaken
- session_destroy(); // en sessie verwijderen
- }
- if ($lost) {
- echo "<h1>You have lost!</h1>";
- session_unset();
- session_destroy();
- }
-
-
- ?>
- </pre>
- </body>
-
- </html
|