Ik ben net begonnen met de opleiding ICT Applicatieontwikkelaar, maar omdat mijn leraar de indruk heeft dat ik al verder ben qua stof dan mijn klasgenoten, kreeg ik een aparte opdracht. Deze opdracht houdt in het maken van een hoger/lager spel, met highscore-functie. Hierbij mag geen database worden gebruikt. Het hoger/lager spel heb ik inmiddels klaar, maar ik vroeg me af hoe ik de highscore-functie het beste kan bouwen.
Zelf dacht ik hierbij aan een array, maar ik weet dan weer niet hoe ik bijvoorbeeld een sessie in een array kan opslaan. Kunnen jullie me hierbij helpen?

index.php

<?php
session_start();
if($_SESSION["name"])
    header("Location:play.php");
?>
<!DOCTYPE html>
<html>
    <head>
        <title>HogerLager</title>
        <meta charset="UTF-8">
    </head>
    <body>
        <h1>HogerLager</h1>
        <h2>Voer uw naam in</h2>
        <form action="play.php" method="POST">
            <input type="text" name="name">
            <input type="submit" name="savename" value="Spelen!">
        </form>
    </body>
</html>


play.php

<?php
session_start();
if($_POST["name"]&&!$_SESSION["name"])
    $_SESSION["name"]=$_POST["name"];
elseif(!$_POST["name"]&&!$_SESSION["name"])
    header("Location:index.php");
if(!$_SESSION["numb"])
    $_SESSION["numb"]=rand(1,1000);
?>
<!DOCTYPE html>
<html>
    <head>
        <title>HogerLager</title>
        <meta charset="UTF-8">
    </head>
    <body>
        <h1>HogerLager</h1>
        <h2>Kies een cijfer (van 1 tot 1000)</h2>
        <h3>Now Playing: <?php echo $_SESSION["name"]; ?> | <a href="clear.php">Opnieuw</a></h3>
        <h4>Status</h4>
        <p><?php if($_POST["name"]){echo "Invoer speler: ".$_POST["name"]." | ";} ?>Sessie cijfer: <?php echo $_SESSION["numb"]; ?> | Sessie speler: <?php echo $_SESSION["name"]; ?></p>
        <form action="try.php" method="POST">
            <input type="text" name="value">
            <input type="submit" name="savename" value="Spelen!">
        </form>
    </body>
</html>


try.php

<?php
session_start();
if(!$_SESSION["name"])
    header("Location:index.php");
if(!$_SESSION["numb"])
    header("Location:play.php");
if(!$_SESSION["try"])
    $_SESSION["try"]=1;
else
    $_SESSION["try"]=$_SESSION["try"]+1;
?>
<!DOCTYPE html>
<html>
    <head>
        <title>HogerLager</title>
        <meta charset="UTF-8">
    </head>
    <body>
        <h1>HogerLager</h1>
        <h2>U raadde: <?php echo $_POST["value"]; ?> (poging <?php echo $_SESSION["try"]; ?>)</h2>
        <?php
        if(!$_POST["value"]){
            $return="Voer een cijfer in. <a href=\"play.php\">Opnieuw</a>";
        }elseif($_POST["value"]>$_SESSION["numb"]){
            $return="Voer een lager cijfer in. <a href=\"play.php\">Opnieuw</a>";
        }elseif($_POST["value"]<$_SESSION["numb"]){
            $return="Voer een hoger cijfer in. <a href=\"play.php\">Opnieuw</a>";
        }elseif($_POST["value"]==$_SESSION["numb"]){
            if($_SESSION["try"]==1)
                $try="poging";
            else
                $try="pogingen";
            $return="GEFELICITEERD! U raadde ".$_SESSION["numb"]." in ".$_SESSION["try"]." ".$try.". <a href=\"highscores.php\">Highscores</a> | <a href=\"play.php\">Opnieuw</a>";
            unset($_SESSION["numb"]);
            unset($_SESSION["try"]);
        }
        ?>
        <h3><?php echo $return; ?></h3>
    </body>
</html>


clear.php

