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
...