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