<?php
session_start();
unset($_SESSION["name"]);
header("Location:index.php");
?>
Hallo Mario

even voor ik over de array's ga beginnen: in alle drie je scripts ga je er van uit dat de $_POST array en de $_SESSION array de door jouw genoemde items bezitten terwijl dat niet zo hoeft te zijn. Je zult hierdoor absoluut foutmeldingen krijgen. even een voorbeeld uit play.php:
<?php
if($_POST["name"]&&!$_SESSION["name"])
{
// ...
}
?>
Ga je die pagina nu direct aanroepen (zonder dat er iets gePOST is) dan zul je foutmeldingen krijgen dat $_POST["name"] en $_SESSION["name"] niet bestaan.
(Ook al bestaat de $_POST array wel dan zal het element $_POST["name"] nog niet bestaan.)

Om dit uit te sluiten zul je eerst de functie isset() moeten gebruiken:
<?php
if(isset($_POST["name"]) && !isset($_SESSION["name"]))
{
// ...
}
?>


[size=xsmall]Toevoeging op 28/09/2014 19:39:35:[/size]

Vaak zie je ook een variant als deze:

<?php
if(isset($_POST["name"]) && strlen($_POST["name"]) != 0)
{
// $_POST["name"] bestaat en heeft een inhoud
}
?>

Hier wordt eerst eerst gecontroleerd of $_POST["name"] wel bestaat EN als die bestaat dan wordt er gekeken of hij wel inhoud en dus geen lege waarde heeft.

Een andere variant die precies hetzelfde doet:
<?php
if(isset($_POST["name"]) && $_POST["name"] != '')
{
// $_POST["name"] bestaat en heeft een inhoud
}
?>
Bedankt voor je reactie! Isset is mij bekend, maar ik ging ervan uit dat ik het script korter kon maken door dit weg te laten, en dat if($_POST["name"]) hetzelfde effect zou hebben. Maar dit is dus niet het geval? Van strlen heb ik nog niet gehoord, maar dat klinkt handig!
Heb je enig idee hoe ik de highscore-functie het beste kan maken?
Goed Array's. Begrijp ik goed dat je de highscore in de session wilt opslaan?
Realiseer je dan wel dat deze highscore enkel de highscore bijhoudt van één speler?
en ook dat na bepaalde tijd (een kwartier of een half uur) niet spelen de session data uitgewist is?

Als je geen database mag gebruiken dan blijft er alleen een mogelijkheid over om de highscore in een bestand op te slaan. Het nadeel hiervan is dat je voldoende schrijfrechten moet hebben op de server.
Een bestand heb ik inderdaad ook overwogen. Misschien is dat wel het handigste, alleen heb ik daar totaal geen ervaring mee.
Misschien moet ik me daar eens in verdiepen. Schrijfrechten zijn geen probleem aangezien we een eigen APACHE server hebben geïnstalleerd.
Test je eigen code maar. Zorg wel dat je error_reporting aan hebt staan.
<?php
error_reporting(-1);
ini_set('display_errors', 'On');
?>

[size=xsmall]Toevoeging op 28/09/2014 19:50:45:[/size]

De schrijfrechten kun je met chmod instellen. Ik adviseer om een aparte directory aan te maken waarin geschreven mag worden. als ik me niet vergis moet je die directory instellen op 755. daarna maak je in de directory een .htaccess bestand met de volgende inhoud:

allow deny all

Je directory is nu vanuit de browser niet meer toegankelijk

[size=xsmall]Toevoeging op 28/09/2014 19:59:28:[/size]

Ik ga er even vanuit dat je de naam en de highscore van bijvoorbeeld de tien hoogste spelers wilt onthouden.

je zou dan een array in JSON kunnen opslaan bijvoorbeeld.

(pretty cool huh?)

<?php
// eerst even een fake php array maken met highscores
$hs = array(
array(
'name' => 'Frank',
'highscore' => 10236
),
array(
'name' => 'Mario',
'highscore' => 10234
)
);

file_put_contents('/home/domein/directory/highscore.json', json_encode($hs));

?>


[size=xsmall]Toevoeging op 28/09/2014 20:02:10:[/size]

