Diferència entre revisions de la pàgina «Batalla naval en PHP»
Salta a la navegació
Salta a la cerca
| Línia 20: | Línia 20: | ||
== Implementació sense sessions i formulari gegant == | == Implementació sense sessions i formulari gegant == | ||
| − | ... | + | |
| + | === Arxiu principal === | ||
| + | <syntaxhighlight lang="php"> | ||
| + | <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> | ||
| + | </syntaxhighlight> | ||
| + | |||
| + | === Arxius batalla_funcions.php === | ||
| + | <syntaxhighlight lang="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"]); | ||
| + | } | ||
| + | |||
| + | ?> | ||
| + | </syntaxhighlight> | ||
| + | |||
<br> | <br> | ||
== Implementació amb sessions == | == Implementació amb sessions == | ||
... | ... | ||
Revisió del 16:07, 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:
- Utiltizant sessions: és la única manera de poder fer una partida amb vaixells col·locats aleatòriament.
- Sense sessions: només podrem fer una partida fixa, i podem arrossegar els valors de la partida amb un formulari amb checkboxes.
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>
Arxius 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
...