Diferència entre revisions de la pàgina «Batalla naval en PHP»
Salta a la navegació
Salta a la cerca
Línia 17: | Línia 17: | ||
Contemplem dues estratègies: | Contemplem dues estratègies: | ||
* '''Amb sessions''': és la única manera de poder fer una partida amb vaixells col·locats aleatòriament i amb botons. | * '''Amb sessions''': és la única manera de poder fer una partida amb vaixells col·locats aleatòriament i amb botons. | ||
− | * '''Sense sessions''': només podrem fer una partida fixa, i per arrossegar els valors de la partida caldrà un formulari amb checkboxes. | + | * '''Sense sessions''': només podrem fer una partida fixa, i per arrossegar els valors de la partida caldrà un formulari amb checkboxes (podria també ser un ''select'' o desplegable). |
[[Fitxer:batalla_naval2.png|350px]] | [[Fitxer:batalla_naval2.png|350px]] |
Revisió del 17:30, 25 oct 2016
Anem a fer un joc de batalla naval en PHP.
Contingut
Requeriments
- El servidor tindrà una partida emmagatzemada (fixa o aleatòria)
- L'usuari anirà destapant els quadres. El servidor, depenent de l'entrada de l'usuari, hi pintarà:
- si es troba una vaixell hi pintarà una "X"
- si no n'hi ha, pintarà aigua "~"
- S'han d'acumular els quadres destapats.
- Cal de desactivar els quadres ja destapats perquè l'usuari no els torni a enviar.
- Cal comprovar el final de partida (tots els vaixells enfonsats) amb la funció final_de_partida()
- Donarem la puntuació a l'usuari (nombre d'intents totals realitzats).
Disseny
Contemplem dues estratègies:
- Amb sessions: és la única manera de poder fer una partida amb vaixells col·locats aleatòriament i amb botons.
- Sense sessions: només podrem fer una partida fixa, i per arrossegar els valors de la partida caldrà un formulari amb checkboxes (podria també ser un select o desplegable).
La batalla sense sessions ens obliga a utilitzar un formulari per poder arrossegar el valor de les caselles dins de $_POST.
Implementació sense sessions i formulari gegant
Arxiu principal
<html>
<head>
<style>
td {
width: 2em;
height: 2em;
text-align: center;
}
.aigua {
background-color: blue;
}
.tocat {
background-color: red;
}
</style>
</head>
<body>
<h1>Batalla naval sense sessions</h1>
<?php //if(isset($_POST["shootme"])) print_r($_POST["shootme"]); ?>
<form method="post">
<table>
<?php
require('batalla_funcions.php');
// vaixells predefinits o "hardcoded"
$vaixells = array( "12", "13", // 1 vaixell de 2 posicions
"35", "45", "55" // 1 vaixell de 3 posicions
);
// pintem tauler i ens retorna el nº de vaixells tocats
$tocats = pinta_tauler($vaixells);
?>
</table>
<input type="submit" />
</form>
<?php
if( $tocats==count($vaixells) ) {
echo "<p>FELICITATS! Has destruit tota la flota enemiga!</p>\n";
echo "<p>Puntuació: ".puntuacio()."</p>\n";
}
?>
</body>
</html>
Arxiu batalla_funcions.php
<?php
function pinta_tauler( $vaixells ) {
$tocats = 0;
// doble bucle per fer files (i) i columnes (j)
for( $i=0; $i<=8; $i++ ) {
echo "<tr>\n";
for( $j=0; $j<=8; $j++ ) {
$estilcss = "";
$contingut = "";
$checked = "";
$readonly = "";
if( $i==0 )
// pintem nº de columna
$contingut = "$j";
elseif( $j==0 )
// pintem nº de fila
$contingut = "$i";
else {
if( isset($_POST["shootme"]) ) {
// revisem si la cel·la actual $i$j esta a l'array de vaixells
if( in_array("$i$j",$vaixells) && in_array("$i$j",$_POST["shootme"]) ) {
// tocat!!
$estilcss = "tocat";
$checked = "checked";
// cal posar readonly (i no disabled) per bloquejar la casella
$readonly = "readonly";
$tocats++;
}
elseif( in_array("$i$j",$_POST["shootme"]) ) {
// aigua!!
$estilcss = "aigua";
$checked = "checked";
$readonly = "readonly";
}
// si no està a $_POST es que no hem disparat
}
// pintem formulari
$contingut .= "<input type='checkbox' name='shootme[]' value='$i$j' $checked $readonly />";
}
echo "<td class='$estilcss'>$contingut</td>\n";
}
echo "</tr>\n";
}
return $tocats;
}
function puntuacio() {
if( !isset($_POST["shootme"]) )
return 0;
return count($_POST["shootme"]);
}
?>
Implementació amb sessions
...