uitlezen gaat net andersom natuurlijk:
<?php
$hs = json_decode(file_get_contents('/home/domein/directory/highscore.json'));

// show us the entire array
echo '<pre>';
print_r($hs);
echo '</pre>';
Ik ben even bezig geweest, en dit is tot nu toe het resultaat. Dit is nog niet hoe het hoort, want er wordt maar één highscore in het bestand opgeslagen. Ik zou willen zien dat bij een nieuw spel, de volgende highscore gewoon op een nieuwe lijn in het bestand wordt opgeslagen.
Daarnaast wil ik de output anders weergeven, bij voorkeur in een tabel.
Maar we zitten op de goede weg, bedankt hiervoor :-)

Ik heb trouwens gewoon even het bestand highscores.json gebruikt, in dezelfde map. Kwam er niet helemaal uit met het pad, dus dit was even makkelijker.

index.php

<?php
error_reporting(-1);
ini_set("display_errors","On");
date_default_timezone_set("Europe/Amsterdam");
session_start();
if(isset($_SESSION["name"]))
    header("Location:play.php");
?>
<!DOCTYPE html>
<html>
    <head>
        <title>HogerLager</title>
        <meta charset="UTF-8">
    </head>
    <body>
        <h1>HogerLager</h1>
        <h2>Voer uw naam in</h2>
        <form action="play.php" method="POST">
            <input type="text" name="name">
            <input type="submit" name="savename" value="Spelen!">
        </form>
    </body>
</html>


play.php

<?php
error_reporting(-1);
ini_set("display_errors","On");
date_default_timezone_set("Europe/Amsterdam");
session_start();
if(isset($_POST["name"])&&!isset($_SESSION["name"]))
    $_SESSION["name"]=$_POST["name"];
elseif(!isset($_POST["name"])&&!isset($_SESSION["name"]))
    header("Location:index.php");
if(!isset($_SESSION["numb"]))
    $_SESSION["numb"]=rand(1,1000);
?>
<!DOCTYPE html>
<html>
    <head>
        <title>HogerLager</title>
        <meta charset="UTF-8">
    </head>
    <body>
        <h1>HogerLager</h1>
        <h2>Kies een cijfer (van 1 tot 1000)</h2>
        <h3>Now Playing: <?php echo $_SESSION["name"]; ?> | <a href="clear.php">Opnieuw</a></h3>
        <h4>Status</h4>
        <p><?php if(isset($_POST["name"])){echo "Invoer speler: ".$_POST["name"]." | ";} ?>Sessie cijfer: <?php echo $_SESSION["numb"]; ?> | Sessie speler: <?php echo $_SESSION["name"]; ?></p>
        <form action="try.php" method="POST">
            <input type="text" name="value">
            <input type="submit" name="savename" value="Spelen!">
        </form>
    </body>
</html>


try.php

<?php
error_reporting(-1);
ini_set("display_errors","On");
date_default_timezone_set("Europe/Amsterdam");
session_start();
if(!isset($_SESSION["name"]))
    header("Location:index.php");
if(!isset($_SESSION["numb"]))
    header("Location:play.php");
if(!isset($_SESSION["try"]))
    $_SESSION["try"]=1;
else
    $_SESSION["try"]=$_SESSION["try"]+1;
?>
<!DOCTYPE html>
<html>
    <head>
        <title>HogerLager</title>
        <meta charset="UTF-8">
    </head>
    <body>
        <h1>HogerLager</h1>
        <h2>U raadde: <?php echo $_POST["value"]; ?> (poging <?php echo $_SESSION["try"]; ?>)</h2>
        <?php
        if(!isset($_POST["value"])){
            $return="Voer een cijfer in. <a href=\"play.php\">Opnieuw</a>";
        }elseif($_POST["value"]>$_SESSION["numb"]){
            $return="Voer een lager cijfer in. <a href=\"play.php\">Opnieuw</a>";
        }elseif($_POST["value"]<$_SESSION["numb"]){
            $return="Voer een hoger cijfer in. <a href=\"play.php\">Opnieuw</a>";
        }elseif($_POST["value"]==$_SESSION["numb"]){
            if($_SESSION["try"]==1)
                $try="poging";
            else
                $try="pogingen";
            $return="GEFELICITEERD! U raadde ".$_SESSION["numb"]." in ".$_SESSION["try"]." ".$try.". <a href=\"highscores.php\">Highscores</a> | <a href=\"play.php\">Opnieuw</a>";
            $highscore=array("name"=>$_SESSION["name"],"score"=>$_SESSION["try"],"date"=>date("d-m-Y"));
            file_put_contents("highscores.json",json_encode($highscore));
            unset($_SESSION["numb"]);
            unset($_SESSION["try"]);
        }
        ?>
        <h3><?php echo $return; ?></h3>
    </body>
