Diferència entre revisions de la pàgina «Batalla naval en PHP»
		
		
		
		
		
		
		Salta a la navegació
		Salta a la cerca
		
				
		
		
		
		
		
		
		
	
| Línia 14: | Línia 14: | ||
== Disseny ==  | == Disseny ==  | ||
| − | [[Fitxer:batalla_naval1.png|dreta|thumb]]  | + | [[Fitxer:batalla_naval1.png|dreta|thumb|Batalla amb sessions PHP]]  | 
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.  | ||
| Línia 20: | Línia 20: | ||
[[Fitxer:batalla_naval2.png|350px]]  | [[Fitxer:batalla_naval2.png|350px]]  | ||
| + | |||
| + | La batalla sense sessions ens obliga a utilitzar un formulari per poder arrossegar el valor de les caselles dins de $_POST.  | ||
<br>  | <br>  | ||
Revisió del 17:29, 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.
 
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
...