</html>


clear.php

<?php
error_reporting(-1);
ini_set("display_errors","On");
date_default_timezone_set("Europe/Amsterdam");
session_start();
if(isset($_SESSION["name"]))
    unset($_SESSION["name"]);
header("Location:index.php");
?>


highscores.php

<?php
error_reporting(-1);
ini_set("display_errors","On");
date_default_timezone_set("Europe/Amsterdam");
session_start();
?>
<!DOCTYPE html>
<html>
    <head>
        <title>HogerLager</title>
        <meta charset="UTF-8">
    </head>
    <body>
        <h1>HogerLager</h1>
        <h2>Highscores</h2>
        <h3>Waar staat u?</h3>
        <?php
        $highscores=json_decode(file_get_contents("highscores.json"));
        echo "<pre>";
        foreach($highscores as $value){
            echo $value." ";
        }
        echo "</pre>";
        ?>
        <a href="play.php">Speel nog een keer!</a>
    </body>
</html>
Oké om de array uit te breiden zul je in try.php de array eerst moeten inlezen. Daarna kun je simpel een nieuw element aan de array toevoegen. Het wordt dan trouwens een twee dimensionale array. Het lastigste is om de array te sorteren zodat de hoogste scores bovenin komen.

<?php
// hulp functie voor het sorteren van de array
function cmp($a, $b)
{
if($a['score'] > $b['score'])
return false;

return true;
}

// haal de highscores op die we tot nu toe hebben
$highscores = json_decode(file_get_contents("highscores.json"));

// voeg een element toe aan de array
$highscores[] = array(
"name" => $_SESSION["name"],
"score" => $_SESSION["try"],
"date" => date("d-m-Y")
);

// sorteer de array op volgorde van score van hoog naar laag
usort($highscores, 'cmp');

// hou maximaal de eerste tien elementen over en laat de rest vervallen
$highscores = array_slice($highscores, 0, 10);

// sla de scores weer op
file_put_contents("highscores.json", json_encode($highscore));

?>

[size=xsmall]Toevoeging op 29/09/2014 01:25:07:[/size]

in highscores.php zul je ook rekening moeten houden met een twee dimensionale array.

<?php
foreach($highscores as $rule) {
echo $rule['name'] . ' ' . $rule['score'] . ' ' . $rule['date'] . '<br>';
}
?>


[size=xsmall]Toevoeging op 29/09/2014 01:33:59:[/size]

Even een paar andere opmerkingen:

in al je bestanden hou je de php logica netjes bovenin en de html hou je onderin behalve in try.php en ook een heel klein beetje in highscores.php (in die laatste zou regel 18 omhoog moeten)

Zou je try.php willen verbeteren in dat opzicht?

Verder mag je je code best wat luchtiger opstellen. Laat hier en daar maar een lege regel over om aan te geven dat je aan een nieuw stukje code begint. ook mogen er best wat meer spaties in, vooral om de operators. Het maakt voor de snelheid niets uit.

Als laatste voorzie je code van commentaar. Leg uit wat de code doet voor je leraar maar ook voor jezelf later of voor anderen.
Zo, weer even een update. Ik heb 'm klaar in mijn ogen, alleen de logica achter de sorteerfunctie snap ik niet. Ik heb even gezocht op Google maar daar kwam ik niet de juiste sorteerfunctie tegen.
Tot nu toe dit:

index.php

<?php
/* HogerLager by Mario Braam */
// Turn error reporting on for development
error_reporting(-1);
ini_set("display_errors","On");
// Set timezone
date_default_timezone_set("Europe/Amsterdam");
// Start sessions
session_start();
// Check if playersession is set
if(isset($_SESSION["name"]))
    // If playersession is already set, redirect to the gamepage
    header("Location:play.php");
?>
<!DOCTYPE html>
<html>
    <head>
        <title>HogerLager</title>
        <meta charset="UTF-8">
    </head>
    <body>
        <h1>HogerLager</h1>
        <h2>Voer uw naam in</h2>
        <form action="play.php" method="POST">
            <input type="text" name="name">
            <input type="submit" name="savename" value="Spelen!">
        </form>
    </body>
</html>


play.php

<?php
/* HogerLager by Mario Braam */
// Turn error reporting on for development
error_reporting(-1);
ini_set("display_errors","On");
// Set timezone
date_default_timezone_set("Europe/Amsterdam");
// Start sessions
session_start();
// Check if the player has entered a name and the session does not already exist
if(isset($_POST["name"])&&!isset($_SESSION["name"]))
    // In this case, set the playersession
    $_SESSION["name"]=$_POST["name"];
// It's possible that the player visits this page directly, then we check if the playersession is set. Otherwise, redirect
elseif(!isset($_POST["name"])&&!isset($_SESSION["name"]))
    header("Location:index.php");
// If a valuesession hasn't been set already, create one with a random number
if(!isset($_SESSION["numb"]))
    $_SESSION["numb"]=rand(1,1000);
?>
<!DOCTYPE html>
<html>
    <head>
        <title>HogerLager</title>
        <meta charset="UTF-8">
    </head>
    <body>
        <h1>HogerLager</h1>
        <h2>Kies een cijfer (van 1 tot 1000)</h2>
        <h3>Now Playing: <?php echo $_SESSION["name"]; ?> | <a href="clear.php">Opnieuw</a></h3>
        <h4>Status</h4>
        <p><?php if(isset($_POST["name"])){echo "Invoer speler: ".$_POST["name"]." | ";} ?>Sessie cijfer: <?php echo $_SESSION["numb"]; ?> | Sessie speler: <?php echo $_SESSION["name"]; ?></p>
        <form action="try.php" method="POST">
            <input type="text" name="value">
            <input type="submit" name="savename" value="Spelen!">
        </form>
    </body>
</html>


try.php

<?php
/* HogerLager by Mario Braam */
// Turn error reporting on for development
error_reporting(-1);
ini_set("display_errors","On");
// Set timezone
date_default_timezone_set("Europe/Amsterdam");
// Start sessions
session_start();
// Check if playersession is set
if(!isset($_SESSION["name"]))
    // If it doesn't exist, redirect to playerpage
    header("Location:index.php");
// Check if numbersession is set
if(!isset($_SESSION["numb"]))
    // If it doesn't exist, redirect to gamepage
    header("Location:play.php");
// Check if attemptsession is set
if(!isset($_SESSION["try"]))
    // If it isn't, set to 1 (1 attempt)
    $_SESSION["try"]=1;
// Otherwise, count +1
else
    $_SESSION["try"]=$_SESSION["try"]+1;
?>
<!DOCTYPE html>
<html>
    <head>
        <title>HogerLager</title>
        <meta charset="UTF-8">
    </head>
    <body>
        <h1>HogerLager</h1>
        <h2>U raadde: <?php echo $_POST["value"]; ?> (poging <?php echo $_SESSION["try"]; ?>)</h2>
        <?php
        // Just to be sure, check if the player has entered a value
        if(!isset($_POST["value"])){
            $return="Voer een cijfer in. <a href=\"play.php\">Opnieuw</a>";
        // If he has, check if the entered value is higher than the value that's stored
        }elseif($_POST["value"]>$_SESSION["numb"]){
            $return="Voer een lager cijfer in. <a href=\"play.php\">Opnieuw</a>";
        // The entered value isn't higher, then it should be lower
        }elseif($_POST["value"]<$_SESSION["numb"]){
            $return="Voer een hoger cijfer in. <a href=\"play.php\">Opnieuw</a>";
        // What's this? It's a match! It must be a right attempt
        }elseif($_POST["value"]==$_SESSION["numb"]){
            // 1 attempt means we use a other word
            if($_SESSION["try"]==1)
                $try="poging";
            else
                $try="pogingen";
            // Congratulate the player and give him some information
            $return="GEFELICITEERD! U raadde ".$_SESSION["numb"]." in ".$_SESSION["try"]." ".$try.". <a href=\"highscores.php\">Highscores</a> | <a href=\"play.php\">Opnieuw</a>";
            // Grab the file
            $highscores=json_decode(file_get_contents("highscores.json"));
            // Create an array from the required information
            $highscores[]=array("name"=>$_SESSION["name"],"score"=>$_SESSION["try"],"datetime"=>date("d-m-Y H:i:s"));
            // Limit the arrays
            $highscores=array_slice($highscores,0,10);
            // And store it again!
            file_put_contents("highscores.json",json_encode($highscores));
            // Now all the informationprocessing is done, unset the sessions with the number of attempts and the value
            unset($_SESSION["numb"]);
            unset($_SESSION["try"]);
        }
        ?>
        <h3><?php echo $return; ?></h3>
    </body>
</html>


clear.php

<?php
/* HogerLager by Mario Braam */
// Turn error reporting on for development
error_reporting(-1);
ini_set("display_errors","On");
// Set timezone
date_default_timezone_set("Europe/Amsterdam");
// Start sessions
session_start();
// Check if playersession is set
if(isset($_SESSION["name"]))
    // If it does, unset
    unset($_SESSION["name"]);
// Now redirect
header("Location:index.php");
?>


highscores.php

<?php
/* HogerLager by Mario Braam */
// Turn error reporting on for development
error_reporting(-1);
ini_set("display_errors","On");
// Set timezone
date_default_timezone_set("Europe/Amsterdam");
// Start sessions
session_start();
?>
<!DOCTYPE html>
<html>
    <head>
        <title>HogerLager</title>
        <meta charset="UTF-8">
        <style>
            table{
                width:40%;
            }
            table th{
                text-align:left;
            }
        </style>
    </head>
    <body>
        <h1>HogerLager</h1>
        <h2>Highscores</h2>
        <h3>Waar staat u?</h3>
        <table>
            <tr>
                <th>Speler</th>
                <th>Pogingen</th>
                <th>Datum</th>
            </tr>
            <?php
            // Grab highscores from file
            $highscores=json_decode(file_get_contents("highscores.json"));
            // Turn the array into a clear table
            foreach($highscores as $value){
                echo "<tr>";
                echo "<td>".$value->name."</td>
                <td>".$value->score."</td>
                <td>".$value->datetime."</td>";
                echo "</tr>";
            }
            ?>
        </table>
        <p><a href="play.php">Speel opnieuw!</a></p>
    </body>
</html>


Ik heb er nu commentaar tussen geplaatst. Wat betreft de spaties en witruimte, dit is wat ik gewend ben haha.

[size=xsmall]Toevoeging op 29/09/2014 21:20:51:[/size]

Kleine aanpassing:


<?php
// Turn the array into a clear table
if(isset($highscores)){
    foreach($highscores as $value){
        echo "<tr>";
        echo "<td>".$value->name."</td>
        <td>".$value->score."</td>
        <td>".$value->datetime."</td>";
        echo "</tr>";
    }
}else{
    echo "<tr><td colspan=\"3\">Er zijn nog geen highscores!</td></tr>";
}
?>
over het sorteren:

de scores staan in een 2d array.

de primaire array bevat wederom array's

de primaire array heeft elementen van 0 tm ?
de secundaire array heeft drie elementen: score, name en date.

om nu de hele secundaire elementen te sorteren in de primaire array moeten we een 'eigen' sorteerfunctie gebruiken. Die functie heb ik 'cmp' genoemd, de afkorting van compare.

de functie cmp($a, $b) hoort dus bij usort('cmp');. Als je goed kijkt naar de functie 'cmp' dan zie je dat de scores vergeleken worden en dus wordt de hele array op de scores gesorteerd.

Stel dat je nou op naam zou willen sorteren dan moet er in die functie dus op naam en niet op score gesorteerd worden..

Ik hoop dat ik het zo wat verduidelijkt heb.
Ah oké, zo is het wel iets duidelijker. Ik heb even zitten rommelen, maar ondanks je uitleg kom ik er nog niet uit. Ik heb aan alle eisen voldaan, maar de sorteerfunctie doet het dus nog niet.

index.php

<?php
/* HogerLager by Mario Braam */
// Turn error reporting on for development
error_reporting(-1);
ini_set("display_errors","On");
// Set timezone
date_default_timezone_set("Europe/Amsterdam");
// Start sessions
session_start();
// Check if playersession is set
if(isset($_SESSION["name"]))
    // If playersession is already set, redirect to the gamepage
    header("Location:play.php");
?>
<!DOCTYPE html>
<html>
    <head>
        <title>HogerLager</title>
        <meta charset="UTF-8">
    </head>
    <body>
        <h1>HogerLager</h1>
        <h2>Voer uw naam in</h2>
        <form action="play.php" method="POST">
            <input type="text" name="name">
            <input type="submit" name="savename" value="Spelen!">
        </form>
    </body>
</html>


play.php

<?php
/* HogerLager by Mario Braam */
// Turn error reporting on for development
error_reporting(-1);
ini_set("display_errors","On");
// Set timezone
date_default_timezone_set("Europe/Amsterdam");
// Start sessions
session_start();
// Check if the player has entered a name and the session does not already exist
if(isset($_POST["name"])&&!isset($_SESSION["name"]))
    // In this case, set the playersession
    $_SESSION["name"]=$_POST["name"];
// It's possible that the player visits this page directly, then we check if the playersession is set. Otherwise, redirect
elseif(!isset($_POST["name"])&&!isset($_SESSION["name"]))
    header("Location:index.php");
// If a valuesession hasn't been set already, create one with a random number
if(!isset($_SESSION["numb"]))
    $_SESSION["numb"]=rand(1,1000);
?>
<!DOCTYPE html>
<html>
    <head>
        <title>HogerLager</title>
        <meta charset="UTF-8">
    </head>
    <body>
        <h1>HogerLager</h1>
        <h2>Kies een cijfer (van 1 tot 1000)</h2>
        <h3>Now Playing: <?php echo $_SESSION["name"]; ?> | <a href="clear.php">Opnieuw</a></h3>
        <h4>Status</h4>
        <p><?php if(isset($_POST["name"])){echo "Invoer speler: ".$_POST["name"]." | ";} ?>Sessie cijfer: <?php echo $_SESSION["numb"]; ?> | Sessie speler: <?php echo $_SESSION["name"]; ?></p>
        <form action="try.php" method="POST">
            <input type="number" name="value">
            <input type="submit" name="savename" value="Spelen!">
        </form>
    </body>
</html>


try.php

<?php
/* HogerLager by Mario Braam */
// Turn error reporting on for development
error_reporting(-1);
ini_set("display_errors","On");
// Set timezone
date_default_timezone_set("Europe/Amsterdam");
// Start sessions
session_start();
// Check if playersession is set
if(!isset($_SESSION["name"]))
    // If it doesn't exist, redirect to playerpage
    header("Location:index.php");
// Check if numbersession is set
if(!isset($_SESSION["numb"]))
    // If it doesn't exist, redirect to gamepage
    header("Location:play.php");
// Check if attemptsession is set
if(!isset($_SESSION["try"]))
    // If it isn't, set to 1 (1 attempt)
    $_SESSION["try"]=1;
// Otherwise, count +1
else
    $_SESSION["try"]=$_SESSION["try"]+1;
?>
<!DOCTYPE html>
<html>
    <head>
        <title>HogerLager</title>
        <meta charset="UTF-8">
    </head>
    <body>
        <h1>HogerLager</h1>
        <?php
        if(isset($_POST["value"])and is_numeric($_POST["value"])){
        ?>
        <h2>U raadde: <?php echo $_POST["value"]; ?> (poging <?php echo $_SESSION["try"]; ?>)</h2>
        <?php
        }
        // Just to be sure, check if the player has entered a value
        if(!isset($_POST["value"])or !is_numeric($_POST["value"])){
            $return="Voer een cijfer in. <a href=\"play.php\">Opnieuw</a>";
        // If he has, check if the entered value is higher than the value that's stored
        }elseif($_POST["value"]>$_SESSION["numb"]){
            $return="Voer een lager cijfer in. <a href=\"play.php\">Opnieuw</a>";
        // The entered value isn't higher, then it should be lower
        }elseif($_POST["value"]<$_SESSION["numb"]){
            $return="Voer een hoger cijfer in. <a href=\"play.php\">Opnieuw</a>";
        // What's this? It's a match! It must be a right attempt
        }elseif($_POST["value"]==$_SESSION["numb"]){
            // 1 attempt means we use a other word
            if($_SESSION["try"]==1)
                $try="poging";
            else
                $try="pogingen";
            // Congratulate the player and give him some information
            $return="GEFELICITEERD! U raadde ".$_SESSION["numb"]." in ".$_SESSION["try"]." ".$try.". <a href=\"highscores.php\">Highscores</a> | <a href=\"play.php\">Opnieuw</a>";
            // Grab the file
            $highscores=json_decode(file_get_contents("highscores.json"));
            // Create an array from the required information
            $highscores[]=array("name"=>$_SESSION["name"],"score"=>$_SESSION["try"],"datetime"=>date("d-m-Y H:i:s"));
            // Limit the arrays
            $highscores=array_slice($highscores,0,10);
            // And store it again!
            file_put_contents("highscores.json",json_encode($highscores));
            // Now all the informationprocessing is done, unset the sessions with the number of attempts and the value
            unset($_SESSION["numb"]);
            unset($_SESSION["try"]);
        }
        ?>
        <h3><?php echo $return; ?></h3>
    </body>
</html>


clear.php

<?php
/* HogerLager by Mario Braam */
// Turn error reporting on for development
error_reporting(-1);
ini_set("display_errors","On");
// Set timezone
date_default_timezone_set("Europe/Amsterdam");
// Start sessions
session_start();
// Check if playersession is set
if(isset($_SESSION["name"]))
    // If it does, unset
    unset($_SESSION["name"]);
// Now redirect
header("Location:index.php");
?>


highscores.php

<?php
/* HogerLager by Mario Braam */
// Turn error reporting on for development
error_reporting(-1);
ini_set("display_errors","On");
// Set timezone
date_default_timezone_set("Europe/Amsterdam");
// Start sessions
session_start();
function cmp($a,$b){
    if($a["score"]>$b["score"])
        return false;
    return true;
}
?>
<!DOCTYPE html>
<html>
    <head>
        <title>HogerLager</title>
        <meta charset="UTF-8">
        <style>
            table{
                width:40%;
            }
            table th{
                text-align:left;
            }
        </style>
    </head>
    <body>
        <h1>HogerLager</h1>
        <h2>Highscores</h2>
        <h3>Waar staat u?</h3>
        <table>
            <tr>
                <th>Speler</th>
                <th>Pogingen</th>
                <th>Datum</th>
            </tr>
            <?php
            // Grab highscores from file
            $highscores=json_decode(file_get_contents("highscores.json"));
            usort($highscores,"cmp");
            // Turn the array into a clear table
            if(isset($highscores)){
                foreach($highscores as $value){
                    echo "<tr>";
                    echo "<td>".$value->name."</td>
                    <td>".$value->score."</td>
                    <td>".$value->datetime."</td>";
                    echo "</tr>";
                }
            }else{
                echo "<tr><td colspan=\"3\">Er zijn nog geen highscores!</td></tr>";
            }
            ?>
        </table>
        <p><a href="play.php">Speel opnieuw!</a></p>
    </body>
</html>

Reageren